Improve style and usability of ImportAllTracks

Fix style issues pointed out in code review. Move acquireWakeLock method into
MyTracksUtils and call that from ImportAllTracks and ExportAllTracks. Replace
important Toast messages with dialogs.
This commit is contained in:
David Piggott
2011-02-14 10:53:37 +00:00
parent 59a05262a1
commit 0eb676d3cd
6 changed files with 162 additions and 183 deletions
@@ -15,32 +15,26 @@
*/
package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.io.GpxImporter;
import com.google.android.apps.mytracks.util.MyTracksUtils;
import com.google.android.maps.mytracks.R;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.util.Log;
import android.widget.Toast;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.io.GpxImporter;
import com.google.android.maps.mytracks.R;
/**
* A class that will import all GPX tracks in /sdcard/MyTracks/gpx/
*
@@ -51,7 +45,9 @@ public class ImportAllTracks {
private final Activity activity;
private WakeLock wakeLock;
private ProgressDialog progress;
private int gpxFileCandidateCount;
private int importSuccessCount;
public ImportAllTracks(Activity activity) {
this.activity = activity;
Log.i(MyTracksConstants.TAG, "ImportAllTracks: Starting");
@@ -83,21 +79,32 @@ public class ImportAllTracks {
prefs.getLong(activity.getString(R.string.recording_track_key), -1);
}
if (recordingTrackId != -1) {
acquireWakeLock();
wakeLock = MyTracksUtils.acquireWakeLock(activity, wakeLock);
}
// Now we can safely import everything.
importAll();
// Release the wake lock if we recorded one.
// Release the wake lock if we acquired one.
// TODO check what happens if we started recording after getting this lock.
if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release();
Log.i(MyTracksConstants.TAG, "ImportAllTracks: Releasing wake lock.");
}
Log.i(MyTracksConstants.TAG, "ImportAllTracks: Done");
Toast.makeText(activity, R.string.import_done, Toast.LENGTH_SHORT).show();
}
Log.i(MyTracksConstants.TAG, "ImportAllTracks: Done");
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
if (gpxFileCandidateCount == 0) {
builder.setMessage(activity.getString(R.string.import_empty,
MyTracksConstants.SDCARD_TOP_DIR));
} else {
builder.setMessage(activity.getString(R.string.import_done,
importSuccessCount, gpxFileCandidateCount,
MyTracksConstants.SDCARD_TOP_DIR));
}
builder.setPositiveButton(R.string.ok, null);
builder.show();
}
private void makeProgressDialog(final int trackCount) {
String importMsg = activity.getString(R.string.tracklist_btn_import_all);
@@ -114,112 +121,72 @@ public class ImportAllTracks {
* Actually import the tracks.
* This should be called after the wake locks have been acquired.
*/
private void importAll() {
try {
MyTracksProviderUtils providerUtils =
MyTracksProviderUtils.Factory.get(activity);
LinkedList<File> gpxFiles = new LinkedList<File>();
File[] gpxFileCandidates = new File("/sdcard/" + MyTracksConstants.SDCARD_TOP_DIR + "/gpx").listFiles();
if(gpxFileCandidates == null || gpxFileCandidates.length == 0) {
Toast.makeText(activity, activity.getString(R.string.import_empty), Toast.LENGTH_LONG).show();
return;
}
for (File file : gpxFileCandidates) {
if (!file.isDirectory() && file.getName().endsWith(".gpx")) {
gpxFiles.add(file);
}
}
final int trackCount = gpxFiles.size();
Log.i(MyTracksConstants.TAG,
"ImportAllTracks: Importing: " + trackCount + " tracks.");
activity.runOnUiThread(new Runnable() {
public void run() {
makeProgressDialog(trackCount);
}
});
Iterator<File> gpxFilesIterator = gpxFiles.iterator();
File currentFile;
int currentFileNumber = 0;
while(gpxFilesIterator.hasNext()) {
currentFile = gpxFilesIterator.next();
final int status = currentFileNumber;
activity.runOnUiThread(new Runnable() {
public void run() {
synchronized (this) {
if (progress == null) {
return;
}
progress.setProgress(status);
}
}
});
Log.i(MyTracksConstants.TAG, "ImportAllTracks: importing: " + currentFile.getName());
try {
GpxImporter.importGPXFile(new FileInputStream(currentFile), providerUtils);
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(activity, "FileNotFoundException", Toast.LENGTH_LONG).show();
} catch (ParserConfigurationException e) {
e.printStackTrace();
Toast.makeText(activity, "ParserConfigurationException", Toast.LENGTH_LONG).show();
} catch (SAXException e) {
e.printStackTrace();
Toast.makeText(activity, "SAXException", Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(activity, "IOException", Toast.LENGTH_LONG).show();
private void importAll() {
MyTracksProviderUtils providerUtils = MyTracksProviderUtils.Factory
.get(activity);
LinkedList<File> gpxFiles = new LinkedList<File>();
File[] gpxFileCandidates = new File("/sdcard/"
+ MyTracksConstants.SDCARD_TOP_DIR + "/gpx").listFiles();
if (gpxFileCandidates != null) {
for (File file : gpxFileCandidates) {
if (!file.isDirectory() && file.getName().endsWith(".gpx")) {
gpxFiles.add(file);
}
}
}
currentFileNumber++;
}
} finally {
if (progress != null) {
synchronized (this) {
progress.dismiss();
progress = null;
}
}
}
}
gpxFileCandidateCount = gpxFiles.size();
/**
* Tries to acquire a partial wake lock if not already acquired. Logs errors
* and gives up trying in case the wake lock cannot be acquired.
*/
private void acquireWakeLock() {
Log.i(MyTracksConstants.TAG, "ImportAllTracks: Acquiring wake lock.");
try {
PowerManager pm =
(PowerManager) activity.getSystemService(Context.POWER_SERVICE);
if (pm == null) {
Log.e(MyTracksConstants.TAG,
"ImportAllTracks: Power manager not found!");
return;
}
if (wakeLock == null) {
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
MyTracksConstants.TAG);
if (wakeLock == null) {
Log.e(MyTracksConstants.TAG,
"ImportAllTracks: Could not create wake lock (null).");
return;
}
}
if (!wakeLock.isHeld()) {
wakeLock.acquire();
if (!wakeLock.isHeld()) {
Log.e(MyTracksConstants.TAG,
"ImportAllTracks: Could not acquire wake lock.");
}
}
} catch (RuntimeException e) {
Log.e(MyTracksConstants.TAG,
"ImportAllTracks: Caught unexpected exception: " + e.getMessage(), e);
}
}
if (gpxFileCandidateCount != 0) {
Log.i(MyTracksConstants.TAG, "ImportAllTracks: Importing: "
+ gpxFileCandidateCount + " tracks.");
activity.runOnUiThread(new Runnable() {
public void run() {
makeProgressDialog(gpxFileCandidateCount);
}
});
Iterator<File> gpxFilesIterator = gpxFiles.iterator();
File currentFile;
int currentFileNumber = 0;
while (gpxFilesIterator.hasNext()) {
currentFile = gpxFilesIterator.next();
final int status = currentFileNumber;
activity.runOnUiThread(new Runnable() {
public void run() {
synchronized (this) {
if (progress == null) {
return;
}
progress.setProgress(status);
}
}
});
if (importFile(currentFile, providerUtils)) {
importSuccessCount++;
}
currentFileNumber++;
}
if (progress != null) {
synchronized (this) {
progress.dismiss();
progress = null;
}
}
}
}
private boolean importFile(File gpxFile, MyTracksProviderUtils providerUtils) {
Log.i(MyTracksConstants.TAG, "ImportAllTracks: importing: "
+ gpxFile.getName());
try {
GpxImporter.importGPXFile(new FileInputStream(gpxFile), providerUtils);
return true;
} catch (Exception e) {
Log.w("", e);
Toast.makeText(activity,
activity.getString(R.string.import_error) + " " + gpxFile.getName(),
Toast.LENGTH_LONG).show();
return false;
}
}
}