aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/res/values-de/strings.xml4
-rw-r--r--main/res/values/strings.xml3
-rw-r--r--main/src/cgeo/geocaching/cgeogpxes.java36
-rw-r--r--main/src/cgeo/geocaching/files/FileList.java25
-rw-r--r--main/src/cgeo/geocaching/files/FileParser.java9
-rw-r--r--main/src/cgeo/geocaching/files/GPXParser.java8
-rw-r--r--main/src/cgeo/geocaching/files/LocParser.java5
-rw-r--r--tests/src/cgeo/geocaching/test/cgeogpxesTest.java25
8 files changed, 80 insertions, 35 deletions
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml
index b92ebe4..01b7467 100644
--- a/main/res/values-de/strings.xml
+++ b/main/res/values-de/strings.xml
@@ -584,7 +584,11 @@
<string name="file_title_searching">Suche</string>
<!-- gpx -->
+ <string name="gpx_import_loading_caches">Lade Caches aus GPX-Datei\nGelesen:</string>
+ <string name="gpx_import_loading_waypoints">Lade Wegpunkte aus GPX-Datei\nGelesen:</string>
+ <string name="gpx_import_storing">Schreibe Caches in Datenbank\nGespeichert:</string>
<string name="gpx_import_loading_stored">Lade Caches aus GPX-Datei\nGespeichert:</string>
+ <string name="gpx_import_no_files">c:geo konnte keine GPX-Dateien finden.</string>
<string name="gpx_import_caches_imported">Caches importiert.</string>
<string name="gpx_import_loading">Lade Caches aus GPX-Datei</string>
<string name="gpx_import_title">Importiere GPX-Datei</string>
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index ba23d89..f1bd6d5 100644
--- a/main/res/values/strings.xml
+++ b/main/res/values/strings.xml
@@ -598,6 +598,9 @@
<string name="file_title_searching">Searching</string>
<!-- gpx -->
+ <string name="gpx_import_loading_caches">Loading caches from .gpx file\nRead:</string>
+ <string name="gpx_import_loading_waypoints">Loading waypoints from .gpx file\nRead:</string>
+ <string name="gpx_import_storing">Writing caches to database\nStored:</string>
<string name="gpx_import_loading_stored">Loading caches from .gpx file\nStored:</string>
<string name="gpx_import_no_files">Sorry, c:geo did not find any .gpx files.</string>
<string name="gpx_import_caches_imported">caches imported</string>
diff --git a/main/src/cgeo/geocaching/cgeogpxes.java b/main/src/cgeo/geocaching/cgeogpxes.java
index 20cef00..49f3120 100644
--- a/main/src/cgeo/geocaching/cgeogpxes.java
+++ b/main/src/cgeo/geocaching/cgeogpxes.java
@@ -4,6 +4,8 @@ import cgeo.geocaching.files.FileList;
import cgeo.geocaching.files.GPXParser;
import cgeo.geocaching.files.LocParser;
+import org.apache.commons.lang3.StringUtils;
+
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
@@ -26,33 +28,26 @@ public class cgeogpxes extends FileList<cgGPXListAdapter> {
private ProgressDialog parseDialog = null;
private int listId = 1;
- private int imported = 0;
final private Handler changeParseDialogHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
- if (msg.obj != null && parseDialog != null) {
- parseDialog.setMessage(res.getString(R.string.gpx_import_loading_stored) + " " + (Integer) msg.obj);
+ if (parseDialog != null) {
+ parseDialog.setMessage(res.getString(msg.arg1) + " " + msg.arg2);
}
}
};
+
final private Handler loadCachesHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
- try {
- if (parseDialog != null) {
- parseDialog.dismiss();
- }
-
- helpDialog(res.getString(R.string.gpx_import_title_caches_imported), imported + " " + res.getString(R.string.gpx_import_caches_imported));
- imported = 0;
- } catch (Exception e) {
- if (parseDialog != null) {
- parseDialog.dismiss();
- }
+ if (parseDialog != null) {
+ parseDialog.dismiss();
}
+
+ helpDialog(res.getString(R.string.gpx_import_title_caches_imported), msg.arg1 + " " + res.getString(R.string.gpx_import_caches_imported));
}
};
@@ -116,9 +111,8 @@ public class cgeogpxes extends FileList<cgGPXListAdapter> {
else {
searchId = LocParser.parseLoc(file, listId, changeParseDialogHandler);
}
- imported = app.getCount(searchId);
- loadCachesHandler.sendMessage(new Message());
+ loadCachesHandler.sendMessage(loadCachesHandler.obtainMessage(0, app.getCount(searchId), 0));
}
}
@@ -127,4 +121,14 @@ public class cgeogpxes extends FileList<cgGPXListAdapter> {
intent.putExtra(EXTRAS_LIST_ID, listId);
fromActivity.startActivityForResult(intent, 0);
}
+
+ @Override
+ public boolean filenameBelongsToList(final String filename) {
+ if (super.filenameBelongsToList(filename)) {
+ // filter out waypoint files
+ return !StringUtils.endsWithIgnoreCase(filename, "-wpts.gpx");
+ } else {
+ return false;
+ }
+ }
}
diff --git a/main/src/cgeo/geocaching/files/FileList.java b/main/src/cgeo/geocaching/files/FileList.java
index 1d7fbfa..750ff42 100644
--- a/main/src/cgeo/geocaching/files/FileList.java
+++ b/main/src/cgeo/geocaching/files/FileList.java
@@ -5,6 +5,7 @@ import cgeo.geocaching.Settings;
import cgeo.geocaching.activity.AbstractListActivity;
import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
import android.app.ProgressDialog;
import android.content.DialogInterface;
@@ -199,14 +200,9 @@ public abstract class FileList<T extends ArrayAdapter<File>> extends AbstractLis
}
String name = file.getName();
if (file.isFile()) {
- for (String ext : extensions) {
- int extLength = ext.length();
- if (name.length() > extLength && name.substring(name.length() - extLength, name.length()).equalsIgnoreCase(ext)) {
- result.add(file); // add file to list
- break;
- }
+ if (filenameBelongsToList(name)) {
+ result.add(file); // add file to list
}
-
} else if (file.isDirectory()) {
if (name.charAt(0) == '.') {
continue; // skip hidden directories
@@ -226,6 +222,16 @@ public abstract class FileList<T extends ArrayAdapter<File>> extends AbstractLis
return;
}
+ // TODO: public because of testing
+ public boolean filenameBelongsToList(final String filename) {
+ for (String ext : extensions) {
+ if (StringUtils.endsWithIgnoreCase(filename, ext)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
protected FileList(final String extension) {
setExtensions(new String[] { extension });
}
@@ -235,9 +241,10 @@ public abstract class FileList<T extends ArrayAdapter<File>> extends AbstractLis
}
private void setExtensions(String[] extensionsIn) {
- for (String extension : extensionsIn) {
+ for (int i = 0; i < extensionsIn.length; i++) {
+ String extension = extensionsIn[i];
if (extension.length() == 0 || extension.charAt(0) != '.') {
- extension = "." + extension;
+ extensionsIn[i] = "." + extension;
}
}
extensions = extensionsIn;
diff --git a/main/src/cgeo/geocaching/files/FileParser.java b/main/src/cgeo/geocaching/files/FileParser.java
index 7785363..271c43b 100644
--- a/main/src/cgeo/geocaching/files/FileParser.java
+++ b/main/src/cgeo/geocaching/files/FileParser.java
@@ -3,7 +3,6 @@ package cgeo.geocaching.files;
import cgeo.geocaching.cgCache;
import android.os.Handler;
-import android.os.Message;
import java.io.BufferedReader;
import java.io.File;
@@ -28,11 +27,9 @@ public abstract class FileParser {
return buffer;
}
- protected static void showCountMessage(final Handler handler, final int count) {
- if (handler != null) {
- final Message msg = new Message();
- msg.obj = count;
- handler.sendMessage(msg);
+ protected static void showCountMessage(final Handler handler, final int msgId, final int count) {
+ if (handler != null && (count <= 1 || count % 10 == 0)) {
+ handler.sendMessage(handler.obtainMessage(0, msgId, count));
}
}
diff --git a/main/src/cgeo/geocaching/files/GPXParser.java b/main/src/cgeo/geocaching/files/GPXParser.java
index 3856593..8a8d659 100644
--- a/main/src/cgeo/geocaching/files/GPXParser.java
+++ b/main/src/cgeo/geocaching/files/GPXParser.java
@@ -71,6 +71,7 @@ public abstract class GPXParser extends FileParser {
final protected String namespace;
final private String version;
private Handler handler = null;
+ private int importedRecords;
private cgCache cache = new cgCache();
private cgTrackable trackable = new cgTrackable();
@@ -234,6 +235,7 @@ public abstract class GPXParser extends FileParser {
// TODO: is not API, only public because of testing
public boolean parse(final InputStream stream, Handler handlerIn) {
+ importedRecords = 0;
handler = handlerIn;
final RootElement root = new RootElement(namespace, "gpx");
@@ -279,7 +281,7 @@ public abstract class GPXParser extends FileParser {
createNoteFromGSAKUserdata();
result.put(cache.geocode, cache);
- showCountMessage(handler, result.size());
+ showCountMessage(handler, R.string.gpx_import_loading_caches, ++importedRecords);
} else if (StringUtils.isNotBlank(cache.name)
&& cache.coords != null
&& StringUtils.contains(type, "waypoint")) {
@@ -314,7 +316,7 @@ public abstract class GPXParser extends FileParser {
}
cgWaypoint.mergeWayPoints(cacheForWaypoint.waypoints, Collections.singletonList(waypoint));
result.put(cacheGeocodeForWaypoint, cacheForWaypoint);
- showCountMessage(handler, result.size());
+ showCountMessage(handler, R.string.gpx_import_loading_waypoints, ++importedRecords);
}
}
}
@@ -880,10 +882,12 @@ public abstract class GPXParser extends FileParser {
if (parsed) {
final cgSearch search = new cgSearch();
final cgeoapplication app = cgeoapplication.getInstance();
+ int storedCaches = 0;
for (cgCache cache : parser.getParsedCaches()) {
// remove from cache, cache can be re-imported
app.removeCacheFromCache(cache.geocode);
app.addCacheToSearch(search, cache);
+ showCountMessage(handler, R.string.gpx_import_storing, ++storedCaches);
}
Log.i(Settings.tag, "Caches found in .gpx file: " + parser.getParsedCaches().size());
return search.getCurrentId();
diff --git a/main/src/cgeo/geocaching/files/LocParser.java b/main/src/cgeo/geocaching/files/LocParser.java
index b39658b..7442d07 100644
--- a/main/src/cgeo/geocaching/files/LocParser.java
+++ b/main/src/cgeo/geocaching/files/LocParser.java
@@ -1,10 +1,11 @@
package cgeo.geocaching.files;
+import cgeo.geocaching.R;
+import cgeo.geocaching.Settings;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgCacheWrap;
import cgeo.geocaching.cgCoord;
import cgeo.geocaching.cgSearch;
-import cgeo.geocaching.Settings;
import cgeo.geocaching.cgeoapplication;
import cgeo.geocaching.enumerations.CacheSize;
import cgeo.geocaching.geopoint.GeopointParser;
@@ -162,7 +163,7 @@ public final class LocParser extends FileParser {
cgeoapplication.getInstance().addCacheToSearch(search, cache);
}
caches.totalCnt = caches.cacheList.size();
- showCountMessage(handler, search.getCount());
+ showCountMessage(handler, R.string.gpx_import_loading_stored, search.getCount());
Log.i(Settings.tag, "Caches found in .gpx file: " + caches.totalCnt);
} catch (Exception e) {
Log.e(Settings.tag, "cgBase.parseGPX: " + e.toString());
diff --git a/tests/src/cgeo/geocaching/test/cgeogpxesTest.java b/tests/src/cgeo/geocaching/test/cgeogpxesTest.java
new file mode 100644
index 0000000..9c2d088
--- /dev/null
+++ b/tests/src/cgeo/geocaching/test/cgeogpxesTest.java
@@ -0,0 +1,25 @@
+package cgeo.geocaching.test;
+
+import cgeo.geocaching.cgeogpxes;
+
+import android.test.AndroidTestCase;
+
+public class cgeogpxesTest extends AndroidTestCase {
+ private cgeogpxes cgeogpxes = new cgeogpxes();
+
+ public void testFileNameMatches() {
+ assertTrue(cgeogpxes.filenameBelongsToList("1234567.gpx"));
+ assertTrue(cgeogpxes.filenameBelongsToList("1234567.GPX"));
+ assertTrue(cgeogpxes.filenameBelongsToList(".gpx"));
+ assertTrue(cgeogpxes.filenameBelongsToList("1234567.loc"));
+ assertTrue(cgeogpxes.filenameBelongsToList("1234567.LOC"));
+
+ assertFalse(cgeogpxes.filenameBelongsToList("1234567.gpy"));
+ assertFalse(cgeogpxes.filenameBelongsToList("1234567.agpx"));
+ assertFalse(cgeogpxes.filenameBelongsToList("1234567"));
+ assertFalse(cgeogpxes.filenameBelongsToList(""));
+ assertFalse(cgeogpxes.filenameBelongsToList("gpx"));
+
+ assertFalse(cgeogpxes.filenameBelongsToList("1234567-wpts.gpx"));
+ }
+}