Statistics: distance, total time, moving time are counted between automatic segments.

Fixes #1566.
This commit is contained in:
Dennis Guse
2023-05-31 17:25:09 +02:00
parent 3f891f7fb4
commit 11c5ec43e2
6 changed files with 26 additions and 26 deletions
@@ -202,7 +202,7 @@ public class ExportImportTest {
// given // given
Track track = contentProviderUtils.getTrack(trackId); Track track = contentProviderUtils.getTrack(trackId);
TrackExporter trackExporter = TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA.createTrackExporter(context, contentProviderUtils); TrackExporter trackExporter = TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES.createTrackExporter(context, contentProviderUtils);
// when // when
// 1. export // 1. export
@@ -238,24 +238,24 @@ public class ExportImportTest {
TrackStatistics originalTrackStatistics = track.getTrackStatistics(); TrackStatistics originalTrackStatistics = track.getTrackStatistics();
assertEquals(originalTrackStatistics.getTotalTime(), importedTrackStatistics.getTotalTime()); assertEquals(originalTrackStatistics.getTotalTime(), importedTrackStatistics.getTotalTime());
assertEquals(Duration.ofSeconds(19), importedTrackStatistics.getTotalTime()); assertEquals(Duration.ofSeconds(20), importedTrackStatistics.getTotalTime());
assertEquals(originalTrackStatistics.getMovingTime(), importedTrackStatistics.getMovingTime()); assertEquals(originalTrackStatistics.getMovingTime(), importedTrackStatistics.getMovingTime());
assertEquals(Duration.ofSeconds(3), importedTrackStatistics.getMovingTime()); assertEquals(Duration.ofSeconds(4), importedTrackStatistics.getMovingTime());
// Distance // Distance
assertEquals(originalTrackStatistics.getTotalDistance(), importedTrackStatistics.getTotalDistance()); assertEquals(originalTrackStatistics.getTotalDistance(), importedTrackStatistics.getTotalDistance());
assertEquals(125.16, importedTrackStatistics.getTotalDistance().toM(), 0.01); assertEquals(222238.70, importedTrackStatistics.getTotalDistance().toM(), 0.01);
// Speed // Speed
assertEquals(originalTrackStatistics.getMaxSpeed(), importedTrackStatistics.getMaxSpeed()); assertEquals(originalTrackStatistics.getMaxSpeed(), importedTrackStatistics.getMaxSpeed());
assertEquals(41.72, importedTrackStatistics.getMaxSpeed().toMPS(), 0.01); assertEquals(55559.67, importedTrackStatistics.getMaxSpeed().toMPS(), 0.01);
assertEquals(originalTrackStatistics.getAverageSpeed(), importedTrackStatistics.getAverageSpeed()); assertEquals(originalTrackStatistics.getAverageSpeed(), importedTrackStatistics.getAverageSpeed());
assertEquals(6.58, importedTrackStatistics.getAverageSpeed().toMPS(), 0.01); assertEquals(11111.93, importedTrackStatistics.getAverageSpeed().toMPS(), 0.01);
assertEquals(originalTrackStatistics.getAverageMovingSpeed(), importedTrackStatistics.getAverageMovingSpeed()); assertEquals(originalTrackStatistics.getAverageMovingSpeed(), importedTrackStatistics.getAverageMovingSpeed());
assertEquals(41.72, importedTrackStatistics.getMaxSpeed().toMPS(), 0.01); assertEquals(55559.67, importedTrackStatistics.getMaxSpeed().toMPS(), 0.01);
// Altitude // Altitude
assertEquals(originalTrackStatistics.getMinAltitude(), importedTrackStatistics.getMinAltitude(), 0.01); assertEquals(originalTrackStatistics.getMinAltitude(), importedTrackStatistics.getMinAltitude(), 0.01);
@@ -394,16 +394,16 @@ public class ExportImportTest {
assertEquals(Instant.parse("2020-02-02T02:02:03Z"), importedTrackStatistics.getStartTime()); assertEquals(Instant.parse("2020-02-02T02:02:03Z"), importedTrackStatistics.getStartTime());
assertEquals(Instant.parse("2020-02-02T02:03:23Z"), importedTrackStatistics.getStopTime()); assertEquals(Instant.parse("2020-02-02T02:03:23Z"), importedTrackStatistics.getStopTime());
assertEquals(Duration.ofSeconds(15), importedTrackStatistics.getTotalTime()); assertEquals(Duration.ofSeconds(80), importedTrackStatistics.getTotalTime());
assertEquals(Duration.ofSeconds(15), importedTrackStatistics.getMovingTime()); assertEquals(Duration.ofSeconds(80), importedTrackStatistics.getMovingTime());
// Distance // Distance
assertEquals(125.16, importedTrackStatistics.getTotalDistance().toM(), 0.01); assertEquals(222349.85, importedTrackStatistics.getTotalDistance().toM(), 0.01);
// Speed // Speed
assertEquals(8.34, importedTrackStatistics.getMaxSpeed().toMPS(), 0.01); assertEquals(2779.37, importedTrackStatistics.getMaxSpeed().toMPS(), 0.01);
assertEquals(8.34, importedTrackStatistics.getAverageSpeed().toMPS(), 0.01); assertEquals(2779.37, importedTrackStatistics.getAverageSpeed().toMPS(), 0.01);
assertEquals(8.34, importedTrackStatistics.getAverageMovingSpeed().toMPS(), 0.01); assertEquals(2779.37, importedTrackStatistics.getAverageMovingSpeed().toMPS(), 0.01);
// Altitude // Altitude
assertEquals(10, importedTrackStatistics.getMinAltitude(), 0.01); assertEquals(10, importedTrackStatistics.getMinAltitude(), 0.01);
@@ -765,7 +765,7 @@ public class TrackRecordingServiceTestRecording {
TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps2, 45.1, 35.0, 1, 15); TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps2, 45.1, 35.0, 1, 15);
// then // then
assertEquals(new TrackStatistics(startTime, gps2, 0, 1, 0, 0, 0f, 0f), contentProviderUtils.getTrack(trackId).getTrackStatistics()); assertEquals(new TrackStatistics(startTime, gps2, 11113.275390625, 4, 3, 3704.4251302083335f, 0f, 0f).toString(), contentProviderUtils.getTrack(trackId).getTrackStatistics().toString());
// when // when
@@ -774,8 +774,7 @@ public class TrackRecordingServiceTestRecording {
service.endCurrentTrack(); service.endCurrentTrack();
// then // then
assertEquals(new TrackStatistics(startTime, stopTime, 0, 7, 0, 0, 0f, 0f) assertEquals(new TrackStatistics(startTime, stopTime, 11113.275390625, 10, 3, 3704.4251302083335f, 0f, 0f).toString(), contentProviderUtils.getTrack(trackId).getTrackStatistics().toString());
, contentProviderUtils.getTrack(trackId).getTrackStatistics());
// then // then
@@ -81,9 +81,9 @@ public class TrackStatisticsUpdaterTest {
// then // then
TrackStatistics statistics = subject.getTrackStatistics(); TrackStatistics statistics = subject.getTrackStatistics();
assertEquals(128.03, statistics.getTotalDistance().toM(), 0.01); assertEquals(142.26, statistics.getTotalDistance().toM(), 0.01);
assertEquals(Duration.ofSeconds(13), statistics.getTotalTime()); assertEquals(Duration.ofSeconds(14), statistics.getTotalTime());
assertEquals(Duration.ofSeconds(9), statistics.getMovingTime()); assertEquals(Duration.ofSeconds(10), statistics.getMovingTime());
assertEquals(2.5, statistics.getMinAltitude(), 0.01); assertEquals(2.5, statistics.getMinAltitude(), 0.01);
assertEquals(32.5, statistics.getMaxAltitude(), 0.01); assertEquals(32.5, statistics.getMaxAltitude(), 0.01);
@@ -92,8 +92,8 @@ public class TrackStatisticsUpdaterTest {
assertEquals(14.226, statistics.getMaxSpeed().toMPS(), 0.01); assertEquals(14.226, statistics.getMaxSpeed().toMPS(), 0.01);
assertEquals(14.226, statistics.getAverageMovingSpeed().toMPS(), 0.01); assertEquals(14.226, statistics.getAverageMovingSpeed().toMPS(), 0.01);
assertEquals(9.84, statistics.getAverageSpeed().toMPS(), 0.01); assertEquals(10.16, statistics.getAverageSpeed().toMPS(), 0.01);
assertEquals(106.85f, statistics.getAverageHeartRate().getBPM(), 0.01); assertEquals(106.64f, statistics.getAverageHeartRate().getBPM(), 0.01);
} }
@Test @Test
@@ -130,11 +130,11 @@ public class TrackPoint {
return this; return this;
} }
public boolean isSegmentStart() { public boolean isSegmentManualStart() {
return type == Type.SEGMENT_START_AUTOMATIC || type == Type.SEGMENT_START_MANUAL; return type == Type.SEGMENT_START_MANUAL;
} }
public boolean isSegmentEnd() { public boolean isSegmentManualEnd() {
return type == Type.SEGMENT_END_MANUAL; return type == Type.SEGMENT_END_MANUAL;
} }
@@ -38,6 +38,7 @@ import de.dennisguse.opentracks.data.models.TrackPoint;
*/ */
//TODO Use null instead of Double.isInfinite //TODO Use null instead of Double.isInfinite
//TODO Check that data ranges are valid (not less than zero etc.) //TODO Check that data ranges are valid (not less than zero etc.)
//TODO Should be a Java record
public class TrackStatistics { public class TrackStatistics {
// The min and max altitude (meters) seen on this track. // The min and max altitude (meters) seen on this track.
@@ -95,7 +95,7 @@ public class TrackStatisticsUpdater {
* *
*/ */
public void addTrackPoint(TrackPoint trackPoint) { public void addTrackPoint(TrackPoint trackPoint) {
if (trackPoint.isSegmentStart()) { if (trackPoint.isSegmentManualStart()) {
reset(trackPoint); reset(trackPoint);
} }
@@ -154,7 +154,7 @@ public class TrackStatisticsUpdater {
updateSpeed(trackPoint, lastTrackPoint); updateSpeed(trackPoint, lastTrackPoint);
} }
if (trackPoint.isSegmentEnd()) { if (trackPoint.isSegmentManualEnd()) {
reset(trackPoint); reset(trackPoint);
return; return;
} }