diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index 0a3504692..0183bd4cd 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -169,7 +169,7 @@ public class ExportImportTest { track = contentProviderUtils.getTrack(trackId); trackPoints = TestDataUtil.getTrackPoints(contentProviderUtils, trackId); markers = contentProviderUtils.getMarkers(trackId); - assertEquals(10, trackPoints.size()); + assertEquals(11, trackPoints.size()); assertEquals(2, markers.size()); } diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestRecording.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestRecording.java index da34baf32..e5b031596 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestRecording.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestRecording.java @@ -742,7 +742,7 @@ public class TrackRecordingServiceTestRecording { // when String sensor2 = "2020-02-02T02:02:04Z"; trackPointCreator.setClock(sensor2); - remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(2))); //TODO Should be ignored; distance should be added to the next TrackPoint + remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(2))); // when String gps1 = "2020-02-02T02:02:05Z"; @@ -765,7 +765,7 @@ public class TrackRecordingServiceTestRecording { // when String sensor5 = "2020-02-02T02:02:10Z"; trackPointCreator.setClock(sensor5); - remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(16))); + remoteSensorManager.onChanged(new SensorDataRunning("", "", Speed.of(5), null, Distance.of(16))); //Should be ignored // when String gps3 = "2020-02-02T02:02:12Z"; @@ -784,7 +784,7 @@ public class TrackRecordingServiceTestRecording { // then new TrackPointAssert().assertEquals(List.of( new TrackPoint(TrackPoint.Type.SEGMENT_START_MANUAL, Instant.parse(startTime)), - new TrackPoint(TrackPoint.Type.SENSORPOINT, Instant.parse(sensor2)) // TODO Should be ignored; is stored as it assumed to be first in current segment. + new TrackPoint(TrackPoint.Type.SENSORPOINT, Instant.parse(sensor2)) //First moving TrackPoint: store as the time might be interesting. .setSpeed(Speed.of(5)) .setSensorDistance(Distance.of(2)), new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse(gps1)) @@ -796,27 +796,21 @@ public class TrackRecordingServiceTestRecording { new TrackPoint(TrackPoint.Type.SENSORPOINT, Instant.parse(sensor3)) .setSpeed(Speed.of(5)) .setSensorDistance(Distance.of(10)), -/* -//TODO BUG Should be stored, but sensorDistance is used instead of distance to previous TRACKPOINT. + new TrackPoint(TrackPoint.Type.SENSORPOINT, Instant.parse(sensor5)) //TODO No need to store this TrackPoint, data could be merged into the next one + .setSpeed(Speed.of(5)) + .setSensorDistance(Distance.of(4)), new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse(gps3)) .setLatitude(45.001) .setLongitude(35) .setHorizontalAccuracy(Distance.of(1)) .setSpeed(Speed.of(5)) - .setSensorDistance(Distance.of(2)), + .setSensorDistance(Distance.of(0)), new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse(gps4)) .setLatitude(45.001) .setLongitude(35) .setHorizontalAccuracy(Distance.of(1)) .setSpeed(Speed.of(5)) - .setSensorDistance(Distance.of(2)), - */ - new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse(gps4)) - .setLatitude(45.001) - .setLongitude(35) - .setHorizontalAccuracy(Distance.of(1)) - .setSpeed(Speed.of(5)) - .setSensorDistance(Distance.of(4)), + .setSensorDistance(Distance.of(0)), new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, Instant.parse(stopTime)) .setSensorDistance(Distance.of(11)) .setSpeed(Speed.of(5)) diff --git a/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java b/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java index 4fdaa682c..a9c2fa65d 100644 --- a/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java +++ b/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java @@ -324,6 +324,11 @@ public class TrackPoint { if (hasSensorDistance()) { return getSensorDistance(); } + return distanceToPreviousFromLocation(previous); + } + + @NonNull + public Distance distanceToPreviousFromLocation(@NonNull TrackPoint previous) { if (!hasLocation() || hasLocation() != previous.hasLocation()) { throw new RuntimeException("Cannot compute distance."); } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java index 2d8e60868..cc7b86755 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java @@ -171,12 +171,14 @@ class TrackRecordingManager { Log.d(TAG, "Ignoring TrackPoint as it has no distance."); return false; } - TrackPoint distanceTo = lastStoredTrackPoint; + + Distance distanceToLastStoredTrackPoint; if (trackPoint.hasLocation() && !lastStoredTrackPoint.hasLocation()) { - distanceTo = lastStoredTrackPointWithLocation; + distanceToLastStoredTrackPoint = trackPoint.distanceToPreviousFromLocation(lastStoredTrackPointWithLocation); + } else { + distanceToLastStoredTrackPoint = trackPoint.distanceToPrevious(lastStoredTrackPoint); } - Distance distanceToLastStoredTrackPoint = trackPoint.distanceToPrevious(distanceTo); if (distanceToLastStoredTrackPoint.greaterThan(maxRecordingDistance)) { trackPoint.setType(TrackPoint.Type.SEGMENT_START_AUTOMATIC); insertTrackPoint(trackPoint);