From 47b2d0748a389a71059fb95be75c79342bce19b4 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Fri, 25 Dec 2020 20:27:45 +0100 Subject: [PATCH] Segments: only insert one trackpoint and set the type. Existing data is not migrated. #316. --- .../services/TrackRecordingServiceTest.java | 34 +++++ .../TrackRecordingServiceTestLocation.java | 122 +++++++++++------- .../opentracks/content/data/TrackPoint.java | 21 +-- .../services/TrackRecordingService.java | 2 +- 4 files changed, 117 insertions(+), 62 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java index b9d7b6cef..cf0d47600 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java @@ -180,6 +180,40 @@ public class TrackRecordingServiceTest { assertTrue(service.isRecording()); } + @MediumTest + @Test + public void testRecording_start() throws TimeoutException, InterruptedException { + // given + TrackRecordingServiceInterface service = ((TrackRecordingServiceInterface) mServiceRule.bindService(createStartIntent(context))); + + // when + Track.Id trackId = service.startNewTrack(); + + // then + List trackPoints = contentProviderUtils.getTrackPoints(trackId); + + assertEquals(1, trackPoints.size()); + assertEquals(TrackPoint.Type.SEGMENT_START_MANUAL, trackPoints.get(0).getType()); + } + + @MediumTest + @Test + public void testRecording_stop() throws TimeoutException, InterruptedException { + // given + TrackRecordingServiceInterface service = ((TrackRecordingServiceInterface) mServiceRule.bindService(createStartIntent(context))); + Track.Id trackId = service.startNewTrack(); + + // when + service.endCurrentTrack(); + + // then + List trackPoints = contentProviderUtils.getTrackPoints(trackId); + + assertEquals(2, trackPoints.size()); + assertEquals(TrackPoint.Type.SEGMENT_START_MANUAL, trackPoints.get(0).getType()); + assertEquals(TrackPoint.Type.SEGMENT_END_MANUAL, trackPoints.get(1).getType()); + } + @MediumTest @Test public void testRecording_pauseAndResume() throws TimeoutException, InterruptedException { diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java index 4170829c4..dff66de11 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java @@ -4,6 +4,7 @@ import android.content.ContentProvider; import android.content.Context; import android.content.SharedPreferences; import android.os.Looper; +import android.util.Pair; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -91,12 +92,12 @@ public class TrackRecordingServiceTestLocation { Track.Id trackId = service.startNewTrack(); // when - TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 5, 15); - TrackRecordingServiceTest.newTrackPoint(service, 45.0001, 35.0, 5, 15); - TrackRecordingServiceTest.newTrackPoint(service, 45.0002, 35.0, 5, 15); - TrackRecordingServiceTest.newTrackPoint(service, 45.0003, 35.0, 5, 15); + TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 1, 15); + TrackRecordingServiceTest.newTrackPoint(service, 45.0001, 35.0, 2, 15); + TrackRecordingServiceTest.newTrackPoint(service, 45.0002, 35.0, 3, 15); + TrackRecordingServiceTest.newTrackPoint(service, 45.0003, 35.0, 4, 15); TrackRecordingServiceTest.newTrackPoint(service, 45.0004, 35.0, 5, 15); - TrackRecordingServiceTest.newTrackPoint(service, 45.0005, 35.0, 5, 15); + TrackRecordingServiceTest.newTrackPoint(service, 45.0005, 35.0, 6, 15); service.endCurrentTrack(); @@ -105,9 +106,16 @@ public class TrackRecordingServiceTestLocation { List trackPoints = contentProviderUtils.getTrackPoints(trackId); assertEquals(8, trackPoints.size()); - assertEquals(TrackPoint.Type.SEGMENT_START_MANUAL, trackPoints.get(0).getType()); - assertEquals(45.0005, trackPoints.get(6).getLatitude(), 0.01); - assertEquals(TrackPoint.Type.SEGMENT_END_MANUAL, trackPoints.get(7).getType()); + assertTrackPoints(List.of( + new Pair<>(TrackPoint.Type.SEGMENT_START_MANUAL, null), + new Pair<>(TrackPoint.Type.TRACKPOINT, 1), + new Pair<>(TrackPoint.Type.TRACKPOINT, 2), + new Pair<>(TrackPoint.Type.TRACKPOINT, 3), + new Pair<>(TrackPoint.Type.TRACKPOINT, 4), + new Pair<>(TrackPoint.Type.TRACKPOINT, 5), + new Pair<>(TrackPoint.Type.TRACKPOINT, 6), + new Pair<>(TrackPoint.Type.SEGMENT_END_MANUAL, null) + ), trackPoints); } @MediumTest @@ -118,12 +126,12 @@ public class TrackRecordingServiceTestLocation { assertNotNull(trackId); // when - TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 5, 15); - TrackRecordingServiceTest.newTrackPoint(service, 45.000001, 35.0, 5, 15); - TrackRecordingServiceTest.newTrackPoint(service, 45.000002, 35.0, 5, 15); - TrackRecordingServiceTest.newTrackPoint(service, 45.000003, 35.0, 5, 15); + TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 1, 15); + TrackRecordingServiceTest.newTrackPoint(service, 45.000001, 35.0, 2, 15); + 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.000005, 35.0, 5, 15); + TrackRecordingServiceTest.newTrackPoint(service, 45.000005, 35.0, 6, 15); service.endCurrentTrack(); @@ -132,9 +140,12 @@ public class TrackRecordingServiceTestLocation { List trackPoints = contentProviderUtils.getTrackPoints(trackId); assertEquals(4, trackPoints.size()); - assertEquals(TrackPoint.Type.SEGMENT_START_MANUAL, trackPoints.get(0).getType()); - assertEquals(45.000005, trackPoints.get(2).getLatitude(), 0.01); - assertEquals(TrackPoint.Type.SEGMENT_END_MANUAL, trackPoints.get(3).getType()); + assertTrackPoints(List.of( + new Pair<>(TrackPoint.Type.SEGMENT_START_MANUAL, null), + new Pair<>(TrackPoint.Type.TRACKPOINT, 1), + new Pair<>(TrackPoint.Type.TRACKPOINT, 6), + new Pair<>(TrackPoint.Type.SEGMENT_END_MANUAL, null) + ), trackPoints); } // @MediumTest @@ -175,12 +186,13 @@ public class TrackRecordingServiceTestLocation { assertFalse(service.isRecording()); List trackPoints = contentProviderUtils.getTrackPoints(trackId); - assertEquals(5, trackPoints.size()); - assertEquals(TrackPoint.Type.SEGMENT_START_MANUAL, trackPoints.get(0).getType()); - assertEquals(1, trackPoints.get(1).getAccuracy(), 0.01); - assertEquals(2, trackPoints.get(2).getAccuracy(), 0.01); - assertEquals(6, trackPoints.get(3).getAccuracy(), 0.01); - assertEquals(TrackPoint.Type.SEGMENT_END_MANUAL, trackPoints.get(4).getType()); + assertTrackPoints(List.of( + new Pair<>(TrackPoint.Type.SEGMENT_START_MANUAL, null), + new Pair<>(TrackPoint.Type.TRACKPOINT, 1), + new Pair<>(TrackPoint.Type.TRACKPOINT, 2), + new Pair<>(TrackPoint.Type.TRACKPOINT, 6), + new Pair<>(TrackPoint.Type.SEGMENT_END_MANUAL, null) + ), trackPoints); } @MediumTest @@ -204,12 +216,14 @@ public class TrackRecordingServiceTestLocation { List trackPoints = contentProviderUtils.getTrackPoints(trackId); assertEquals(6, trackPoints.size()); - assertEquals(TrackPoint.Type.SEGMENT_START_MANUAL, trackPoints.get(0).getType()); - assertEquals(1, trackPoints.get(1).getAccuracy(), 0.01); - assertEquals(2, trackPoints.get(2).getAccuracy(), 0.01); - assertEquals(5, trackPoints.get(3).getAccuracy(), 0.01); //TODO Check why this trackPoint is inserted. - assertEquals(6, trackPoints.get(4).getAccuracy(), 0.01); - assertEquals(TrackPoint.Type.SEGMENT_END_MANUAL, trackPoints.get(5).getType()); + assertTrackPoints(List.of( + new Pair<>(TrackPoint.Type.SEGMENT_START_MANUAL, null), + new Pair<>(TrackPoint.Type.TRACKPOINT, 1), + new Pair<>(TrackPoint.Type.TRACKPOINT, 2), + new Pair<>(TrackPoint.Type.TRACKPOINT, 5), //TODO Check why this trackPoint is inserted. + new Pair<>(TrackPoint.Type.TRACKPOINT, 6), + new Pair<>(TrackPoint.Type.SEGMENT_END_MANUAL, null) + ), trackPoints); } @MediumTest @@ -234,12 +248,12 @@ public class TrackRecordingServiceTestLocation { }); // when - TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 0, 0); TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 1, 0); TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 2, 0); TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 3, 0); TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 4, 0); TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 5, 0); + TrackRecordingServiceTest.newTrackPoint(service, 45.0, 35.0, 6, 0); service.endCurrentTrack(); @@ -248,14 +262,16 @@ public class TrackRecordingServiceTestLocation { List trackPoints = contentProviderUtils.getTrackPoints(trackId); assertEquals(8, trackPoints.size()); - assertEquals(TrackPoint.Type.SEGMENT_START_MANUAL, trackPoints.get(0).getType()); - assertEquals(0, trackPoints.get(1).getAccuracy(), 0.01); - assertEquals(1, trackPoints.get(2).getAccuracy(), 0.01); - assertEquals(2, trackPoints.get(3).getAccuracy(), 0.01); - assertEquals(3, trackPoints.get(4).getAccuracy(), 0.01); - assertEquals(4, trackPoints.get(5).getAccuracy(), 0.01); - assertEquals(5, trackPoints.get(6).getAccuracy(), 0.01); - assertEquals(TrackPoint.Type.SEGMENT_END_MANUAL, trackPoints.get(7).getType()); + assertTrackPoints(List.of( + new Pair<>(TrackPoint.Type.SEGMENT_START_MANUAL, null), + new Pair<>(TrackPoint.Type.TRACKPOINT, 1), + new Pair<>(TrackPoint.Type.TRACKPOINT, 2), + new Pair<>(TrackPoint.Type.TRACKPOINT, 3), + new Pair<>(TrackPoint.Type.TRACKPOINT, 4), + new Pair<>(TrackPoint.Type.TRACKPOINT, 5), + new Pair<>(TrackPoint.Type.TRACKPOINT, 6), + new Pair<>(TrackPoint.Type.SEGMENT_END_MANUAL, null) + ), trackPoints); } @MediumTest @@ -277,15 +293,27 @@ public class TrackRecordingServiceTestLocation { assertFalse(service.isRecording()); List trackPoints = contentProviderUtils.getTrackPoints(trackId); - assertEquals(9, trackPoints.size()); - assertEquals(TrackPoint.Type.SEGMENT_START_MANUAL, trackPoints.get(0).getType()); - assertEquals(1, trackPoints.get(1).getAccuracy(), 0.01); - assertEquals(TrackPoint.Type.SEGMENT_END_MANUAL, trackPoints.get(2).getType()); - assertEquals(2, trackPoints.get(3).getAccuracy(), 0.01); - assertEquals(3, trackPoints.get(4).getAccuracy(), 0.01); - assertEquals(TrackPoint.Type.SEGMENT_END_MANUAL, trackPoints.get(5).getType()); - assertEquals(4, trackPoints.get(6).getAccuracy(), 0.01); - assertEquals(5, trackPoints.get(7).getAccuracy(), 0.01); - assertEquals(TrackPoint.Type.SEGMENT_END_MANUAL, trackPoints.get(8).getType()); + assertEquals(7, trackPoints.size()); + assertTrackPoints(List.of( + new Pair<>(TrackPoint.Type.SEGMENT_START_MANUAL, null), + new Pair<>(TrackPoint.Type.TRACKPOINT, 1), + + new Pair<>(TrackPoint.Type.SEGMENT_START_AUTOMATIC, 2), + new Pair<>(TrackPoint.Type.TRACKPOINT, 3), + + new Pair<>(TrackPoint.Type.SEGMENT_START_AUTOMATIC, 4), + new Pair<>(TrackPoint.Type.TRACKPOINT, 5), + new Pair<>(TrackPoint.Type.SEGMENT_END_MANUAL, null) + ), trackPoints); + } + + private void assertTrackPoints(List> typeAndAccuracy, List actual) { + assertEquals(typeAndAccuracy.size(), actual.size()); + for (int i = 0; i < typeAndAccuracy.size(); i++) { + assertEquals(typeAndAccuracy.get(i).first, actual.get(i).getType()); + if (typeAndAccuracy.get(i).second != null) { + assertEquals((Integer) typeAndAccuracy.get(i).second, actual.get(i).getAccuracy(), 0.01); + } + } } } 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 793dc6e33..a79523aed 100644 --- a/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java +++ b/src/main/java/de/dennisguse/opentracks/content/data/TrackPoint.java @@ -80,7 +80,8 @@ public class TrackPoint { } } - private final Type type; + @NonNull + private Type type; private Float heartRate_bpm = null; private Float cyclingCadence_rpm = null; @@ -92,7 +93,7 @@ public class TrackPoint { this(Type.TRACKPOINT, new Location("")); } - public TrackPoint(Type type) { + public TrackPoint(@NonNull Type type) { this.type = type; this.location = new Location(""); } @@ -108,18 +109,6 @@ public class TrackPoint { this.location = location; } - public TrackPoint(@NonNull TrackPoint trackPoint) { - this.type = trackPoint.getType(); - this.location = trackPoint.getLocation(); - - this.heartRate_bpm = trackPoint.getHeartRate_bpm(); - this.cyclingCadence_rpm = trackPoint.getCyclingCadence_rpm(); - this.power = trackPoint.getPower(); - - this.elevationGain = trackPoint.getElevationGain(); - this.elevationLoss = trackPoint.getElevationLoss(); - } - public TrackPoint(double latitude, double longitude, Double altitude, long time) { this.type = Type.TRACKPOINT; location = new Location(LocationManager.GPS_PROVIDER); @@ -172,6 +161,10 @@ public class TrackPoint { return type; } + public void setType(@NonNull Type type) { + this.type = type; + } + public boolean isSegmentStart() { return type == Type.SEGMENT_START_AUTOMATIC || type == Type.SEGMENT_START_MANUAL; } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index 54e02dd09..80c2fc1db 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -569,8 +569,8 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand double distanceToLastTrackLocation = trackPoint.distanceTo(lastValidTrackPoint); if (distanceToLastTrackLocation > maxRecordingDistance) { insertTrackPointIfNewer(track, lastTrackPoint); - insertTrackPoint(track, TrackPoint.createSegmentEndWithTime(trackPoint)); + trackPoint.setType(TrackPoint.Type.SEGMENT_START_AUTOMATIC); insertTrackPoint(track, trackPoint); isIdle = false;