diff options
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/cgData.java | 16 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgGPXListAdapter.java | 2 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgList.java | 12 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeocaches.java | 2 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeogpxes.java | 92 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/files/GPXParser.java | 56 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/files/LocParser.java | 4 |
7 files changed, 125 insertions, 59 deletions
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java index 18ddf2b..0ef6b50 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/cgData.java @@ -3131,7 +3131,7 @@ public class cgData { List<cgList> lists = new ArrayList<cgList>(); - lists.add(new cgList(true, 1, res.getString(R.string.list_inbox))); + lists.add(new cgList(cgList.STANDARD_LIST_ID, res.getString(R.string.list_inbox))); // lists.add(new cgList(true, 2, res.getString(R.string.list_wpt))); ArrayList<cgList> storedLists = readLists(null, "title COLLATE NOCASE ASC"); @@ -3158,16 +3158,10 @@ public class cgData { int indexId = cursor.getColumnIndex("_id"); int indexTitle = cursor.getColumnIndex("title"); int indexUpdated = cursor.getColumnIndex("updated"); - int indexLatitude = cursor.getColumnIndex("latitude"); - int indexLongitude = cursor.getColumnIndex("longitude"); do { - cgList list = new cgList(false); - - list.id = (cursor.getInt(indexId)) + 10; - list.title = cursor.getString(indexTitle); + cgList list = new cgList(cursor.getInt(indexId) + 10, cursor.getString(indexTitle)); list.updated = cursor.getLong(indexUpdated); - list.coords = getCoords(cursor, indexLatitude, indexLongitude); result.add(list); } while (cursor.moveToNext()); @@ -3182,10 +3176,10 @@ public class cgData { } public cgList getList(int id, Resources res) { - if (id == 1) { - return new cgList(true, 1, res.getString(R.string.list_inbox)); + if (id == cgList.STANDARD_LIST_ID) { + return new cgList(cgList.STANDARD_LIST_ID, res.getString(R.string.list_inbox)); } else if (id == 2) { - return new cgList(true, 2, res.getString(R.string.list_wpt)); + return new cgList(2, res.getString(R.string.list_wpt)); } else if (id >= 10) { init(); diff --git a/main/src/cgeo/geocaching/cgGPXListAdapter.java b/main/src/cgeo/geocaching/cgGPXListAdapter.java index 786d1f2..6daad37 100644 --- a/main/src/cgeo/geocaching/cgGPXListAdapter.java +++ b/main/src/cgeo/geocaching/cgGPXListAdapter.java @@ -66,7 +66,7 @@ public class cgGPXListAdapter extends ArrayAdapter<File> { // tap on item public void onClick(View view) { - parent.loadGPX(file); + parent.importGPX(file); } } } diff --git a/main/src/cgeo/geocaching/cgList.java b/main/src/cgeo/geocaching/cgList.java index 162af76..f176129 100644 --- a/main/src/cgeo/geocaching/cgList.java +++ b/main/src/cgeo/geocaching/cgList.java @@ -1,20 +1,14 @@ package cgeo.geocaching; -import cgeo.geocaching.geopoint.Geopoint; public class cgList { - public boolean def = false; + public static final int STANDARD_LIST_ID = 1; + public int id = 0; public String title = null; public Long updated = null; - public Geopoint coords = null; - - public cgList(boolean defIn) { - def = defIn; - } - public cgList(boolean defIn, int idIn, String titleIn) { - def = defIn; + public cgList(int idIn, String titleIn) { id = idIn; title = titleIn; } diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index e0250cf..4025301 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -590,7 +590,7 @@ public class cgeocaches extends AbstractListActivity { case OFFLINE: listId = Settings.getLastList(); if (listId <= 0) { - listId = 1; + listId = cgList.STANDARD_LIST_ID; title = res.getString(R.string.caches_stored); } else { final cgList list = app.getList(listId); diff --git a/main/src/cgeo/geocaching/cgeogpxes.java b/main/src/cgeo/geocaching/cgeogpxes.java index 8e5d22b..f19287d 100644 --- a/main/src/cgeo/geocaching/cgeogpxes.java +++ b/main/src/cgeo/geocaching/cgeogpxes.java @@ -7,7 +7,9 @@ import cgeo.geocaching.files.LocParser; import org.apache.commons.lang3.StringUtils; import android.app.Activity; +import android.app.AlertDialog; import android.app.ProgressDialog; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Environment; @@ -15,6 +17,8 @@ import android.os.Handler; import android.os.Message; import java.io.File; +import java.io.FileNotFoundException; +import java.io.InputStream; import java.util.List; import java.util.UUID; @@ -44,7 +48,6 @@ public class cgeogpxes extends FileList<cgGPXListAdapter> { }; final private Handler loadCachesHandler = new Handler() { - @Override public void handleMessage(Message msg) { if (parseDialog != null) { @@ -74,9 +77,33 @@ public class cgeogpxes extends FileList<cgGPXListAdapter> { listId = extras.getInt(EXTRAS_LIST_ID); } if (listId <= 0) { - listId = 1; + listId = cgList.STANDARD_LIST_ID; } + if (getIntent().getScheme().equals("content")) { + new AlertDialog.Builder(this) + .setTitle(res.getString(R.string.gpx_import_title)) + .setMessage(res.getString(R.string.gpx_import_confirm)) + .setCancelable(false) + .setPositiveButton(getString(android.R.string.yes), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + try { + final InputStream attachment = getContentResolver().openInputStream(getIntent().getData()); + importGPX(attachment); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + }) + .setNegativeButton(getString(android.R.string.no), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }) + .create() + .show(); + } } @Override @@ -84,39 +111,65 @@ public class cgeogpxes extends FileList<cgGPXListAdapter> { setTitle(res.getString(R.string.gpx_import_title)); } - public void loadGPX(File file) { + public void importGPX(final File file) { + createProgressDialog((int) file.length()); + new ImportFileThread(file).start(); + } + + public void importGPX(final InputStream stream) { + createProgressDialog(-1); + new ImportStreamThread(stream).start(); + } + private void createProgressDialog(int maxBytes) { parseDialog = new ProgressDialog(this); 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)); parseDialog.setCancelable(false); - parseDialog.setMax((int) file.length()); + parseDialog.setMax(maxBytes); parseDialog.show(); - - new loadCaches(file).start(); } - private class loadCaches extends Thread { + private abstract class ImportThread extends Thread { - File file = null; + @Override + public void run() { + final UUID searchId = doImport(); + loadCachesHandler.sendMessage(loadCachesHandler.obtainMessage(0, app.getCount(searchId), 0)); + } - public loadCaches(File fileIn) { - file = fileIn; + protected abstract UUID doImport(); + } + + private class ImportFileThread extends ImportThread { + private final File file; + + public ImportFileThread(final File file) { + this.file = file; } @Override - public void run() { - final UUID searchId; - final String name = file.getName().toLowerCase(); - if (name.endsWith("gpx")) { - searchId = GPXParser.parseGPX(file, listId, changeParseDialogHandler); + protected UUID doImport() { + if (StringUtils.endsWithIgnoreCase(file.getName(), GPXParser.GPX_FILE_EXTENSION)) { + return GPXParser.importGPX(file, listId, changeParseDialogHandler); } else { - searchId = LocParser.parseLoc(file, listId, changeParseDialogHandler); + return LocParser.parseLoc(file, listId, changeParseDialogHandler); } + } + } - loadCachesHandler.sendMessage(loadCachesHandler.obtainMessage(0, app.getCount(searchId), 0)); + private class ImportStreamThread extends ImportThread { + private final InputStream stream; + + public ImportStreamThread(InputStream stream) { + this.stream = stream; + } + + @Override + protected UUID doImport() { + return GPXParser.importGPX(stream, listId, changeParseDialogHandler); } } @@ -130,9 +183,8 @@ public class cgeogpxes extends FileList<cgGPXListAdapter> { protected boolean filenameBelongsToList(final String filename) { if (super.filenameBelongsToList(filename)) { // filter out waypoint files - return !StringUtils.endsWithIgnoreCase(filename, "-wpts.gpx"); - } else { - return false; + return !StringUtils.endsWithIgnoreCase(filename, GPXParser.WAYPOINTS_FILE_SUFFIX_AND_EXTENSION); } + return false; } } diff --git a/main/src/cgeo/geocaching/files/GPXParser.java b/main/src/cgeo/geocaching/files/GPXParser.java index 3ef200f..bb16f9d 100644 --- a/main/src/cgeo/geocaching/files/GPXParser.java +++ b/main/src/cgeo/geocaching/files/GPXParser.java @@ -67,7 +67,8 @@ public abstract class GPXParser extends FileParser { */ private static final String GSAK_NS = "http://www.gsak.net/xmlv1/5"; - private static final String GPX_FILE_EXTENSION = ".gpx"; + public static final String GPX_FILE_EXTENSION = ".gpx"; + public static final String WAYPOINTS_FILE_SUFFIX_AND_EXTENSION = "-wpts.gpx"; private int listId = 1; final protected String namespace; @@ -865,7 +866,7 @@ public abstract class GPXParser extends FileParser { } } - public static UUID parseGPX(File file, int listId, Handler handler) { + public static UUID importGPX(File file, int listId, Handler handler) { try { // parse cache file GPXParser parser = new GPX10Parser(listId); @@ -884,31 +885,56 @@ 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(); + return storeParsedCaches(handler, parser); } } catch (Exception e) { - Log.e(Settings.tag, "cgBase.parseGPX: " + e.toString()); + Log.e(Settings.tag, "GPXParser.importGPX: " + e.toString()); } return null; } + public static UUID importGPX(InputStream stream, int listId, Handler handler) { + try { + // parse cache file + GPXParser parser = new GPX10Parser(listId); + boolean parsed = parser.parse(stream, handler); + if (!parsed) { + parser = new GPX11Parser(listId); + parsed = parser.parse(stream, handler); + } + + if (parsed) { + return storeParsedCaches(handler, parser); + } + + } catch (Exception e) { + Log.e(Settings.tag, "GPXParser.importGPX: " + e.toString()); + } + + return null; + } + + private static UUID storeParsedCaches(Handler handler, GPXParser parser) { + 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(); + } + // 1234567.gpx -> 1234567-wpts.gpx static File getWaypointsFileForGpx(File file) { final String name = file.getName(); if (StringUtils.endsWithIgnoreCase(name, GPX_FILE_EXTENSION) && (StringUtils.length(name) > GPX_FILE_EXTENSION.length())) { - final String wptsName = StringUtils.substringBeforeLast(name, ".") + "-wpts" + StringUtils.right(name, GPX_FILE_EXTENSION.length()); + final String wptsName = StringUtils.substringBeforeLast(name, ".") + WAYPOINTS_FILE_SUFFIX_AND_EXTENSION; return new File(file.getParentFile(), wptsName); } else { return null; diff --git a/main/src/cgeo/geocaching/files/LocParser.java b/main/src/cgeo/geocaching/files/LocParser.java index 6f8d26c..ddd368a 100644 --- a/main/src/cgeo/geocaching/files/LocParser.java +++ b/main/src/cgeo/geocaching/files/LocParser.java @@ -165,9 +165,9 @@ public final class LocParser extends FileParser { } caches.totalCnt = caches.cacheList.size(); showCountMessage(handler, R.string.gpx_import_loading_stored, search.getCount()); - Log.i(Settings.tag, "Caches found in .gpx file: " + caches.totalCnt); + Log.i(Settings.tag, "Caches found in .loc file: " + caches.totalCnt); } catch (Exception e) { - Log.e(Settings.tag, "cgBase.parseGPX: " + e.toString()); + Log.e(Settings.tag, "LocParser.parseLoc: " + e.toString()); } return search.getCurrentId(); |
