From 23bcbf09a585a5ee50d71d87d36e3400118b71d7 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Wed, 20 Oct 2021 21:31:17 +0200 Subject: [PATCH] GPX importer supports speed without namespace (compatibility with other tools). Fixed #774. --- .../io/file/importer/GPXImportTest.java | 50 +++++++++++++++++++ .../res/raw/gpx11_with_speed_no_namespace.gpx | 26 ++++++++++ .../io/file/importer/GpxTrackImporter.java | 5 ++ 3 files changed, 81 insertions(+) create mode 100644 src/androidTest/res/raw/gpx11_with_speed_no_namespace.gpx diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXImportTest.java index 9b2c5e54c..3466aa374 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXImportTest.java @@ -158,4 +158,54 @@ public class GPXImportTest { .setSpeed(Speed.of(0.7224021553993225)) ), importedTrackPoints); } + + @LargeTest + @Test + public void gpx_speed_no_namespace() throws IOException { + // given + XMLImporter importer = new XMLImporter(new GpxTrackImporter(context, trackImporter)); + InputStream inputStream = InstrumentationRegistry.getInstrumentation().getContext().getResources().openRawResource(de.dennisguse.opentracks.debug.test.R.raw.gpx11_with_speed_no_namespace); + + // when + // 1. import + importTrackId = importer.importFile(inputStream).get(0); + + // then + // 2. track + Track importedTrack = contentProviderUtils.getTrack(importTrackId); + assertNotNull(importedTrack); + assertEquals("", importedTrack.getCategory()); + assertEquals("", importedTrack.getDescription()); + assertEquals("20210907_213924.gpx", importedTrack.getName()); + assertEquals("", importedTrack.getIcon()); + + // 3. trackstatistics + TrackStatistics trackStatistics = importedTrack.getTrackStatistics(); + assertEquals(4, trackStatistics.getMaxSpeed().toMPS(), 0.01); + assertEquals(Duration.ofSeconds(101), trackStatistics.getMovingTime()); + + // 4. trackpoints + List importedTrackPoints = TestDataUtil.getTrackPoints(contentProviderUtils, importTrackId); + assertEquals(3, importedTrackPoints.size()); + + TrackPointAssert a = new TrackPointAssert(); + a.assertEquals(List.of( + new TrackPoint(TrackPoint.Type.SEGMENT_START_AUTOMATIC, Instant.parse("2021-09-07T22:10:19Z")) + .setLatitude(30.14185982) + .setLongitude(-40.3863038) + .setAltitude(-5) + .setSpeed(Speed.of(5)), + new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse("2021-09-07T22:11:07Z")) + .setLatitude(30.14184657) + .setLongitude(-40.38670089) + .setAltitude(-5) + .setSpeed(Speed.of(0.7976524233818054)) + .setSpeed(Speed.of(4)), + new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse("2021-09-07T22:12:00Z")) + .setLatitude(30.14185982) + .setLongitude(-40.3863038) + .setAltitude(-5) + .setSpeed(Speed.of(3)) + ), importedTrackPoints); + } } \ No newline at end of file diff --git a/src/androidTest/res/raw/gpx11_with_speed_no_namespace.gpx b/src/androidTest/res/raw/gpx11_with_speed_no_namespace.gpx new file mode 100644 index 000000000..5f6566030 --- /dev/null +++ b/src/androidTest/res/raw/gpx11_with_speed_no_namespace.gpx @@ -0,0 +1,26 @@ + + + + 20210907_213924.gpx + + + -5 + + 4 + 5 + + + -5 + + 4 + 4 + + + -5 + + 4 + 3 + + + + \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/GpxTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/GpxTrackImporter.java index 3af2f2b6d..fc0bf3616 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/GpxTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/GpxTrackImporter.java @@ -70,6 +70,10 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac private static final String ATTRIBUTE_LON = "lon"; private static final String TAG_EXTENSION_SPEED = "gpxtpx:speed"; + /** + * Often speed is exported without the proper namespace. + */ + private static final String TAG_EXTENSION_SPEED_COMPAT = "speed"; private static final String TAG_EXTENSION_HEARTRATE = "gpxtpx:hr"; private static final String TAG_EXTENSION_CADENCE = "gpxtpx:cad"; private static final String TAG_EXTENSION_POWER = "pwr:PowerInWatts"; @@ -192,6 +196,7 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac } break; case TAG_EXTENSION_SPEED: + case TAG_EXTENSION_SPEED_COMPAT: if (content != null) { speed = content.trim(); }