diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/LegacyImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/LegacyImportTest.java index a52bbe0ea..397415fee 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/LegacyImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/LegacyImportTest.java @@ -83,6 +83,21 @@ public class LegacyImportTest { assertTrackpoint(importedTrackPoints.get(5), TrackPoint.Type.TRACKPOINT, "2020-11-28T17:07:20.870Z", 1.234046, 12.340082, 417.99432373046875); } + /** + * At least one valid location is required. + * Before v3.15.0, Tracks without TrackPoints could be created; such tracks cannot be imported as we cannot restore the TrackStatistics (especially startTime and stopTime). + */ + @LargeTest + @Test(expected = ImportParserException.class) + public void kml_without_locations() { + // given + KmlFileTrackImporter trackImporter = new KmlFileTrackImporter(context); + InputStream inputStream = InstrumentationRegistry.getInstrumentation().getContext().getResources().openRawResource(de.dennisguse.opentracks.debug.test.R.raw.legacy_kml_empty); + + // when + importTrackId = trackImporter.importFile(inputStream); + } + /** * Check that data that contains pause (lat=100, lng=0) and resume (lat=200, lng=0) locations are restored to a segment break. */ diff --git a/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdaterTest.java b/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdaterTest.java index 3c721f46d..186c46fb9 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdaterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdaterTest.java @@ -29,7 +29,7 @@ public class TrackStatisticsUpdaterTest { assertEquals(2.5, statistics.getMinElevation(), 0.01); assertEquals(27.5, statistics.getMaxElevation(), 0.01); assertEquals(18.0, statistics.getTotalElevationGain(), 0.01); - assertEquals(72.0, statistics.getTotalElevationLoss(), 0.01); + assertEquals(18.0, statistics.getTotalElevationLoss(), 0.01); assertEquals(14.226, statistics.getMaxSpeed(), 0.01); assertEquals(14.226, statistics.getAverageMovingSpeed(), 0.01); diff --git a/src/androidTest/res/raw/legacy_kml_empty.kml b/src/androidTest/res/raw/legacy_kml_empty.kml new file mode 100644 index 000000000..ee27ceca6 --- /dev/null +++ b/src/androidTest/res/raw/legacy_kml_empty.kml @@ -0,0 +1,62 @@ + + + +1 +1 + + + + + + + + + + + + + + + + + + + + + + + + +9316e527-a5b8-47c5-bdbd-954b4be7d80e +#track + + + + +absolute +1 + + + + \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java index 5f98dada4..5288d4322 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java @@ -257,6 +257,9 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track for (TrackPoint trackPoint : trackData.bufferedTrackPoints) { statistics.addTrackPoint(trackPoint, recordingDistanceInterval); } + if (!statistics.isTrackInitialized()) { + throw new ImportParserException("Track did not contain any locations."); + } trackData.track.setTrackStatistics(statistics.getTrackStatistics()); Track track = contentProviderUtils.getTrack(trackData.track.getUuid()); diff --git a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java index 0a6b09de1..93ff888df 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java +++ b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java @@ -97,6 +97,10 @@ public class TrackStatisticsUpdater { return stats; } + public boolean isTrackInitialized() { + return trackInitialized; + } + /** * Adds a trackPoint. *