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 2bf4cb0d3..11231b5f0 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 @@ -75,7 +75,7 @@ import de.dennisguse.opentracks.sensors.sensorData.Raw; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.handlers.TrackPointCreator; -import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; +import de.dennisguse.opentracks.stats.Statistics; /** * Export a track to {@link TrackFileFormat} and verify that the import is identical. @@ -203,20 +203,20 @@ public class ExportImportTest { setUp(); Track track = contentProviderUtils.getTrack(trackId); - SegmentStatisticUpdater trackStatistics = track.getTrackStatistics(); + Statistics trackStatistics = track.getStatistics(); assertEquals(ZoneOffset.of("+01:00"), track.getZoneOffset()); - assertEquals(Instant.parse("2020-02-02T02:02:02Z"), trackStatistics.getStartTime()); - assertEquals(Instant.parse("2020-02-02T02:04:00Z"), trackStatistics.getStopTime()); + assertEquals(Instant.parse("2020-02-02T02:02:02Z"), trackStatistics.startTime()); + assertEquals(Instant.parse("2020-02-02T02:04:00Z"), trackStatistics.stopTime()); - assertEquals(Duration.ofSeconds(56), trackStatistics.getTotalTime()); - assertEquals(Duration.ofSeconds(26), trackStatistics.getMovingTime()); //TODO Likely too low + assertEquals(Duration.ofSeconds(56), trackStatistics.totalTime()); + assertEquals(Duration.ofSeconds(26), trackStatistics.movingTime()); //TODO Likely too low // Distance - assertEquals(222049.34375, trackStatistics.getTotalDistance().toM(), 0.01); //TODO Too low + assertEquals(222049.34375, trackStatistics.totalDistance().toM(), 0.01); //TODO Too low // Speed - assertEquals(8540.359, trackStatistics.getMaxSpeed().toMPS(), 0.01); + assertEquals(8540.359, trackStatistics.maxSpeed().toMPS(), 0.01); assertEquals(3965.166, trackStatistics.getAverageSpeed().toMPS(), 0.01); assertEquals(8540.359, trackStatistics.getAverageMovingSpeed().toMPS(), 0.01); @@ -224,8 +224,8 @@ public class ExportImportTest { assertEquals(999.122, trackStatistics.getMinAltitude(), 0.01); assertEquals(1020.25, trackStatistics.getMaxAltitude(), 0.01); - assertEquals(2, trackStatistics.getTotalAltitudeGain(), 0.01); - assertEquals(2, trackStatistics.getTotalAltitudeLoss(), 0.01); + assertEquals(2, trackStatistics.altitudeGainLoss().gain_m(), 0.01); + assertEquals(2, trackStatistics.altitudeGainLoss().loss_m(), 0.01); List actual = TestDataUtil.getTrackPoints(contentProviderUtils, trackId); new TrackPointAssert().assertEquals(List.of( @@ -334,29 +334,29 @@ public class ExportImportTest { a.assertEquals(trackPoints, actual); // 3. trackstatistics - SegmentStatisticUpdater importedTrackStatistics = importedTrack.getTrackStatistics(); + Statistics importedTrackStatistics = importedTrack.getStatistics(); // Time assertEquals(track.getZoneOffset(), importedTrack.getZoneOffset()); - assertEquals(Instant.parse("2020-02-02T02:02:02Z"), importedTrackStatistics.getStartTime()); - assertEquals(Instant.parse("2020-02-02T02:04:00Z"), importedTrackStatistics.getStopTime()); + assertEquals(Instant.parse("2020-02-02T02:02:02Z"), importedTrackStatistics.startTime()); + assertEquals(Instant.parse("2020-02-02T02:04:00Z"), importedTrackStatistics.stopTime()); - assertEquals(Duration.ofSeconds(56), importedTrackStatistics.getTotalTime()); - assertEquals(Duration.ofSeconds(26), importedTrackStatistics.getMovingTime()); + assertEquals(Duration.ofSeconds(56), importedTrackStatistics.totalTime()); + assertEquals(Duration.ofSeconds(26), importedTrackStatistics.movingTime()); // Distance - assertEquals(222049.421, importedTrackStatistics.getTotalDistance().toM(), 0.01); + assertEquals(222049.421, importedTrackStatistics.totalDistance().toM(), 0.01); // Speed - assertEquals(8540.362, importedTrackStatistics.getMaxSpeed().toMPS(), 0.01); + assertEquals(8540.362, importedTrackStatistics.maxSpeed().toMPS(), 0.01); assertEquals(3965.168, importedTrackStatistics.getAverageSpeed().toMPS(), 0.01); assertEquals(8540.362, importedTrackStatistics.getAverageMovingSpeed().toMPS(), 0.01); // Altitude assertEquals(999.122, importedTrackStatistics.getMinAltitude(), 0.01); assertEquals(1020.25, importedTrackStatistics.getMaxAltitude(), 0.01); - assertEquals(2, importedTrackStatistics.getTotalAltitudeGain(), 0.01); - assertEquals(2, importedTrackStatistics.getTotalAltitudeLoss(), 0.01); + assertEquals(2, importedTrackStatistics.altitudeGainLoss().gain_m(), 0.01); + assertEquals(2, importedTrackStatistics.altitudeGainLoss().loss_m(), 0.01); // 4. markers @@ -479,29 +479,29 @@ public class ExportImportTest { ), actual); // 3. trackstatistics - SegmentStatisticUpdater importedTrackStatistics = importedTrack.getTrackStatistics(); + Statistics importedTrackStatistics = importedTrack.getStatistics(); // Time assertEquals(track.getZoneOffset(), importedTrack.getZoneOffset()); - assertEquals(Instant.parse("2020-02-02T02:02:03Z"), importedTrackStatistics.getStartTime()); - assertEquals(Instant.parse("2020-02-02T02:03:50Z"), importedTrackStatistics.getStopTime()); + assertEquals(Instant.parse("2020-02-02T02:02:03Z"), importedTrackStatistics.startTime()); + assertEquals(Instant.parse("2020-02-02T02:03:50Z"), importedTrackStatistics.stopTime()); - assertEquals(Duration.ofSeconds(107), importedTrackStatistics.getTotalTime()); - assertEquals(Duration.ofSeconds(107), importedTrackStatistics.getMovingTime()); + assertEquals(Duration.ofSeconds(107), importedTrackStatistics.totalTime()); + assertEquals(Duration.ofSeconds(107), importedTrackStatistics.movingTime()); // Distance - assertEquals(222271.734, importedTrackStatistics.getTotalDistance().toM(), 0.01); + assertEquals(222271.734, importedTrackStatistics.totalDistance().toM(), 0.01); // Speed - assertEquals(2077.305, importedTrackStatistics.getMaxSpeed().toMPS(), 0.01); + assertEquals(2077.305, importedTrackStatistics.maxSpeed().toMPS(), 0.01); assertEquals(2077.305, importedTrackStatistics.getAverageSpeed().toMPS(), 0.01); assertEquals(2077.305, importedTrackStatistics.getAverageMovingSpeed().toMPS(), 0.01); // Altitude assertEquals(999.099, importedTrackStatistics.getMinAltitude(), 0.01); assertEquals(1020.2, importedTrackStatistics.getMaxAltitude(), 0.01); - assertEquals(2, importedTrackStatistics.getTotalAltitudeGain(), 0.01); - assertEquals(2, importedTrackStatistics.getTotalAltitudeLoss(), 0.01); + assertEquals(2, importedTrackStatistics.altitudeGainLoss().gain_m(), 0.01); + assertEquals(2, importedTrackStatistics.altitudeGainLoss().loss_m(), 0.01); // 4. markers assertMarkers(); diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporterTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporterTest.java index df2b4db5b..05dac22bb 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporterTest.java @@ -34,7 +34,7 @@ import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.io.file.TrackFileFormat; import de.dennisguse.opentracks.io.file.exporter.TrackExporter; -import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; +import de.dennisguse.opentracks.stats.Statistics; /** * Test that legacy KML/GPX formats can still be imported. @@ -149,9 +149,9 @@ public class GPXTrackImporterTest { assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType()); // 3. trackstatistics - SegmentStatisticUpdater trackStatistics = importedTrack.getTrackStatistics(); - assertEquals(0.75, trackStatistics.getMaxSpeed().toMPS(), 0.01); - assertEquals(Duration.ofSeconds(101), trackStatistics.getMovingTime()); + Statistics trackStatistics = importedTrack.getStatistics(); + assertEquals(0.75, trackStatistics.maxSpeed().toMPS(), 0.01); + assertEquals(Duration.ofSeconds(101), trackStatistics.movingTime()); // 4. trackpoints List importedTrackPoints = TestDataUtil.getTrackPoints(contentProviderUtils, importTrackId); @@ -204,9 +204,9 @@ public class GPXTrackImporterTest { assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType()); // 3. trackstatistics - SegmentStatisticUpdater trackStatistics = importedTrack.getTrackStatistics(); - assertEquals(5.0, trackStatistics.getMaxSpeed().toMPS(), 0.01); - assertEquals(Duration.ofSeconds(101), trackStatistics.getMovingTime()); + Statistics trackStatistics = importedTrack.getStatistics(); + assertEquals(5.0, trackStatistics.maxSpeed().toMPS(), 0.01); + assertEquals(Duration.ofSeconds(101), trackStatistics.movingTime()); // 4. trackpoints List importedTrackPoints = TestDataUtil.getTrackPoints(contentProviderUtils, importTrackId); diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManagerTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManagerTest.java index 2eab35723..05b4a7d3d 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManagerTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManagerTest.java @@ -22,6 +22,7 @@ import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.settings.UnitSystem; import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; +import de.dennisguse.opentracks.stats.Statistics; @RunWith(MockitoJUnitRunner.class) public class TrackRecordingServiceNotificationManagerTest { @@ -29,10 +30,10 @@ public class TrackRecordingServiceNotificationManagerTest { private final Context context = ApplicationProvider.getApplicationContext(); @Mock - private TrackPoint trackPointMock; + private TrackPoint trackPointMock; //TODO No mock @Mock - private SegmentStatisticUpdater trackStatisticsMock; + private SegmentStatisticUpdater trackStatisticsMock; //TODO only use Statistic (not mock) @Mock private NotificationCompat.Builder notificationCompatBuilder; @@ -45,7 +46,20 @@ public class TrackRecordingServiceNotificationManagerTest { when(trackPointMock.hasHorizontalAccuracy()).thenReturn(true); when(trackPointMock.getHorizontalAccuracy()).thenReturn(Distance.of(999f)); when(trackPointMock.getSpeed()).thenReturn(Speed.of(0)); - when(trackStatisticsMock.getTotalDistance()).thenReturn(Distance.of(0)); + when(trackStatisticsMock.getStatistics()).thenReturn(new Statistics( + null, + null, + null, + null, + Distance.of(0), + false, + null, + null, + null, + null, + null, + null + )); when(notificationCompatBuilder.setOnlyAlertOnce(anyBoolean())) .thenReturn(notificationCompatBuilder); diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java index 5d51a98e5..f08460df1 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java @@ -192,8 +192,8 @@ public class TrackRecordingServiceRecordingTest { service.endCurrentTrack(); // then - assertEquals(new SegmentStatisticUpdater(startTime, pauseTime, 0, 1, 1, 0, 0f, 0f) - , contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(new SegmentStatisticUpdater(startTime, pauseTime, 0, 1, 1, 0, 0f, 0f).getStatistics() + , contentProviderUtils.getTrack(trackId).getStatistics()); new TrackPointAssert().assertEquals(List.of( new TrackPoint(TrackPoint.Type.SEGMENT_START_MANUAL, Instant.parse(startTime)), @@ -208,8 +208,8 @@ public class TrackRecordingServiceRecordingTest { service.resumeTrack(trackId); // then - assertEquals(new SegmentStatisticUpdater(startTime, resumeTime, 0, 1, 1, 0, 0f, 0f) - , contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(new SegmentStatisticUpdater(startTime, resumeTime, 0, 1, 1, 0, 0f, 0f).getStatistics() + , contentProviderUtils.getTrack(trackId).getStatistics()); new TrackPointAssert().assertEquals(List.of( new TrackPoint(TrackPoint.Type.SEGMENT_START_MANUAL, Instant.parse(startTime)), @@ -341,24 +341,24 @@ public class TrackRecordingServiceRecordingTest { TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps1, 45.0, 35.0, 1, 15); // then - assertEquals(new SegmentStatisticUpdater(startTime, gps1, 0, 1, 1, 15, 0f, 0f) - , contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(new SegmentStatisticUpdater(startTime, gps1, 0, 1, 1, 15, 0f, 0f).getStatistics() + , contentProviderUtils.getTrack(trackId).getStatistics()); // when String gps2 = "2020-02-02T02:02:06Z"; TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps2, 45.0001, 35.0, 1, 15); // then - assertEquals(new SegmentStatisticUpdater(startTime, gps2, 11.113178253173828f, 4, 4, 15, 0f, 0f) - , contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(new SegmentStatisticUpdater(startTime, gps2, 11.113178253173828f, 4, 4, 15, 0f, 0f).getStatistics() + , contentProviderUtils.getTrack(trackId).getStatistics()); // when String gps3 = "2020-02-02T02:02:08Z"; TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps3, 45.0002, 35.0, 1, 15); // then - assertEquals(new SegmentStatisticUpdater(startTime, gps3, 22.226356506347656, 6, 6, 15, 0f, 0f) - , contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(new SegmentStatisticUpdater(startTime, gps3, 22.226356506347656, 6, 6, 15, 0f, 0f).getStatistics() + , contentProviderUtils.getTrack(trackId).getStatistics()); // when @@ -367,8 +367,8 @@ public class TrackRecordingServiceRecordingTest { service.endCurrentTrack(); // then - assertEquals(new SegmentStatisticUpdater(startTime, stopTime, 22.226356506347656, 10, 10, 15, 0f, 0f) - , contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(new SegmentStatisticUpdater(startTime, stopTime, 22.226356506347656, 10, 10, 15, 0f, 0f).getStatistics() + , contentProviderUtils.getTrack(trackId).getStatistics()); new TrackPointAssert().assertEquals(List.of( new TrackPoint(TrackPoint.Type.SEGMENT_START_MANUAL, Instant.parse(startTime)), @@ -421,21 +421,21 @@ public class TrackRecordingServiceRecordingTest { // then SegmentStatisticUpdater gps1Statistics = new SegmentStatisticUpdater(startTime, gps1, 0, 1, 1, 15, 0f, 0f); - assertEquals(gps1Statistics, contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(gps1Statistics.getStatistics(), contentProviderUtils.getTrack(trackId).getStatistics()); // when String gps2 = "2020-02-02T02:02:06Z"; TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps2, 45.00001, 35.0, 1, 15); // then - assertEquals(gps1Statistics, contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(gps1Statistics.getStatistics(), contentProviderUtils.getTrack(trackId).getStatistics()); // when String gps3 = "2020-02-02T02:02:08Z"; TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps3, 45.00002, 35.0, 1, 15); // then - assertEquals(gps1Statistics, contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(gps1Statistics.getStatistics(), contentProviderUtils.getTrack(trackId).getStatistics()); // when String stopTime = "2020-02-02T02:02:12Z"; @@ -443,8 +443,8 @@ public class TrackRecordingServiceRecordingTest { service.endCurrentTrack(); // then - assertEquals(new SegmentStatisticUpdater(startTime, stopTime, 2.222635507583618, 10, 10, 15, 0f, 0f) - , contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(new SegmentStatisticUpdater(startTime, stopTime, 2.222635507583618, 10, 10, 15, 0f, 0f).getStatistics() + , contentProviderUtils.getTrack(trackId).getStatistics()); new TrackPointAssert().assertEquals(List.of( new TrackPoint(TrackPoint.Type.SEGMENT_START_MANUAL, Instant.parse(startTime)), @@ -594,14 +594,16 @@ public class TrackRecordingServiceRecordingTest { TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps1, 45.0, 35.0, 1, 15); // then - assertEquals(new SegmentStatisticUpdater(startTime, gps1, 0, 1, 1, 15, 0f, 0f), contentProviderUtils.getTrack(trackId).getTrackStatistics()); + assertEquals(new SegmentStatisticUpdater(startTime, gps1, 0, 1, 1, 15, 0f, 0f).getStatistics(), + contentProviderUtils.getTrack(trackId).getStatistics()); // when String gps2 = "2020-02-02T02:02:06Z"; TrackRecordingServiceTestUtils.sendGPSLocation(trackPointCreator, gps2, 45.1, 35.0, 1, 15); // then - assertEquals(new SegmentStatisticUpdater(startTime, gps2, 11113.275390625, 4, 4, 2778.31884765625f, 0f, 0f).toString(), contentProviderUtils.getTrack(trackId).getTrackStatistics().toString()); + assertEquals(new SegmentStatisticUpdater(startTime, gps2, 11113.275390625, 4, 4, 2778.31884765625f, 0f, 0f).getStatistics(), + contentProviderUtils.getTrack(trackId).getStatistics()); // when @@ -610,7 +612,8 @@ public class TrackRecordingServiceRecordingTest { service.endCurrentTrack(); // then - assertEquals(new SegmentStatisticUpdater(startTime, stopTime, 11113.275390625, 10, 10, 1111.3275390625f, 0f, 0f).toString(), contentProviderUtils.getTrack(trackId).getTrackStatistics().toString()); + assertEquals(new SegmentStatisticUpdater(startTime, stopTime, 11113.275390625, 10, 10, 1111.3275390625f, 0f, 0f).getStatistics() + , contentProviderUtils.getTrack(trackId).getStatistics()); // then diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManagerTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManagerTest.java index 178ed06af..9b2098d34 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManagerTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManagerTest.java @@ -56,11 +56,11 @@ public class VoiceAnnouncementManagerTest { // when SegmentStatisticUpdater statistics = new SegmentStatisticUpdater(); statistics.setTotalDistance(Distance.ofKilometer(13)); - voiceAnnouncementManager.start(statistics); + voiceAnnouncementManager.start(statistics.getStatistics()); assertEquals(Distance.of(15000), voiceAnnouncementManager.getNextTotalDistance()); statistics.setTotalDistance(Distance.of(15100)); - voiceAnnouncementManager.start(statistics); + voiceAnnouncementManager.start(statistics.getStatistics()); assertEquals(Distance.of(20000), voiceAnnouncementManager.getNextTotalDistance()); } @@ -76,11 +76,11 @@ public class VoiceAnnouncementManagerTest { // when SegmentStatisticUpdater statistics = new SegmentStatisticUpdater(); statistics.setTotalTime(Duration.ofSeconds(91)); - voiceAnnouncementManager.start(statistics); + voiceAnnouncementManager.start(statistics.getStatistics()); assertEquals(Duration.ofSeconds(95), voiceAnnouncementManager.getNextTotalTime()); statistics.setTotalTime(Duration.ofSeconds(95)); - voiceAnnouncementManager.start(statistics); + voiceAnnouncementManager.start(statistics.getStatistics()); assertEquals(Duration.ofSeconds(100), voiceAnnouncementManager.getNextTotalTime()); } diff --git a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java index 34fbfa441..3d65d59b3 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java @@ -68,14 +68,14 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements viewBinding.trackEditDescription.setText(track.getDescription()); - viewBinding.time.setText(StringUtils.formatElapsedTime(track.getTrackStatistics().getMovingTime())); + viewBinding.time.setText(StringUtils.formatElapsedTime(track.getStatistics().movingTime())); { Pair parts = SpeedFormatter.Builder() .setUnit(PreferencesUtils.getUnitSystem()) .setReportSpeedOrPace(PreferencesUtils.isReportSpeed(track)) .build(this) - .getSpeedParts(track.getTrackStatistics().getAverageMovingSpeed()); + .getSpeedParts(track.getStatistics().getAverageMovingSpeed()); viewBinding.speed.setText(parts.first); viewBinding.speedUnit.setText(parts.second); } @@ -84,7 +84,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements Pair parts = DistanceFormatter.Builder() .setUnit(PreferencesUtils.getUnitSystem()) .build(this) - .getDistanceParts(track.getTrackStatistics().getTotalDistance()); + .getDistanceParts(track.getStatistics().totalDistance()); viewBinding.distance.setText(parts.first); viewBinding.distanceUnit.setText(parts.second); } diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index 7f99680ec..7e7c87130 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -53,8 +53,9 @@ import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.data.tables.MarkerColumns; import de.dennisguse.opentracks.data.tables.TrackPointsColumns; import de.dennisguse.opentracks.data.tables.TracksColumns; -import de.dennisguse.opentracks.stats.SensorStatistics; import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; +import de.dennisguse.opentracks.stats.SensorStatistics; +import de.dennisguse.opentracks.stats.Statistics; import de.dennisguse.opentracks.ui.markers.MarkerUtils; import de.dennisguse.opentracks.util.FileUtils; @@ -314,7 +315,7 @@ public class ContentProviderUtils { private ContentValues createContentValues(Track track) { ContentValues values = new ContentValues(); - SegmentStatisticUpdater trackStatistics = track.getTrackStatistics(); + Statistics trackStatistics = track.getStatistics(); if (track.getId() != null) { values.put(TracksColumns._ID, track.getId().id()); @@ -325,30 +326,38 @@ public class ContentProviderUtils { values.put(TracksColumns.ACTIVITY_TYPE, track.getActivityType() != null ? track.getActivityType().getId() : null); values.put(TracksColumns.ACTIVITY_TYPE_LOCALIZED, track.getActivityTypeLocalized()); values.put(TracksColumns.STARTTIME_OFFSET, track.getZoneOffset().getTotalSeconds()); - if (trackStatistics.getStartTime() != null) { - values.put(TracksColumns.STARTTIME, trackStatistics.getStartTime().toEpochMilli()); + if (trackStatistics.startTime() != null) { + values.put(TracksColumns.STARTTIME, trackStatistics.startTime().toEpochMilli()); } - if (trackStatistics.getStopTime() != null) { - values.put(TracksColumns.STOPTIME, trackStatistics.getStopTime().toEpochMilli()); + if (trackStatistics.stopTime() != null) { + values.put(TracksColumns.STOPTIME, trackStatistics.stopTime().toEpochMilli()); } - values.put(TracksColumns.TOTALDISTANCE, trackStatistics.getTotalDistance().toM()); - values.put(TracksColumns.TOTALTIME, trackStatistics.getTotalTime().toMillis()); - values.put(TracksColumns.MOVINGTIME, trackStatistics.getMovingTime().toMillis()); + values.put(TracksColumns.TOTALDISTANCE, trackStatistics.totalDistance().toM()); + values.put(TracksColumns.TOTALTIME, trackStatistics.totalTime().toMillis()); + values.put(TracksColumns.MOVINGTIME, trackStatistics.movingTime().toMillis()); values.put(TracksColumns.AVGSPEED, trackStatistics.getAverageSpeed().toMPS()); values.put(TracksColumns.AVGMOVINGSPEED, trackStatistics.getAverageMovingSpeed().toMPS()); - values.put(TracksColumns.MAXSPEED, trackStatistics.getMaxSpeed().toMPS()); - values.put(TracksColumns.MIN_ALTITUDE, trackStatistics.getMinAltitude()); - values.put(TracksColumns.MAX_ALTITUDE, trackStatistics.getMaxAltitude()); - values.put(TracksColumns.ALTITUDE_GAIN, trackStatistics.getTotalAltitudeGain()); - values.put(TracksColumns.ALTITUDE_LOSS, trackStatistics.getTotalAltitudeLoss()); + values.put(TracksColumns.MAXSPEED, trackStatistics.maxSpeed().toMPS()); + + if (track.getTrackStatistics().hasAltitudeExtremities()) { + values.put(TracksColumns.MIN_ALTITUDE, trackStatistics.getMinAltitude()); + values.put(TracksColumns.MAX_ALTITUDE, trackStatistics.getMaxAltitude()); + } + + if (trackStatistics.altitudeGainLoss() != null) { + values.put(TracksColumns.ALTITUDE_GAIN, trackStatistics.altitudeGainLoss().gain_m()); + values.put(TracksColumns.ALTITUDE_LOSS, trackStatistics.altitudeGainLoss().loss_m()); + } return values; } + //TODO Use Statistics public void updateTrackStatistics(@NonNull Track.Id trackId, @NonNull SegmentStatisticUpdater trackStatistics) { contentResolver.update(TracksColumns.CONTENT_URI, createContentValues(trackStatistics), TracksColumns._ID + "=?", new String[]{Long.toString(trackId.id())}); } + //TODO Use Statistics private ContentValues createContentValues(SegmentStatisticUpdater trackStatistics) { ContentValues values = new ContentValues(); if (trackStatistics.getStartTime() != null) { diff --git a/src/main/java/de/dennisguse/opentracks/data/models/Speed.java b/src/main/java/de/dennisguse/opentracks/data/models/Speed.java index 1e24ca0cd..f03c3f0f3 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Speed.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Speed.java @@ -26,6 +26,7 @@ public record Speed(double speed_mps) { return of(Distance.ofKilometer(speed_kmh), Duration.ofHours(1)); } + //TODO Like Duration.ZERO public static Speed zero() { return of(0.0); } diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java index 96fe90427..c9343cdd2 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java @@ -39,7 +39,7 @@ import de.dennisguse.opentracks.databinding.StatisticsRecordedBinding; import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.UnitSystem; import de.dennisguse.opentracks.stats.SensorStatistics; -import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; +import de.dennisguse.opentracks.stats.Statistics; import de.dennisguse.opentracks.util.StringUtils; /** @@ -171,12 +171,12 @@ public class StatisticsRecordedFragment extends Fragment { } private void updateUI() { - SegmentStatisticUpdater trackStatistics = track.getTrackStatistics(); + Statistics trackStatistics = track.getStatistics(); // Set total distance { Pair parts = DistanceFormatter.Builder() .setUnit(unitSystem) - .build(getContext()).getDistanceParts(trackStatistics.getTotalDistance()); + .build(getContext()).getDistanceParts(trackStatistics.totalDistance()); viewBinding.statsDistanceValue.setText(parts.first); viewBinding.statsDistanceUnit.setText(parts.second); @@ -187,8 +187,8 @@ public class StatisticsRecordedFragment extends Fragment { // Set time and start datetime { - viewBinding.statsMovingTimeValue.setText(StringUtils.formatElapsedTime(trackStatistics.getMovingTime())); - viewBinding.statsTotalTimeValue.setText(StringUtils.formatElapsedTime(trackStatistics.getTotalTime())); + viewBinding.statsMovingTimeValue.setText(StringUtils.formatElapsedTime(trackStatistics.movingTime())); + viewBinding.statsTotalTimeValue.setText(StringUtils.formatElapsedTime(trackStatistics.totalTime())); } SpeedFormatter formatter = SpeedFormatter.Builder().setUnit(unitSystem).setReportSpeedOrPace(preferenceReportSpeed).build(getContext()); @@ -205,7 +205,7 @@ public class StatisticsRecordedFragment extends Fragment { { viewBinding.statsMaxSpeedLabel.setText(preferenceReportSpeed ? R.string.stats_max_speed : R.string.stats_fastest_pace); - Pair parts = formatter.getSpeedParts(trackStatistics.getMaxSpeed()); + Pair parts = formatter.getSpeedParts(trackStatistics.maxSpeed()); viewBinding.statsMaxSpeedValue.setText(parts.first); viewBinding.statsMaxSpeedUnit.setText(parts.second); } @@ -221,8 +221,8 @@ public class StatisticsRecordedFragment extends Fragment { // Set altitude gain and loss { - Float altitudeGain_m = trackStatistics.getTotalAltitudeGain(); - Float altitudeLoss_m = trackStatistics.getTotalAltitudeLoss(); + Float altitudeGain_m = trackStatistics.altitudeGainLoss() != null ? trackStatistics.altitudeGainLoss().gain_m() : null; + Float altitudeLoss_m = trackStatistics.altitudeGainLoss() != null ? trackStatistics.altitudeGainLoss().loss_m() : null; Pair parts; diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java index e95c4dbdc..a805b3f09 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java @@ -39,7 +39,7 @@ import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Position; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; -import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; +import de.dennisguse.opentracks.stats.Statistics; import de.dennisguse.opentracks.util.StringUtils; /** @@ -279,18 +279,16 @@ public class GPXTrackExporter implements TrackExporter { printWriter.println("" + StringUtils.formatCData(track.getActivityTypeLocalized()) + ""); } - SegmentStatisticUpdater trackStatistics = track.getTrackStatistics(); + Statistics trackStatistics = track.getStatistics(); printWriter.println(""); - printWriter.println("" + trackStatistics.getTotalDistance().toM() + ""); - printWriter.println("" + trackStatistics.getTotalTime().getSeconds() + ""); - printWriter.println("" + trackStatistics.getMovingTime().getSeconds() + ""); + printWriter.println("" + trackStatistics.totalDistance().toM() + ""); + printWriter.println("" + trackStatistics.totalTime().getSeconds() + ""); + printWriter.println("" + trackStatistics.movingTime().getSeconds() + ""); printWriter.println("" + trackStatistics.getStoppedTime().getSeconds() + ""); - printWriter.println("" + trackStatistics.getMaxSpeed().toMPS() + ""); - if (trackStatistics.hasTotalAltitudeGain()) { - printWriter.println("" + trackStatistics.getTotalAltitudeGain() + ""); - } - if (trackStatistics.hasTotalAltitudeLoss()) { - printWriter.println("" + trackStatistics.getTotalAltitudeLoss() + ""); + printWriter.println("" + trackStatistics.maxSpeed().toMPS() + ""); + if (trackStatistics.altitudeGainLoss() != null) { + printWriter.println("" + trackStatistics.altitudeGainLoss().gain_m() + ""); + printWriter.println("" + trackStatistics.altitudeGainLoss().loss_m() + ""); } printWriter.println(""); diff --git a/src/main/java/de/dennisguse/opentracks/services/RecordingData.java b/src/main/java/de/dennisguse/opentracks/services/RecordingData.java index 49383afe5..5b94986df 100644 --- a/src/main/java/de/dennisguse/opentracks/services/RecordingData.java +++ b/src/main/java/de/dennisguse/opentracks/services/RecordingData.java @@ -20,12 +20,13 @@ public record RecordingData(Track track, TrackPoint latestTrackPoint, SensorData return track.getActivityTypeLocalized(); } + @Deprecated @NonNull - public SegmentStatisticUpdater getStatisticsTrack() { + public Statistics getStatisticsTrack() { if (track == null) { - return new SegmentStatisticUpdater(); + return new SegmentStatisticUpdater().getStatistics(); } - return track.getTrackStatistics(); + return track.getTrackStatistics().getStatistics(); } } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java index 87ab306e4..2f085a27e 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java @@ -124,7 +124,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen ALTITUDE_CORRECTION_MANAGER.correctAltitude(context, current.first); - Track track = contentProviderUtils.getTrack(trackId); //Get copy + Track track = contentProviderUtils.getTrack(trackId); //Get copy TODO: Avoid re-loading data from DB if (track == null) { Log.w(TAG, "Requesting data if not recording is taking place, should not be done."); return null; diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index 3a04ae1aa..a6f1e97d6 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -194,7 +194,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator. startSensors(); - voiceAnnouncementManager.start(trackRecordingManager.getTrackStatistics()); + voiceAnnouncementManager.start(trackRecordingManager.getTrackStatistics().getStatistics()); notificationManager.onRecordingStarted(this, recordingStatus.trackId()); } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java index 37bc03217..7e085a70a 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java @@ -118,7 +118,7 @@ class TrackRecordingServiceNotificationManager implements SharedPreferences.OnSh previousLocationWasAccurate = currentLocationWasAccurate; } - notificationBuilder.setContentTitle(context.getString(R.string.track_distance_notification, formatter.formatDistance(recordingData.getStatisticsTrack().getTotalDistance()))); + notificationBuilder.setContentTitle(context.getString(R.string.track_distance_notification, formatter.formatDistance(recordingData.getStatisticsTrack().totalDistance()))); String formattedSpeed = SpeedFormatter.Builder().setUnit(unitSystem).setReportSpeedOrPace(true).build(context).formatSpeed(recordingData.latestTrackPoint().getSpeed()); notificationBuilder.setContentText(context.getString(R.string.track_speed_notification, formattedSpeed)); notificationBuilder.setSubText(context.getString(R.string.track_recording_notification_accuracy, formattedAccuracy)); diff --git a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java index 6a6e363b0..5d4147e6d 100644 --- a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java @@ -37,7 +37,7 @@ import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.stats.SensorStatistics; -import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; +import de.dennisguse.opentracks.stats.Statistics; import de.dennisguse.opentracks.ui.intervals.IntervalStatistics; /** @@ -53,7 +53,7 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe private TTSManager voiceAnnouncement; - private SegmentStatisticUpdater trackStatistics; + private Statistics trackStatistics; private static final Distance DISTANCE_OFF = Distance.of(Double.MAX_VALUE); private Distance distanceFrequency = DISTANCE_OFF; @@ -79,13 +79,13 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe intervalStatistics = new IntervalStatistics(intervalDistance); } - public void start(@Nullable SegmentStatisticUpdater trackStatistics) { + public void start(@Nullable Statistics trackStatistics) { voiceAnnouncement = new TTSManager(context); voiceAnnouncement.start(); update(trackStatistics); } - void update(@Nullable SegmentStatisticUpdater trackStatistics) { + void update(@Nullable Statistics trackStatistics) { this.trackStatistics = trackStatistics; updateNextDuration(); updateNextTaskDistance(); @@ -126,12 +126,12 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe } boolean announce = false; - this.trackStatistics = track.getTrackStatistics(); - if (trackStatistics.getTotalDistance().greaterThan(nextTotalDistance)) { + this.trackStatistics = track.getStatistics(); + if (trackStatistics.totalDistance().greaterThan(nextTotalDistance)) { updateNextTaskDistance(); announce = true; } - if (!trackStatistics.getTotalTime().minus(nextTotalTime).isNegative()) { + if (!trackStatistics.totalTime().minus(nextTotalTime).isNegative()) { updateNextDuration(); announce = true; } @@ -182,7 +182,7 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe nextTotalDistance = DISTANCE_OFF; } else { - Distance distance = trackStatistics.getTotalDistance(); + Distance distance = trackStatistics.totalDistance(); int index = (int) (distance.dividedBy(distanceFrequency)); nextTotalDistance = distanceFrequency.multipliedBy(index + 1); @@ -195,10 +195,9 @@ public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPrefe nextTotalTime = TOTALTIME_OFF; } else { - Duration totalTime = trackStatistics.getTotalTime(); - Duration intervalMod = Duration.ofMillis(trackStatistics.getTotalTime().toMillis() % totalTimeFrequency.toMillis()); + Duration intervalMod = Duration.ofMillis(trackStatistics.totalTime().toMillis() % totalTimeFrequency.toMillis()); - nextTotalTime = totalTime.plus(totalTimeFrequency.minus(intervalMod)); + nextTotalTime = trackStatistics.totalTime().plus(totalTimeFrequency.minus(intervalMod)); } } diff --git a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java index 03ab3fb5c..f201824b6 100644 --- a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java +++ b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementUtils.java @@ -37,7 +37,7 @@ import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; import de.dennisguse.opentracks.settings.UnitSystem; import de.dennisguse.opentracks.stats.SensorStatistics; -import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; +import de.dennisguse.opentracks.stats.Statistics; import de.dennisguse.opentracks.ui.intervals.IntervalStatistics; import de.dennisguse.opentracks.util.StringUtils; @@ -52,7 +52,7 @@ class VoiceAnnouncementUtils { } static Spannable createStatistics(Context context, Track track, SensorDataSet sensorDataSet, UnitSystem unitSystem, boolean isReportSpeed, @Nullable IntervalStatistics.Interval currentInterval, @Nullable SensorStatistics sensorStatistics) { - SegmentStatisticUpdater trackStatistics = track.getTrackStatistics(); + Statistics trackStatistics = track.getStatistics(); SpannableStringBuilder builder = new SpannableStringBuilder(); @@ -60,7 +60,7 @@ class VoiceAnnouncementUtils { appendTime(builder, track.getStopTime()); } - Distance totalDistance = trackStatistics.getTotalDistance(); + Distance totalDistance = trackStatistics.totalDistance(); Speed averageMovingSpeed = trackStatistics.getAverageMovingSpeed(); Speed currentDistancePerTime = currentInterval != null ? currentInterval.getSpeed() : null; @@ -112,7 +112,7 @@ class VoiceAnnouncementUtils { boolean hasTravelledDistance = !totalDistance.isZero(); // Announce time - Duration movingTime = trackStatistics.getMovingTime(); + Duration movingTime = trackStatistics.movingTime(); if (shouldVoiceAnnounceMovingTime() && hasTravelledDistance && !movingTime.isZero()) { appendDuration(context, builder, movingTime); builder.append("."); diff --git a/src/main/java/de/dennisguse/opentracks/share/TrackShareSummaryGenerator.java b/src/main/java/de/dennisguse/opentracks/share/TrackShareSummaryGenerator.java index 071f23fff..42ebaeaab 100644 --- a/src/main/java/de/dennisguse/opentracks/share/TrackShareSummaryGenerator.java +++ b/src/main/java/de/dennisguse/opentracks/share/TrackShareSummaryGenerator.java @@ -31,7 +31,7 @@ import de.dennisguse.opentracks.data.models.Speed; import de.dennisguse.opentracks.data.models.SpeedFormatter; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.settings.UnitSystem; -import de.dennisguse.opentracks.stats.SegmentStatisticUpdater; +import de.dennisguse.opentracks.stats.Statistics; import de.dennisguse.opentracks.util.StringUtils; /** @@ -65,7 +65,7 @@ public class TrackShareSummaryGenerator { writeString(track.getName(), builder, R.string.generic_name_line); writeString(track.getActivityTypeLocalized(), builder, R.string.description_activity_type); writeString(track.getDescription(), builder, R.string.generic_description_line); - builder.append(generateTrackStatisticsDescription(track.getTrackStatistics())); + builder.append(generateTrackStatisticsDescription(track.getStatistics())); return builder.toString(); } @@ -78,17 +78,17 @@ public class TrackShareSummaryGenerator { builder.append(TrackShareSummaryGenerator.TEXT_LINE_BREAK); } - private String generateTrackStatisticsDescription(SegmentStatisticUpdater stats) { + private String generateTrackStatisticsDescription(Statistics stats) { StringBuilder builder = new StringBuilder(); // Total distance - writeDistance(stats.getTotalDistance(), builder, R.string.description_total_distance); + writeDistance(stats.totalDistance(), builder, R.string.description_total_distance); // Total time - writeTime(stats.getTotalTime(), builder, R.string.description_total_time); + writeTime(stats.totalTime(), builder, R.string.description_total_time); // Moving time - writeTime(stats.getMovingTime(), builder, R.string.description_moving_time); + writeTime(stats.movingTime(), builder, R.string.description_moving_time); // Average speed writeSpeed(stats.getAverageSpeed(), builder, R.string.description_average_speed); @@ -97,7 +97,7 @@ public class TrackShareSummaryGenerator { writeSpeed(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_speed); // Max speed - writeSpeed(stats.getMaxSpeed(), builder, R.string.description_max_speed); + writeSpeed(stats.maxSpeed(), builder, R.string.description_max_speed); // Average pace writePace(stats.getAverageSpeed(), builder, R.string.description_average_pace_in_minute); @@ -106,26 +106,22 @@ public class TrackShareSummaryGenerator { writePace(stats.getAverageMovingSpeed(), builder, R.string.description_average_moving_pace_in_minute); // Fastest pace - writePace(stats.getMaxSpeed(), builder, R.string.description_fastest_pace_in_minute); + writePace(stats.maxSpeed(), builder, R.string.description_fastest_pace_in_minute); // Min and Max altitude - if (stats.hasAltitudeExtremities()) { - writeAltitude(stats.getMaxAltitude(), builder, R.string.description_max_altitude); - writeAltitude(stats.getMinAltitude(), builder, R.string.description_min_altitude); + if (stats.altitudeMax_m() != null & stats.altitudeMin_m() != null) { + writeAltitude(stats.altitudeMax_m(), builder, R.string.description_max_altitude); + writeAltitude(stats.altitudeMin_m(), builder, R.string.description_min_altitude); } - // Altitude gain - if (stats.hasTotalAltitudeGain()) { - writeAltitude(stats.getTotalAltitudeGain(), builder, R.string.description_altitude_gain); - } - - // Altitude loss - if (stats.hasTotalAltitudeLoss()) { - writeAltitude(stats.getTotalAltitudeLoss(), builder, R.string.description_altitude_loss); + // Altitude gain & loss + if (stats.altitudeGainLoss() != null) { + writeAltitude(stats.altitudeGainLoss().gain_m(), builder, R.string.description_altitude_gain); + writeAltitude(stats.altitudeGainLoss().loss_m(), builder, R.string.description_altitude_loss); } // Recorded time - builder.append(context.getString(R.string.description_recorded_time, StringUtils.formatDateTimeWithOffset(OffsetDateTime.ofInstant(stats.getStartTime(), ZoneId.systemDefault())))); + builder.append(context.getString(R.string.description_recorded_time, StringUtils.formatDateTimeWithOffset(OffsetDateTime.ofInstant(stats.startTime(), ZoneId.systemDefault())))); builder.append(TEXT_LINE_BREAK); return builder.toString(); diff --git a/src/main/java/de/dennisguse/opentracks/stats/SegmentStatisticUpdater.java b/src/main/java/de/dennisguse/opentracks/stats/SegmentStatisticUpdater.java index 9fb1ef587..519353f97 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/SegmentStatisticUpdater.java +++ b/src/main/java/de/dennisguse/opentracks/stats/SegmentStatisticUpdater.java @@ -89,6 +89,7 @@ public class SegmentStatisticUpdater { isIdle = other.isIdle; } + @Deprecated //TODO Remove @VisibleForTesting public SegmentStatisticUpdater(String startTime, String stopTime, double totalDistance_m, int totalTime_s, int movingTime_s, float maxSpeed_mps, Float totalAltitudeGain_m, Float totalAltitudeLoss_m) { this.startTime = Instant.parse(startTime); @@ -286,10 +287,6 @@ public class SegmentStatisticUpdater { movingTime = movingTime.plus(time); } - public Duration getStoppedTime() { - return totalTime.minus(movingTime); - } - public boolean isIdle() { return isIdle; } @@ -423,6 +420,7 @@ public class SegmentStatisticUpdater { totalAltitudeLoss_m += loss_m; } + @Deprecated //TODO Remove as it should (a) not be necessary and (b) toString is not complete? @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/de/dennisguse/opentracks/stats/Statistics.java b/src/main/java/de/dennisguse/opentracks/stats/Statistics.java index b27ddd716..4fa841dff 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/Statistics.java +++ b/src/main/java/de/dennisguse/opentracks/stats/Statistics.java @@ -37,7 +37,32 @@ public record Statistics( Power avgPower ) { + public Duration getStoppedTime() { + return totalTime.minus(movingTime); + } + + public Speed getAverageSpeed() { + if (totalTime.isZero()) { + return Speed.of(0); + } + return Speed.of(totalDistance, totalTime); + } + public Speed getAverageMovingSpeed() { return Speed.of(totalDistance, movingTime); } + + @Deprecated + //TODO null should be return (need adjusting ContentPtoviderUtils.createContentValues() + public double getMinAltitude() { + if (altitudeMin_m == null) return 0; + return altitudeMin_m; + } + + @Deprecated + //TODO null should be return (need adjusting ContentPtoviderUtils.createContentValues() + public double getMaxAltitude() { + if (altitudeMax_m == null) return 0; + return altitudeMax_m; + } } diff --git a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java index f1b075b53..8551087bf 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java +++ b/src/main/java/de/dennisguse/opentracks/stats/TrackStatisticsUpdater.java @@ -72,6 +72,7 @@ public class TrackStatisticsUpdater { resetAverageHeartRate(); } + //TODO Return Statistic? public SegmentStatisticUpdater getTrackStatistics() { // Take a snapshot - we don't want anyone messing with our trackStatistics SegmentStatisticUpdater stats = new SegmentStatisticUpdater(segmentStatisticUpdater); diff --git a/src/main/java/de/dennisguse/opentracks/viewmodels/GenericStatisticsViewHolder.java b/src/main/java/de/dennisguse/opentracks/viewmodels/GenericStatisticsViewHolder.java index f4159e0c4..ffea4bbf7 100644 --- a/src/main/java/de/dennisguse/opentracks/viewmodels/GenericStatisticsViewHolder.java +++ b/src/main/java/de/dennisguse/opentracks/viewmodels/GenericStatisticsViewHolder.java @@ -34,7 +34,7 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder valueAndUnit = DistanceFormatter.Builder() .setUnit(unitSystem) - .build(getContext()).getDistanceParts(data.getStatisticsTrack().getTotalDistance()); + .build(getContext()).getDistanceParts(data.getStatisticsTrack().totalDistance()); getBinding().statsValue.setText(valueAndUnit.first); getBinding().statsUnit.setText(valueAndUnit.second); @@ -46,7 +46,7 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder valueAndUnit = new Pair<>(StringUtils.formatElapsedTime(data.getStatisticsTrack().getTotalTime()), null); + Pair valueAndUnit = new Pair<>(StringUtils.formatElapsedTime(data.getStatisticsTrack().totalTime()), null); getBinding().statsValue.setText(valueAndUnit.first); getBinding().statsUnit.setText(valueAndUnit.second); @@ -58,7 +58,7 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder valueAndUnit = speedFormatterSpeed.getSpeedParts(data.getStatisticsTrack().getMaxSpeed()); + Pair valueAndUnit = speedFormatterSpeed.getSpeedParts(data.getStatisticsTrack().maxSpeed()); getBinding().statsValue.setText(valueAndUnit.first); getBinding().statsUnit.setText(valueAndUnit.second); @@ -236,7 +236,7 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder valueAndUnit = speedFormatterSpeed.getSpeedParts(data.getStatisticsTrack().getMaxSpeed()); + Pair valueAndUnit = speedFormatterSpeed.getSpeedParts(data.getStatisticsTrack().maxSpeed()); getBinding().statsValue.setText(valueAndUnit.first); getBinding().statsUnit.setText(valueAndUnit.second); @@ -264,8 +264,9 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder valueAndUnit = StringUtils.getAltitudeParts(getContext(), data.getStatisticsTrack().getTotalAltitudeGain(), unitSystem); + Pair valueAndUnit = StringUtils.getAltitudeParts(getContext(), gain, unitSystem); getBinding().statsValue.setText(valueAndUnit.first); getBinding().statsUnit.setText(valueAndUnit.second); @@ -277,8 +278,9 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder valueAndUnit = StringUtils.getAltitudeParts(getContext(), data.getStatisticsTrack().getTotalAltitudeLoss(), unitSystem); + Pair valueAndUnit = StringUtils.getAltitudeParts(getContext(), loss, unitSystem); getBinding().statsValue.setText(valueAndUnit.first); getBinding().statsUnit.setText(valueAndUnit.second);