From 7de97a49b03416ca2d104a9ee0f197429734e64f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sat, 5 Oct 2024 18:00:57 +0100 Subject: [PATCH] Garmin: Fix over-counting of distance at turn of day --- .../devices/AbstractSampleProvider.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractSampleProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractSampleProvider.java index 63eeb7fac..60681bf1c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractSampleProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractSampleProvider.java @@ -190,12 +190,22 @@ public abstract class AbstractSampleProvider i protected abstract Property getDeviceIdentifierSampleProperty(); public void convertCumulativeSteps(final List samples, final Property stepsSampleProperty) { + // Fix over-counting at the turn of day final T lastSample = getLastSampleWithStepsBefore(samples.get(0).getTimestamp(), stepsSampleProperty); - if (lastSample != null && sameDay(lastSample, samples.get(0)) && samples.get(0).getSteps() > 0) { - samples.get(0).setSteps(samples.get(0).getSteps() - lastSample.getSteps()); + if (lastSample != null && sameDay(lastSample, samples.get(0))) { + if (samples.get(0).getSteps() > 0) { + samples.get(0).setSteps(samples.get(0).getSteps() - lastSample.getSteps()); + } + + if (samples.get(0).getDistanceCm() > 0) { + samples.get(0).setDistanceCm(samples.get(0).getDistanceCm() - lastSample.getDistanceCm()); + } + + if (samples.get(0).getActiveCalories() > 0) { + samples.get(0).setActiveCalories(samples.get(0).getActiveCalories() - lastSample.getActiveCalories()); + } } - // Steps on the Garmin Watch are reported cumulatively per day - convert them to // This slightly breaks activity recognition, because we don't have per-minute granularity... int prevSteps = samples.get(0).getSteps(); int prevDistance = samples.get(0).getDistanceCm();