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 f28ae7cca..05b6c277e 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 @@ -172,7 +172,7 @@ public class ExportImportTest { track = contentProviderUtils.getTrack(trackId); trackPoints = TestDataUtil.getTrackPoints(contentProviderUtils, trackId); markers = contentProviderUtils.getMarkers(trackId); - assertEquals(11, trackPoints.size()); + assertEquals(10, 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 a71233cab..4d2b01e71 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestRecording.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestRecording.java @@ -612,6 +612,55 @@ public class TrackRecordingServiceTestRecording { ), TestDataUtil.getTrackPoints(contentProviderUtils, trackId)); } + @MediumTest + @Test + public void testRecording_gpsOnly_recordingDistance_movement_non_idle() { + // given + String startTime = "2020-02-02T02:02:02Z"; + TrackPointCreator trackPointCreator = service.getTrackPointCreator(); + trackPointCreator.setClock(startTime); + Track.Id trackId = service.startNewTrack(); + trackPointCreator.setAltitudeSumManager(altitudeSumManager); + + // when + String gps1 = "2020-02-02T02:02:03Z"; + TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps1, 45.0, 35.0, 1, 15); + + // when - will be ignored + String gps2 = "2020-02-02T02:02:04Z"; + TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps2, 45.0, 35.0, 1, 15); + + // when + String gps3 = "2020-02-02T02:02:05Z"; + TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps3, 45.0001, 35.0, 1, 15); + + // when + String stopTime = "2020-02-02T02:02:12Z"; + trackPointCreator.setClock(stopTime); + service.endCurrentTrack(); + + // then + new TrackPointAssert().assertEquals(List.of( + new TrackPoint(TrackPoint.Type.SEGMENT_START_MANUAL, Instant.parse(startTime)), + new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse(gps1)) + .setLatitude(45) + .setLongitude(35) + .setHorizontalAccuracy(Distance.of(1)) + .setAltitudeGain(0f) + .setAltitudeLoss(0f) + .setSpeed(Speed.of(15)), + new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse(gps3)) + .setLatitude(45) + .setLongitude(35) + .setHorizontalAccuracy(Distance.of(1)) + .setAltitudeGain(0f) + .setAltitudeLoss(0f) + .setSpeed(Speed.of(15)), + new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, Instant.parse(stopTime)) + .setAltitudeGain(0f) + .setAltitudeLoss(0f) + ), TestDataUtil.getTrackPoints(contentProviderUtils, trackId)); + } @MediumTest @Test @@ -796,15 +845,12 @@ public class TrackRecordingServiceTestRecording { new TrackPoint(TrackPoint.Type.SENSORPOINT, Instant.parse(sensor3)) .setSpeed(Speed.of(5)) .setSensorDistance(Distance.of(10)), - 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(0)), + .setSensorDistance(Distance.of(4.0)), new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse(gps4)) .setLatitude(45.001) .setLongitude(35) diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java index 1a8132d2a..347420b9b 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java @@ -98,14 +98,14 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang } void pause(TrackPointCreator trackPointCreator) { - insertTrackPoint(trackPointCreator.createSegmentEnd()); + insertTrackPoint(trackPointCreator.createSegmentEnd(), true); reset(); } void end(TrackPointCreator trackPointCreator) { TrackPoint segmentEnd = trackPointCreator.createSegmentEnd(); - insertTrackPoint(segmentEnd); + insertTrackPoint(segmentEnd, true); trackId = null; trackStatisticsUpdater = null; @@ -172,12 +172,12 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang // Always insert the first segment location if (lastStoredTrackPoint == null) { - insertTrackPoint(trackPoint); + insertTrackPoint(trackPoint, true); return true; } if (trackPoint.hasLocation() && lastStoredTrackPointWithLocation == null) { - insertTrackPoint(trackPoint); + insertTrackPoint(trackPoint, true); return true; } @@ -195,19 +195,19 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang if (distanceToLastStoredTrackPoint.greaterThan(maxRecordingDistance)) { trackPoint.setType(TrackPoint.Type.SEGMENT_START_AUTOMATIC); - insertTrackPoint(trackPoint); + insertTrackPoint(trackPoint, true); return true; } if (distanceToLastStoredTrackPoint.greaterOrEqualThan(recordingDistanceInterval) && trackPoint.isMoving()) { - insertTrackPoint(trackPoint); + insertTrackPoint(trackPoint, false); return true; } if (trackPoint.isMoving() != lastStoredTrackPoint.isMoving()) { // Moving from non-moving to moving or vice versa; required to compute moving time correctly. - insertTrackPoint(trackPoint); + insertTrackPoint(trackPoint, true); return true; } @@ -221,8 +221,8 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang return trackStatisticsUpdater.getTrackStatistics(); } - private void insertTrackPoint(@NonNull TrackPoint trackPoint) { - if (lastTrackPoint != null) { + private void insertTrackPoint(@NonNull TrackPoint trackPoint, boolean storeLastTrackPointIfUseful) { + if (storeLastTrackPointIfUseful && 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."); @@ -231,8 +231,8 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang // Remove the sensorDistance from trackPoint that is already going be stored with lastTrackPoint. trackPoint.minusCumulativeSensorData(lastTrackPoint); } - lastTrackPoint = null; } + lastTrackPoint = null; insertTrackPointHelper(trackPoint); }