diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/MonotonicClock.java b/src/main/java/de/dennisguse/opentracks/services/handlers/MonotonicClock.java new file mode 100644 index 000000000..e04452857 --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/MonotonicClock.java @@ -0,0 +1,40 @@ +package de.dennisguse.opentracks.services.handlers; + +import android.os.SystemClock; + +import java.time.Clock; +import java.time.Instant; +import java.time.ZoneId; + +/** + * A monotonic clock relative to the device's clock at time of the instantiation. + * Uses device time since startup. + * Replacement for java.time.Clock as it may not be monotonic (i.e., can jump back and forwards). + */ +public class MonotonicClock extends Clock { + + private final long epochAtCreation; + + private final long elapsedRealtimeAtCreation; + + public MonotonicClock() { + epochAtCreation = Instant.now().toEpochMilli(); + elapsedRealtimeAtCreation = SystemClock.elapsedRealtime(); + } + + @Override + public Instant instant() { + long current = (SystemClock.elapsedRealtime() - elapsedRealtimeAtCreation); + return Instant.ofEpochMilli(epochAtCreation + current); + } + + @Override + public ZoneId getZone() { + throw new RuntimeException("Not implemented"); + } + + @Override + public Clock withZone(ZoneId zone) { + throw new RuntimeException("Not implemented"); + } +} diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java b/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java index 4fe2ba3b4..2d61eccc0 100644 --- a/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java @@ -30,7 +30,7 @@ public class TrackPointCreator implements BluetoothRemoteSensorManager.SensorDat private final Callback service; @NonNull - private Clock clock = Clock.systemUTC(); + private Clock clock = new MonotonicClock(); private final GPSHandler gpsHandler; private BluetoothRemoteSensorManager remoteSensorManager; diff --git a/src/main/java/de/dennisguse/opentracks/stats/TrackStatistics.java b/src/main/java/de/dennisguse/opentracks/stats/TrackStatistics.java index f2b2e4ac4..17dc6da9d 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/TrackStatistics.java +++ b/src/main/java/de/dennisguse/opentracks/stats/TrackStatistics.java @@ -220,9 +220,7 @@ public class TrackStatistics { @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) public void addMovingTime(Duration time) { if (time.isNegative()) { - // Needs implementation of a monotonic Clock #800 - // throw new RuntimeException("Moving time cannot be negative"); - return; + throw new RuntimeException("Moving time cannot be negative"); } movingTime = movingTime.plus(time); }