diff options
Diffstat (limited to 'main/src/cgeo/geocaching/export/GpxExport.java')
| -rw-r--r-- | main/src/cgeo/geocaching/export/GpxExport.java | 169 |
1 files changed, 137 insertions, 32 deletions
diff --git a/main/src/cgeo/geocaching/export/GpxExport.java b/main/src/cgeo/geocaching/export/GpxExport.java index 156d9d4..9bc3963 100644 --- a/main/src/cgeo/geocaching/export/GpxExport.java +++ b/main/src/cgeo/geocaching/export/GpxExport.java @@ -2,6 +2,7 @@ package cgeo.geocaching.export; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; +import cgeo.geocaching.Settings; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgWaypoint; import cgeo.geocaching.cgeoapplication; @@ -16,9 +17,15 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringEscapeUtils; import android.app.Activity; +import android.app.AlertDialog; import android.app.ProgressDialog; +import android.content.Intent; +import android.net.Uri; import android.os.AsyncTask; import android.os.Environment; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; import java.io.BufferedWriter; import java.io.File; @@ -26,6 +33,7 @@ import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -39,7 +47,48 @@ class GpxExport extends AbstractExport { @Override public void export(final List<cgCache> caches, final Activity activity) { - new ExportTask(caches, activity).execute((Void) null); + if (null == activity) { + // No activity given, so no user interaction possible. + // Start export with default parameters. + new ExportTask(caches, activity).execute((Void) null); + + } else { + // Show configuration dialog + new ExportOptionsDialog(caches, activity).show(); + } + } + + /** + * A dialog to allow the user to set options for the export. + * + * Currently available option is: opening of share menu after successful export + */ + private class ExportOptionsDialog extends AlertDialog { + public ExportOptionsDialog(final List<cgCache> caches, final Activity activity) { + super(activity); + + View layout = activity.getLayoutInflater().inflate(R.layout.gpx_export_dialog, null); + setView(layout); + + final CheckBox shareOption = (CheckBox) layout.findViewById(R.id.share); + + shareOption.setChecked(Settings.getShareAfterExport()); + + shareOption.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Settings.setShareAfterExport(shareOption.isChecked()); + } + }); + + ((Button) layout.findViewById(R.id.export)).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + new ExportTask(caches, activity).execute((Void) null); + } + }); + } } private class ExportTask extends AsyncTask<Void, Integer, Boolean> { @@ -88,7 +137,6 @@ class GpxExport extends AbstractExport { gpx.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); gpx.write("<gpx version=\"1.0\" creator=\"c:geo - http://www.cgeo.org\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.topografix.com/GPX/1/0\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0/1 http://www.groundspeak.com/cache/1/0/1/cache.xsd\">"); - for (int i = 0; i < caches.size(); i++) { // reload the cache. otherwise logs, attributes and other detailed information is not available final cgCache cache = cgeoapplication.getInstance().loadCache(caches.get(i).getGeocode(), LoadFlags.LOAD_ALL_DB_ONLY); @@ -113,6 +161,14 @@ class GpxExport extends AbstractExport { gpx.write(StringEscapeUtils.escapeXml(cache.getName())); gpx.write("</desc>"); + gpx.write("<url>"); + gpx.write(cache.getUrl()); + gpx.write("</url>"); + + gpx.write("<urlname>"); + gpx.write(StringEscapeUtils.escapeXml(cache.getName())); + gpx.write("</urlname>"); + gpx.write("<sym>"); gpx.write(cache.isFound() ? "Geocache Found" : "Geocache"); gpx.write("</sym>"); @@ -122,7 +178,9 @@ class GpxExport extends AbstractExport { gpx.write("</type>"); gpx.write("<groundspeak:cache "); - gpx.write("available=\""); + gpx.write("id=\""); + gpx.write(cache.getCacheId()); + gpx.write("\" available=\""); gpx.write(!cache.isDisabled() ? "True" : "False"); gpx.write("\" archived=\""); gpx.write(cache.isArchived() ? "True" : "False"); @@ -134,11 +192,11 @@ class GpxExport extends AbstractExport { gpx.write("</groundspeak:name>"); gpx.write("<groundspeak:placed_by>"); - gpx.write(StringEscapeUtils.escapeXml(cache.getOwner())); + gpx.write(StringEscapeUtils.escapeXml(cache.getOwnerDisplayName())); gpx.write("</groundspeak:placed_by>"); gpx.write("<groundspeak:owner>"); - gpx.write(StringEscapeUtils.escapeXml(cache.getOwnerReal())); + gpx.write(StringEscapeUtils.escapeXml(cache.getOwnerUserId())); gpx.write("</groundspeak:owner>"); gpx.write("<groundspeak:type>"); @@ -225,35 +283,75 @@ class GpxExport extends AbstractExport { } private void writeWaypoints(final cgCache cache) throws IOException { + List<cgWaypoint> waypoints = cache.getWaypoints(); + List<cgWaypoint> ownWaypoints = new ArrayList<cgWaypoint>(waypoints.size()); + List<cgWaypoint> originWaypoints = new ArrayList<cgWaypoint>(waypoints.size()); for (cgWaypoint wp : cache.getWaypoints()) { - gpx.write("<wpt lat=\""); - final Geopoint coords = wp.getCoords(); - gpx.write(coords != null ? Double.toString(coords.getLatitude()) : ""); // TODO: check whether is the best way to handle unknown waypoint coordinates - gpx.write("\" lon=\""); - gpx.write(coords != null ? Double.toString(coords.getLongitude()) : ""); - gpx.write("\">"); - - gpx.write("<name>"); - gpx.write(StringEscapeUtils.escapeXml(wp.getPrefix())); - gpx.write(StringEscapeUtils.escapeXml(cache.getGeocode().substring(2))); - gpx.write("</name>"); - - gpx.write("<cmt />"); - - gpx.write("<desc>"); - gpx.write(StringEscapeUtils.escapeXml(wp.getNote())); - gpx.write("</desc>"); - - gpx.write("<sym>"); - gpx.write(StringEscapeUtils.escapeXml(wp.getWaypointType().toString())); //TODO: Correct identifier string - gpx.write("</sym>"); - - gpx.write("<type>Waypoint|"); - gpx.write(StringEscapeUtils.escapeXml(wp.getWaypointType().toString())); //TODO: Correct identifier string - gpx.write("</type>"); - - gpx.write("</wpt>"); + if (wp.isUserDefined()) { + ownWaypoints.add(wp); + } else { + originWaypoints.add(wp); + } + } + int maxPrefix = 0; + for (cgWaypoint wp : originWaypoints) { + String prefix = wp.getPrefix(); + try { + maxPrefix = Math.max(Integer.parseInt(prefix), maxPrefix); + } catch (NumberFormatException ex) { + Log.e("Unexpected origin waypoint prefix='" + prefix + "'", ex); + } + writeCacheWaypoint(wp, prefix); } + for (cgWaypoint wp : ownWaypoints) { + maxPrefix++; + String prefix = String.valueOf(maxPrefix); + if (prefix.length() == 1) { + prefix = "0" + prefix; + } + writeCacheWaypoint(wp, prefix); + } + } + + /** + * Writes one waypoint entry for cache waypoint. + * + * @param cache + * The + * @param wp + * @param prefix + * @throws IOException + */ + private void writeCacheWaypoint(final cgWaypoint wp, final String prefix) throws IOException { + gpx.write("<wpt lat=\""); + final Geopoint coords = wp.getCoords(); + gpx.write(coords != null ? Double.toString(coords.getLatitude()) : ""); // TODO: check whether is the best way to handle unknown waypoint coordinates + gpx.write("\" lon=\""); + gpx.write(coords != null ? Double.toString(coords.getLongitude()) : ""); + gpx.write("\">"); + + gpx.write("<name>"); + gpx.write(StringEscapeUtils.escapeXml(prefix)); + gpx.write(StringEscapeUtils.escapeXml(wp.getGeocode().substring(2))); + gpx.write("</name>"); + + gpx.write("<cmt>"); + gpx.write(StringEscapeUtils.escapeXml(wp.getNote())); + gpx.write("</cmt>"); + + gpx.write("<desc>"); + gpx.write(StringEscapeUtils.escapeXml(wp.getName())); + gpx.write("</desc>"); + + gpx.write("<sym>"); + gpx.write(StringEscapeUtils.escapeXml(wp.getWaypointType().toString())); //TODO: Correct identifier string + gpx.write("</sym>"); + + gpx.write("<type>Waypoint|"); + gpx.write(StringEscapeUtils.escapeXml(wp.getWaypointType().toString())); //TODO: Correct identifier string + gpx.write("</type>"); + + gpx.write("</wpt>"); } private void writeLogs(final cgCache cache) throws IOException { @@ -322,6 +420,13 @@ class GpxExport extends AbstractExport { progress.dismiss(); if (result) { ActivityMixin.showToast(activity, getName() + ' ' + getString(R.string.export_exportedto) + ": " + exportFile.toString()); + if (Settings.getShareAfterExport()) { + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(exportFile)); + shareIntent.setType("application/xml"); + activity.startActivity(Intent.createChooser(shareIntent, getString(R.string.export_gpx_to))); + } } else { ActivityMixin.showToast(activity, getString(R.string.export_failed)); } |
