aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/files/GPXImporter.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/files/GPXImporter.java')
-rw-r--r--main/src/cgeo/geocaching/files/GPXImporter.java98
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;
}
}
};