diff options
Diffstat (limited to 'main/src/cgeo/geocaching/files/GPXImporter.java')
| -rw-r--r-- | main/src/cgeo/geocaching/files/GPXImporter.java | 98 |
1 files changed, 57 insertions, 41 deletions
diff --git a/main/src/cgeo/geocaching/files/GPXImporter.java b/main/src/cgeo/geocaching/files/GPXImporter.java index 68cfe4a..4ee7e99 100644 --- a/main/src/cgeo/geocaching/files/GPXImporter.java +++ b/main/src/cgeo/geocaching/files/GPXImporter.java @@ -7,12 +7,15 @@ import cgeo.geocaching.cgSearch; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.activity.IAbstractActivity; +import cgeo.geocaching.activity.Progress; +import cgeo.geocaching.utils.CancellableHandler; import org.apache.commons.lang3.StringUtils; import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentResolver; +import android.content.Context; import android.content.res.Resources; import android.net.Uri; import android.os.Handler; @@ -23,6 +26,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Collection; +import java.util.concurrent.CancellationException; public class GPXImporter { static final int IMPORT_STEP_READ_FILE = 1; @@ -30,39 +34,45 @@ public class GPXImporter { static final int IMPORT_STEP_STORE_CACHES = 3; static final int IMPORT_STEP_FINISHED = 4; static final int IMPORT_STEP_FINISHED_WITH_ERROR = 5; + static final int IMPORT_STEP_CANCEL = 6; + static final int IMPORT_STEP_CANCELED = 7; public static final String GPX_FILE_EXTENSION = ".gpx"; public static final String WAYPOINTS_FILE_SUFFIX_AND_EXTENSION = "-wpts.gpx"; - private ProgressDialog parseDialog = null; + private Progress progress = new Progress(); + private Resources res; private int listId; private IAbstractActivity fromActivity; private boolean closeOnFinish = false; - public GPXImporter(final int listId) { + public GPXImporter(final IAbstractActivity fromActivity, final int listId) { this.listId = listId; + this.fromActivity = fromActivity; + Activity realActivity = (Activity) fromActivity; + res = realActivity.getResources(); } - private void createProgressDialog(IAbstractActivity activity) { - this.fromActivity = activity; - Activity realActivity = (Activity) activity; - res = realActivity.getResources(); - parseDialog = new ProgressDialog(realActivity); - parseDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - parseDialog.setTitle(res.getString(R.string.gpx_import_title_reading_file)); - parseDialog.setMessage(res.getString(R.string.gpx_import_loading_caches)); - parseDialog.setCancelable(false); - parseDialog.setMax(-1); - parseDialog.show(); + public void importGPX(final File file) { + if (StringUtils.endsWithIgnoreCase(file.getName(), GPX_FILE_EXTENSION)) { + new ImportGpxFileThread(file, listId, importStepHandler, progressHandler).start(); + } else { + new ImportLocFileThread(file, listId, importStepHandler, progressHandler).start(); + } + } + + public void importGPX(final Uri uri, ContentResolver contentResolver) { + closeOnFinish = true; + new ImportAttachmentThread(uri, contentResolver, listId, importStepHandler, progressHandler).start(); } static abstract class ImportThread extends Thread { final int listId; final Handler importStepHandler; - final Handler progressHandler; + final CancellableHandler progressHandler; - public ImportThread(int listId, Handler importStepHandler, Handler progressHandler) { + public ImportThread(int listId, Handler importStepHandler, CancellableHandler progressHandler) { this.listId = listId; this.importStepHandler = importStepHandler; this.progressHandler = progressHandler; @@ -85,6 +95,9 @@ public class GPXImporter { } catch (ParserException e) { Log.i(Settings.tag, "Importing caches failed - data format error" + e.getMessage()); importStepHandler.sendMessage(importStepHandler.obtainMessage(IMPORT_STEP_FINISHED_WITH_ERROR, R.string.gpx_import_error_parser, 0, e.getLocalizedMessage())); + } catch (CancellationException e) { + Log.i(Settings.tag, "Importing caches canceled"); + importStepHandler.sendMessage(importStepHandler.obtainMessage(IMPORT_STEP_CANCELED)); } catch (Exception e) { Log.e(Settings.tag, "Importing caches failed - unknown error: ", e); importStepHandler.sendMessage(importStepHandler.obtainMessage(IMPORT_STEP_FINISHED_WITH_ERROR, R.string.gpx_import_error_unexpected, 0, e.getLocalizedMessage())); @@ -101,6 +114,10 @@ public class GPXImporter { // remove from cache because a cache might be re-imported app.removeCacheFromCache(cache.getGeocode()); app.addCacheToSearch(search, cache); + + if (progressHandler.isCancelled()) { + throw new CancellationException(); + } progressHandler.sendMessage(progressHandler.obtainMessage(0, ++storedCaches, 0)); } return search; @@ -110,7 +127,7 @@ public class GPXImporter { static class ImportGpxFileThread extends ImportThread { private final File cacheFile; - public ImportGpxFileThread(final File file, int listId, Handler importStepHandler, Handler progressHandler) { + public ImportGpxFileThread(final File file, int listId, Handler importStepHandler, CancellableHandler progressHandler) { super(listId, importStepHandler, progressHandler); this.cacheFile = file; } @@ -145,7 +162,7 @@ public class GPXImporter { static class ImportLocFileThread extends ImportThread { private final File file; - public ImportLocFileThread(final File file, int listId, Handler importStepHandler, Handler progressHandler) { + public ImportLocFileThread(final File file, int listId, Handler importStepHandler, CancellableHandler progressHandler) { super(listId, importStepHandler, progressHandler); this.file = file; } @@ -163,7 +180,7 @@ public class GPXImporter { private final Uri uri; private ContentResolver contentResolver; - public ImportAttachmentThread(Uri uri, ContentResolver contentResolver, int listId, Handler importStepHandler, Handler progressHandler) { + public ImportAttachmentThread(Uri uri, ContentResolver contentResolver, int listId, Handler importStepHandler, CancellableHandler progressHandler) { super(listId, importStepHandler, progressHandler); this.uri = uri; this.contentResolver = contentResolver; @@ -198,25 +215,10 @@ public class GPXImporter { } } - public void importGPX(final IAbstractActivity fromActivity, final File file) { - createProgressDialog(fromActivity); - if (StringUtils.endsWithIgnoreCase(file.getName(), GPX_FILE_EXTENSION)) { - new ImportGpxFileThread(file, listId, importStepHandler, progressHandler).start(); - } else { - new ImportLocFileThread(file, listId, importStepHandler, progressHandler).start(); - } - } - - public void importGPX(final IAbstractActivity fromActivity, final Uri uri, ContentResolver contentResolver) { - createProgressDialog(fromActivity); - closeOnFinish = true; - new ImportAttachmentThread(uri, contentResolver, listId, importStepHandler, progressHandler).start(); - } - - final private Handler progressHandler = new Handler() { + final private CancellableHandler progressHandler = new CancellableHandler() { @Override - public void handleMessage(Message msg) { - parseDialog.setProgress(msg.arg1); + public void handleRegularMessage(Message msg) { + progress.setProgress(msg.arg1); } }; @@ -225,24 +227,38 @@ public class GPXImporter { public void handleMessage(Message msg) { switch (msg.what) { case IMPORT_STEP_READ_FILE: + Message cancelMessage = importStepHandler.obtainMessage(IMPORT_STEP_CANCEL); + progress.show((Context) fromActivity, res.getString(R.string.gpx_import_title_reading_file), res.getString(msg.arg1), ProgressDialog.STYLE_HORIZONTAL, cancelMessage); + progress.setMaxProgressAndReset(msg.arg2); + break; + case IMPORT_STEP_READ_WPT_FILE: case IMPORT_STEP_STORE_CACHES: - parseDialog.setMessage(res.getString(msg.arg1)); - parseDialog.setMax(msg.arg2); - parseDialog.setProgress(0); + progress.setMessage(res.getString(msg.arg1)); + progress.setMaxProgressAndReset(msg.arg2); break; case IMPORT_STEP_FINISHED: - parseDialog.dismiss(); + progress.dismiss(); fromActivity.helpDialog(res.getString(R.string.gpx_import_title_caches_imported), msg.arg1 + " " + res.getString(R.string.gpx_import_caches_imported)); closeActivity(); break; case IMPORT_STEP_FINISHED_WITH_ERROR: - parseDialog.dismiss(); + progress.dismiss(); fromActivity.helpDialog(res.getString(R.string.gpx_import_title_caches_import_failed), res.getString(msg.arg1) + "\n\n" + msg.obj); closeActivity(); break; + + case IMPORT_STEP_CANCEL: + progress.dismiss(); + progressHandler.cancel(); + break; + + case IMPORT_STEP_CANCELED: + fromActivity.showShortToast(res.getString(R.string.gpx_import_canceled)); + closeActivity(); + break; } } }; |
