From 5b2d9a5773b6a3f8fc366741bf85dc84080375c1 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Tue, 1 Jun 2021 17:45:23 +0200 Subject: [PATCH] Import: re-order TrackPoints by time, so statistics can be computed. Fixes #796. --- .../io/file/importer/KMLImportTest.java | 34 +++++++++++++++++++ .../res/raw/kml22_order_location_and_when.kml | 1 - .../res/raw/kml22_time_decreases.kml | 20 +++++++++++ .../io/file/importer/TrackImporter.java | 14 ++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/androidTest/res/raw/kml22_time_decreases.kml diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/KMLImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/KMLImportTest.java index 4b4ab96ad..a68f6e49b 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/KMLImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/KMLImportTest.java @@ -87,6 +87,40 @@ public class KMLImportTest { GPXImportTest.assertTrackpoint(importedTrackPoints.get(4), TrackPoint.Type.SEGMENT_END_MANUAL, "2021-05-29T18:06:22.512Z", null, null, null); } + /** + * Coordinates / when might not be ordered by increasing time. + */ + @LargeTest + @Test + public void kml22_time_decreases() throws IOException { + // given + XMLImporter importer = new XMLImporter(new KmlTrackImporter(context, trackImporter)); + InputStream inputStream = InstrumentationRegistry.getInstrumentation().getContext().getResources().openRawResource(de.dennisguse.opentracks.debug.test.R.raw.kml22_time_decreases); + + // when + // 1. import + importTrackId = importer.importFile(inputStream).get(0); + + // then + // 1. track + Track importedTrack = contentProviderUtils.getTrack(importTrackId); + assertNotNull(importedTrack); + assertEquals("", importedTrack.getCategory()); + assertEquals("", importedTrack.getDescription()); + assertEquals("", importedTrack.getName()); + assertEquals("", importedTrack.getIcon()); + + // 2. markers + assertEquals(0, contentProviderUtils.getMarkerCount(importTrackId)); + + // 3. trackpoints + List importedTrackPoints = TestDataUtil.getTrackPoints(contentProviderUtils, importTrackId); + assertEquals(2, importedTrackPoints.size()); + + GPXImportTest.assertTrackpoint(importedTrackPoints.get(0), TrackPoint.Type.TRACKPOINT, "2021-05-29T18:06:21.767Z", 14.0, 3.0, 10.0); + GPXImportTest.assertTrackpoint(importedTrackPoints.get(1), TrackPoint.Type.SEGMENT_START_MANUAL, "2021-05-29T18:06:22.042Z", null, null, null); + } + /** * Check that data with statistics markers is imported and those ignored. * Statistics marker were created to avoid recomputing the track statistics (e.g., distance until a certain time). diff --git a/src/androidTest/res/raw/kml22_order_location_and_when.kml b/src/androidTest/res/raw/kml22_order_location_and_when.kml index 4a6ea8f87..c29554d78 100644 --- a/src/androidTest/res/raw/kml22_order_location_and_when.kml +++ b/src/androidTest/res/raw/kml22_order_location_and_when.kml @@ -9,7 +9,6 @@ 1 2021-05-29T18:06:21.767Z - 14.0 3.0 10.0 diff --git a/src/androidTest/res/raw/kml22_time_decreases.kml b/src/androidTest/res/raw/kml22_time_decreases.kml new file mode 100644 index 000000000..702884574 --- /dev/null +++ b/src/androidTest/res/raw/kml22_time_decreases.kml @@ -0,0 +1,20 @@ + + + + + + absolute + 1 + + 2021-05-29T18:06:22.042Z + + + 2021-05-29T18:06:21.767Z + 14.0 3.0 10.0 + + + + + \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java index 82b42e493..88a0527a5 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java @@ -12,6 +12,7 @@ import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.UUID; @@ -139,6 +140,19 @@ public class TrackImporter { track.setUuid(UUID.randomUUID()); } + Collections.sort(trackPoints, new Comparator() { + @Override + public int compare(TrackPoint o1, TrackPoint o2) { + if (o1.getTime().isBefore(o2.getTime())) { + return -1; + } + if (o1.getTime().isAfter(o2.getTime())) { + return 1; + } + return 0; + } + }); + TrackStatisticsUpdater updater = new TrackStatisticsUpdater(); updater.addTrackPoints(trackPoints, recordingDistanceInterval); track.setTrackStatistics(updater.getTrackStatistics());