diff options
-rw-r--r-- | main/res/values-de/strings.xml | 4 | ||||
-rw-r--r-- | main/res/values/strings.xml | 3 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/cgeogpxes.java | 36 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/files/FileList.java | 25 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/files/FileParser.java | 9 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/files/GPXParser.java | 8 | ||||
-rw-r--r-- | main/src/cgeo/geocaching/files/LocParser.java | 5 | ||||
-rw-r--r-- | tests/src/cgeo/geocaching/test/cgeogpxesTest.java | 25 |
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")); + } +} |