From cd267123e724cab4712211fb327701dbed75e181 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sat, 10 Aug 2019 14:00:38 +0200 Subject: [PATCH] KML export: write close tag for last segment. Closes #21. --- .../opentracks/io/file/TrackFileFormat.java | 1 + .../io/file/exporter/FileTrackExporter.java | 14 +++--- .../io/file/exporter/KmlTrackWriter.java | 50 ++++++------------- .../io/file/exporter/KmzTrackExporter.java | 4 +- .../io/file/exporter/SaveAsyncTask.java | 2 +- 5 files changed, 27 insertions(+), 44 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/io/file/TrackFileFormat.java b/src/main/java/de/dennisguse/opentracks/io/file/TrackFileFormat.java index c41eab234..3045ce675 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/TrackFileFormat.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/TrackFileFormat.java @@ -6,6 +6,7 @@ import android.os.Parcelable; import de.dennisguse.opentracks.io.file.exporter.GpxTrackWriter; import de.dennisguse.opentracks.io.file.exporter.KmlTrackWriter; +import de.dennisguse.opentracks.io.file.exporter.KmzTrackExporter; import de.dennisguse.opentracks.io.file.exporter.TrackWriter; import de.dennisguse.opentracks.R; diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/FileTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/FileTrackExporter.java index 491375ba0..c438b24bc 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/FileTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/FileTrackExporter.java @@ -53,8 +53,7 @@ public class FileTrackExporter implements TrackExporter { * @param trackWriter the track writer * @param trackExporterListener the track export listener */ - public FileTrackExporter(ContentProviderUtils contentProviderUtils, Track[] tracks, - TrackWriter trackWriter, TrackExporterListener trackExporterListener) { + public FileTrackExporter(ContentProviderUtils contentProviderUtils, Track[] tracks, TrackWriter trackWriter, TrackExporterListener trackExporterListener) { this.contentProviderUtils = contentProviderUtils; this.tracks = tracks; this.trackWriter = trackWriter; @@ -95,8 +94,7 @@ public class FileTrackExporter implements TrackExporter { * load them into objects all at the same time. */ boolean hasWaypoints = false; - try (Cursor cursor = contentProviderUtils.getWaypointCursor( - track.getId(), -1L, Constants.MAX_LOADED_WAYPOINTS_POINTS)) { + try (Cursor cursor = contentProviderUtils.getWaypointCursor(track.getId(), -1L, Constants.MAX_LOADED_WAYPOINTS_POINTS)) { if (cursor != null && cursor.moveToFirst()) { /* * Yes, this will skip the first waypoint and that is intentional as the @@ -132,8 +130,7 @@ public class FileTrackExporter implements TrackExporter { LocationIterator locationIterator = null; try { - locationIterator = contentProviderUtils.getTrackPointLocationIterator( - track.getId(), -1L, false, locationFactory); + locationIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), -1L, false, locationFactory); while (locationIterator.hasNext()) { if (Thread.interrupted()) { @@ -177,6 +174,11 @@ public class FileTrackExporter implements TrackExporter { isLastLocationValid = isLocationValid; } + if (wroteSegment) { + //Close the last segment + trackWriter.writeCloseSegment(); + } + if (wroteTrack) { Location lastValidTrackPoint = contentProviderUtils.getLastValidTrackPoint(track.getId()); setLocationTime(lastValidTrackPoint, offset); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmlTrackWriter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmlTrackWriter.java index a54ae1a48..72563e3f3 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmlTrackWriter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmlTrackWriter.java @@ -56,16 +56,11 @@ public class KmlTrackWriter implements TrackWriter { private static final String HEART_RATE = "heart_rate"; private static final String POWER = "power"; - private static final String - WAYPOINT_ICON = "http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png"; - private static final String - STATISTICS_ICON = "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png"; - private static final String - START_ICON = "http://maps.google.com/mapfiles/kml/paddle/grn-circle.png"; - private static final String - END_ICON = "http://maps.google.com/mapfiles/kml/paddle/red-circle.png"; - private static final String - TRACK_ICON = "http://earth.google.com/images/kml-icons/track-directional/track-0.png"; + private static final String WAYPOINT_ICON = "http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png"; + private static final String STATISTICS_ICON = "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png"; + private static final String START_ICON = "http://maps.google.com/mapfiles/kml/paddle/grn-circle.png"; + private static final String END_ICON = "http://maps.google.com/mapfiles/kml/paddle/red-circle.png"; + private static final String TRACK_ICON = "http://earth.google.com/images/kml-icons/track-directional/track-0.png"; private final Context context; private final boolean multiple; @@ -124,9 +119,7 @@ public class KmlTrackWriter implements TrackWriter { printWriter.println("1"); Track track = tracks[0]; printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); - printWriter.println("" - + StringUtils.formatCData(context.getString(R.string.app_name)) - + ""); + printWriter.println("" + StringUtils.formatCData(context.getString(R.string.app_name)) + ""); writeTrackStyle(); writePlacemarkerStyle(START_STYLE, START_ICON, 32, 1); writePlacemarkerStyle(END_STYLE, END_ICON, 32, 1); @@ -151,9 +144,7 @@ public class KmlTrackWriter implements TrackWriter { @Override public void writeBeginWaypoints(Track track) { if (printWriter != null) { - printWriter.println("" - + StringUtils.formatCData(context.getString(R.string.track_markers, track.getName())) - + ""); + printWriter.println("" + StringUtils.formatCData(context.getString(R.string.track_markers, track.getName())) + ""); printWriter.println("1"); } } @@ -258,8 +249,7 @@ public class KmlTrackWriter implements TrackWriter { @Override public void writeLocation(Location location) { if (printWriter != null) { - printWriter.println( - "" + StringUtils.formatDateTimeIso8601(location.getTime()) + ""); + printWriter.println("" + StringUtils.formatDateTimeIso8601(location.getTime()) + ""); printWriter.println("" + getCoordinates(location, " ") + ""); if (location instanceof SensorDataSetLocation) { SensorDataSet sensorDataSet = ((SensorDataSetLocation) location).getSensorDataSet(); @@ -306,10 +296,8 @@ public class KmlTrackWriter implements TrackWriter { if (location != null) { printWriter.println(""); printWriter.println("" + StringUtils.formatCData(name) + ""); - printWriter.println( - "" + StringUtils.formatCData(description) + ""); - printWriter.println("" - + StringUtils.formatDateTimeIso8601(location.getTime()) + ""); + printWriter.println( "" + StringUtils.formatCData(description) + ""); + printWriter.println("" + StringUtils.formatDateTimeIso8601(location.getTime()) + ""); printWriter.println("#" + styleName + ""); writeCategory(category); printWriter.println(""); @@ -330,13 +318,11 @@ public class KmlTrackWriter implements TrackWriter { * @param photoUrl the photo url * @param heading the heading */ - private void writePhotoOverlay(String name, String category, String description, String styleName, - Location location, String photoUrl, float heading) { + private void writePhotoOverlay(String name, String category, String description, String styleName, Location location, String photoUrl, float heading) { if (location != null) { printWriter.println(""); printWriter.println("" + StringUtils.formatCData(name) + ""); - printWriter.println( - "" + StringUtils.formatCData(description) + ""); + printWriter.println( "" + StringUtils.formatCData(description) + ""); printWriter.print(""); printWriter.print("" + location.getLongitude() + ""); printWriter.print("" + location.getLatitude() + ""); @@ -344,16 +330,14 @@ public class KmlTrackWriter implements TrackWriter { printWriter.print("" + heading + ""); printWriter.print("90"); printWriter.println(""); - printWriter.println("" - + StringUtils.formatDateTimeIso8601(location.getTime()) + ""); + printWriter.println("" + StringUtils.formatDateTimeIso8601(location.getTime()) + ""); printWriter.println("#" + styleName + ""); writeCategory(category); if (playTrack) { printWriter.println("" + Uri.decode(photoUrl) + ""); } else { Uri uri = Uri.parse(photoUrl); - printWriter.println("" + KmzTrackExporter.KMZ_IMAGES_DIR + File.separatorChar - + uri.getLastPathSegment() + ""); + printWriter.println("" + KmzTrackExporter.KMZ_IMAGES_DIR + File.separatorChar + uri.getLastPathSegment() + ""); } printWriter.print(""); @@ -411,8 +395,7 @@ public class KmlTrackWriter implements TrackWriter { return; } printWriter.println(""); - printWriter.println( - "" + StringUtils.formatCData(category) + ""); + printWriter.println( "" + StringUtils.formatCData(category) + ""); printWriter.println(""); } @@ -441,8 +424,7 @@ public class KmlTrackWriter implements TrackWriter { printWriter.println(""); } diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java index 0ea2ad1de..4598d7f02 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java @@ -56,10 +56,8 @@ public class KmzTrackExporter implements TrackExporter { * @param contentProviderUtils the content provider utils * @param fileTrackExporter the file track exporter * @param tracks the tracks to export - * @param context the context */ - public KmzTrackExporter(ContentProviderUtils contentProviderUtils, - FileTrackExporter fileTrackExporter, Track[] tracks, Context context) { + public KmzTrackExporter(ContentProviderUtils contentProviderUtils, FileTrackExporter fileTrackExporter, Track[] tracks) { this.contentProviderUtils = contentProviderUtils; this.fileTrackExporter = fileTrackExporter; this.tracks = tracks; diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/SaveAsyncTask.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/SaveAsyncTask.java index 6f92c3b1a..8a91d28ea 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/SaveAsyncTask.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/SaveAsyncTask.java @@ -198,7 +198,7 @@ public class SaveAsyncTask extends AsyncTask { } }); - TrackExporter trackExporter = useKmz ? new KmzTrackExporter(contentProviderUtils, fileTrackExporter, tracks, context) : fileTrackExporter; + TrackExporter trackExporter = useKmz ? new KmzTrackExporter(contentProviderUtils, fileTrackExporter, tracks) : fileTrackExporter; String fileName = FileUtils.buildUniqueFileName(directory, track.getName(), extension); File file = new File(directory, fileName);