diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java index cdf3d081c..8d22d32c7 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java @@ -187,7 +187,7 @@ public class TrackRecordingServiceTestLocation { TrackRecordingServiceTest.newTrackPoint(service, 45.000002, 35.0, 3, 15); TrackRecordingServiceTest.newTrackPoint(service, 45.000003, 35.0, 4, 15); TrackRecordingServiceTest.newTrackPoint(service, 45.000004, 35.0, 5, 15); - TrackRecordingServiceTest.newTrackPoint(service, 45.0002, 35.0, 6, 15); + TrackRecordingServiceTest.newTrackPoint(service, 45.000005, 35.0, 6, 15); service.endCurrentTrack(); @@ -207,7 +207,7 @@ public class TrackRecordingServiceTestLocation { .setAltitudeGain(0f) .setAltitudeLoss(0f), new TrackPoint(TrackPoint.Type.TRACKPOINT, null) - .setLatitude(45.0002) + .setLatitude(45.0005) .setLongitude(35) .setHorizontalAccuracy(Distance.of(6)) .setSpeed(Speed.of(15)) @@ -217,9 +217,6 @@ public class TrackRecordingServiceTestLocation { .setAltitudeGain(0f) .setAltitudeLoss(0f) ), trackPoints); - - - } @MediumTest @@ -254,6 +251,13 @@ public class TrackRecordingServiceTestLocation { .setSpeed(Speed.of(0)) .setAltitudeGain(0f) .setAltitudeLoss(0f), + new TrackPoint(TrackPoint.Type.TRACKPOINT, null) + .setLatitude(45) + .setLongitude(35) + .setHorizontalAccuracy(Distance.of(6)) + .setSpeed(Speed.of(0)) + .setAltitudeGain(0f) + .setAltitudeLoss(0f), new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, null) .setAltitudeGain(0f) .setAltitudeLoss(0f) @@ -293,6 +297,13 @@ public class TrackRecordingServiceTestLocation { .setSpeed(Speed.of(15)) .setAltitudeGain(0f) .setAltitudeLoss(0f), + new TrackPoint(TrackPoint.Type.TRACKPOINT, null) + .setLatitude(45) + .setLongitude(35) + .setHorizontalAccuracy(Distance.of(6)) + .setSpeed(Speed.of(15)) + .setAltitudeGain(0f) + .setAltitudeLoss(0f), new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, null) .setAltitudeGain(0f) .setAltitudeLoss(0f) @@ -419,12 +430,20 @@ public class TrackRecordingServiceTestLocation { .setHorizontalAccuracy(Distance.of(2)) .setSpeed(Speed.of(5)) .setSensorDistance(Distance.of(10)), + new TrackPoint(TrackPoint.Type.TRACKPOINT, null) + .setLatitude(45) + .setLongitude(35) + .setHorizontalAccuracy(Distance.of(4)) + .setSpeed(Speed.of(5)) + .setAltitudeGain(6f) + .setAltitudeLoss(6f) + .setSensorDistance(Distance.of(2)), new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, null) .setSensorDistance(Distance.of(11)) .setSpeed(Speed.of(5)) - .setAltitudeGain(12f) - .setAltitudeLoss(12f) - .setSensorDistance(Distance.of(4)) + .setAltitudeGain(6f) + .setAltitudeLoss(6f) + .setSensorDistance(Distance.of(2)) ), trackPoints); } @@ -468,6 +487,13 @@ public class TrackRecordingServiceTestLocation { .setSpeed(Speed.of(0)) .setAltitudeGain(0f) .setAltitudeLoss(0f), + new TrackPoint(TrackPoint.Type.TRACKPOINT, null) + .setLatitude(45.1) + .setLongitude(35) + .setHorizontalAccuracy(Distance.of(3)) + .setSpeed(Speed.of(0)) + .setAltitudeGain(0f) + .setAltitudeLoss(0f), new TrackPoint(TrackPoint.Type.SEGMENT_START_AUTOMATIC, null) .setLatitude(45.2) @@ -476,6 +502,13 @@ public class TrackRecordingServiceTestLocation { .setSpeed(Speed.of(0)) .setAltitudeGain(0f) .setAltitudeLoss(0f), + new TrackPoint(TrackPoint.Type.TRACKPOINT, null) + .setLatitude(45.2) + .setLongitude(35) + .setHorizontalAccuracy(Distance.of(5)) + .setSpeed(Speed.of(0)) + .setAltitudeGain(0f) + .setAltitudeLoss(0f), new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, null) .setAltitudeGain(0f) .setAltitudeLoss(0f) 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 2ebe6cbe2..09b1473d8 100644 --- a/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java +++ b/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java @@ -349,6 +349,19 @@ public class TrackPoint { return this; } + public TrackPoint minusCumulativeSensorData(@NonNull TrackPoint lastTrackPoint) { + if (hasSensorDistance() && lastTrackPoint.hasSensorDistance()) { + sensorDistance = sensorDistance.minus(lastTrackPoint.getSensorDistance()); + } + if (hasAltitudeGain() && lastTrackPoint.hasAltitudeGain()) { + altitudeGain_m -= lastTrackPoint.altitudeGain_m; + } + if (hasAltitudeLoss() && lastTrackPoint.hasAltitudeLoss()) { + altitudeLoss_m -= lastTrackPoint.altitudeLoss_m; + } + return this; + } + public boolean hasSensorData() { return hasHeartRate() || hasCadence() || hasPower(); } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java index 2739909f5..4f2b48265 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java @@ -37,6 +37,7 @@ class TrackRecordingManager { private TrackStatisticsUpdater trackStatisticsUpdater; private boolean currentSegmentHasTrackPoint; + private TrackPoint lastTrackPoint; private TrackPoint lastStoredTrackPoint; TrackRecordingManager(Context context) { @@ -80,11 +81,13 @@ class TrackRecordingManager { trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics()); insertTrackPoint(trackId, segmentStartTrackPoint); currentSegmentHasTrackPoint = false; + lastTrackPoint = null; lastStoredTrackPoint = null; } void pause(TrackPointCreator trackPointCreator) { insertTrackPoint(trackId, trackPointCreator.createSegmentEnd()); currentSegmentHasTrackPoint = false; + lastTrackPoint = null; lastStoredTrackPoint = null; } @@ -94,6 +97,7 @@ class TrackRecordingManager { trackId = null; trackStatisticsUpdater = null; + lastTrackPoint = null; lastStoredTrackPoint = null; currentSegmentHasTrackPoint = false; } @@ -103,7 +107,7 @@ class TrackRecordingManager { return null; } TrackStatisticsUpdater tmpTrackStatisticsUpdater = new TrackStatisticsUpdater(trackStatisticsUpdater); - Pair current = trackPointCreator.createCurrentTrackPoint(lastStoredTrackPoint); + Pair current = trackPointCreator.createCurrentTrackPoint(lastTrackPoint); tmpTrackStatisticsUpdater.addTrackPoint(current.first, recordingDistanceInterval); @@ -168,6 +172,7 @@ class TrackRecordingManager { } Log.d(TAG, "Not recording TrackPoint, idle"); + lastTrackPoint = trackPoint; return false; } @@ -176,6 +181,22 @@ class TrackRecordingManager { } private void insertTrackPoint(@NonNull Track.Id trackId, @NonNull TrackPoint trackPoint) { + if (lastTrackPoint != null) { + if (lastStoredTrackPoint != null && lastTrackPoint.getTime().equals(lastStoredTrackPoint.getTime())) { + // Do not insert if inserted already + Log.w(TAG, "Ignore insertTrackPoint. trackPoint time same as last valid trackId point time."); + } else { + insertTrackPointHelper(trackId, lastTrackPoint); + // Remove the sensorDistance from trackPoint that is already going be stored with lastTrackPoint. + trackPoint.minusCumulativeSensorData(lastTrackPoint); + } + lastTrackPoint = null; + } + + insertTrackPointHelper(trackId, trackPoint); + } + + private void insertTrackPointHelper(@NonNull Track.Id trackId, @NonNull TrackPoint trackPoint) { try { contentProviderUtils.insertTrackPoint(trackPoint, trackId); trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);