From 999d3e325218b0c4f0ae1054a02fabbc6bf0d6f9 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Sun, 25 Dec 2016 23:26:44 +0100 Subject: [PATCH 1/5] Mi1: Attempt at throttling notifications during sync #438 --- .../miband/operations/FetchActivityOperation.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/FetchActivityOperation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/FetchActivityOperation.java index ab4fd5d6d..01950313b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/FetchActivityOperation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/operations/FetchActivityOperation.java @@ -55,6 +55,7 @@ public class FetchActivityOperation extends AbstractMiBand1Operation { private final boolean hasExtendedActivityData; private static class ActivityStruct { + private int lastNotifiedProgress; private final byte[] activityDataHolder; private final int activityDataHolderSize; //index of the buffer above @@ -129,6 +130,7 @@ public class FetchActivityOperation extends AbstractMiBand1Operation { public void bufferFlushed(int minutes) { activityDataTimestampProgress.add(Calendar.MINUTE, minutes); activityDataHolderProgress = 0; + lastNotifiedProgress = 0; } } @@ -199,9 +201,16 @@ public class FetchActivityOperation extends AbstractMiBand1Operation { } else { bufferActivityData(value); } - LOG.debug("activity data: length: " + value.length + ", remaining bytes: " + activityStruct.activityDataRemainingBytes); + if (LOG.isDebugEnabled()) { + LOG.debug("activity data: length: " + value.length + ", remaining bytes: " + activityStruct.activityDataRemainingBytes); + } - GB.updateTransferNotification(getContext().getString(R.string.busy_task_fetch_activity_data), true, (int) (((float) (activityStruct.activityDataUntilNextHeader - activityStruct.activityDataRemainingBytes)) / activityStruct.activityDataUntilNextHeader * 100), getContext()); + int progress = (int) (((float) (activityStruct.activityDataUntilNextHeader - activityStruct.activityDataRemainingBytes)) / activityStruct.activityDataUntilNextHeader * 100); + // avoid too many notifications overloading the system + if (progress - activityStruct.lastNotifiedProgress >= 8) { + activityStruct.lastNotifiedProgress = progress; + GB.updateTransferNotification(getContext().getString(R.string.busy_task_fetch_activity_data), true, progress, getContext()); + } if (activityStruct.isBlockFinished()) { sendAckDataTransfer(activityStruct.activityDataTimestampToAck, activityStruct.activityDataUntilNextHeader); From 305bd7600caa016c4e165f718c8b5ffeab234d99 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Mon, 26 Dec 2016 00:23:02 +0100 Subject: [PATCH 2/5] Fix current realtime steps calculations #450 timestamp is already in seconds instead of milliseconds Also: port to REALTIME_SAMPLES --- .../charts/LiveActivityFragment.java | 30 +++++++++---------- .../gadgetbridge/model/DeviceService.java | 5 ---- .../service/devices/miband/MiBandSupport.java | 20 ++----------- .../devices/miband2/MiBand2Support.java | 21 ++----------- 4 files changed, 21 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java index 12b1d152d..e86fd90a0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java @@ -136,7 +136,7 @@ public class LiveActivityFragment extends AbstractChartFragment { throw new IllegalArgumentException("delta in seconds is <= 0 -- time change?"); } - int oneMinute = 60 * 1000; + int oneMinute = 60; float factor = oneMinute / seconds; int result = (int) (stepsDelta * factor); if (result > MAX_STEPS_PER_MINUTE) { @@ -152,24 +152,25 @@ public class LiveActivityFragment extends AbstractChartFragment { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); switch (action) { - case DeviceService.ACTION_REALTIME_STEPS: { - int steps = intent.getIntExtra(DeviceService.EXTRA_REALTIME_STEPS, 0); - int timestamp = translateTimestampFrom(intent); - addEntries(steps, timestamp); - break; - } - case DeviceService.ACTION_HEARTRATE_MEASUREMENT: { - int heartRate = intent.getIntExtra(DeviceService.EXTRA_HEART_RATE_VALUE, 0); - int timestamp = translateTimestampFrom(intent); - if (isValidHeartRateValue(heartRate)) { - setCurrentHeartRate(heartRate, timestamp); - } + case DeviceService.ACTION_REALTIME_SAMPLES: { + ActivitySample sample = (ActivitySample) intent.getSerializableExtra(DeviceService.EXTRA_REALTIME_SAMPLE); + addSample(sample); break; } } } }; + private void addSample(ActivitySample sample) { + int heartRate = sample.getHeartRate(); + int timestamp = tsTranslation.shorten(sample.getTimestamp()); + if (isValidHeartRateValue(heartRate)) { + setCurrentHeartRate(heartRate, timestamp); + } + int steps = sample.getSteps(); + addEntries(steps, timestamp); + } + private int translateTimestampFrom(Intent intent) { return translateTimestamp(intent.getLongExtra(DeviceService.EXTRA_TIMESTAMP, System.currentTimeMillis())); } @@ -251,8 +252,7 @@ public class LiveActivityFragment extends AbstractChartFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { IntentFilter filterLocal = new IntentFilter(); - filterLocal.addAction(DeviceService.ACTION_REALTIME_STEPS); - filterLocal.addAction(DeviceService.ACTION_HEARTRATE_MEASUREMENT); + filterLocal.addAction(DeviceService.ACTION_REALTIME_SAMPLES); heartRateValues = new ArrayList<>(); tsTranslation = new TimestampTranslation(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java index 82fd39582..c36808e5c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java @@ -38,11 +38,6 @@ public interface DeviceService extends EventHandler { String ACTION_SET_ALARMS = PREFIX + ".action.set_alarms"; String ACTION_ENABLE_REALTIME_STEPS = PREFIX + ".action.enable_realtime_steps"; String ACTION_REALTIME_SAMPLES = PREFIX + ".action.realtime_samples"; - /** - * Use EXTRA_REALTIME_SAMPLE instead - */ - @Deprecated - String ACTION_REALTIME_STEPS = PREFIX + ".action.realtime_steps"; String ACTION_ENABLE_REALTIME_HEARTRATE_MEASUREMENT = PREFIX + ".action.realtime_hr_measurement"; String ACTION_ENABLE_HEARTRATE_SLEEP_SUPPORT = PREFIX + ".action.enable_heartrate_sleep_support"; String ACTION_HEARTRATE_MEASUREMENT = PREFIX + ".action.hr_measurement"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java index 45fcc9fd5..059089a56 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java @@ -954,23 +954,9 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { sample.setRawIntensity(ActivitySample.NOT_MEASURED); sample.setRawKind(MiBandSampleProvider.TYPE_ACTIVITY); // to make it visible in the charts TODO: add a MANUAL kind for that? - // TODO: remove this once fully ported to REALTIME_SAMPLES - if (sample.getSteps() != ActivitySample.NOT_MEASURED) { - Intent intent = new Intent(DeviceService.ACTION_REALTIME_STEPS) - .putExtra(DeviceService.EXTRA_REALTIME_STEPS, sample.getSteps()) - .putExtra(DeviceService.EXTRA_TIMESTAMP, System.currentTimeMillis()); - LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); - } - if (sample.getHeartRate() != ActivitySample.NOT_MEASURED) { - Intent intent = new Intent(DeviceService.ACTION_HEARTRATE_MEASUREMENT) - .putExtra(DeviceService.EXTRA_HEART_RATE_VALUE, sample.getHeartRate()) - .putExtra(DeviceService.EXTRA_TIMESTAMP, System.currentTimeMillis()); - LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); - } - -// Intent intent = new Intent(DeviceService.ACTION_REALTIME_SAMPLES) -// .putExtra(DeviceService.EXTRA_REALTIME_SAMPLE, sample); -// LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); + Intent intent = new Intent(DeviceService.ACTION_REALTIME_SAMPLES) + .putExtra(DeviceService.EXTRA_REALTIME_SAMPLE, sample); + LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); LOG.debug("Storing realtime sample: " + sample); provider.addGBActivitySample(sample); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java index e1667f6f9..a9b866469 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java @@ -70,7 +70,6 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.Dev import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.heartrate.HeartRateProfile; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.CheckAuthenticationNeededAction; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.DeviceInfo; -import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.MiBandSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.NotificationStrategy; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.RealtimeSamplesSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband2.operations.FetchActivityOperation; @@ -983,23 +982,9 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { sample.setRawIntensity(ActivitySample.NOT_MEASURED); sample.setRawKind(MiBand2SampleProvider.TYPE_ACTIVITY); // to make it visible in the charts TODO: add a MANUAL kind for that? - // TODO: remove this once fully ported to REALTIME_SAMPLES - if (sample.getSteps() != ActivitySample.NOT_MEASURED) { - Intent intent = new Intent(DeviceService.ACTION_REALTIME_STEPS) - .putExtra(DeviceService.EXTRA_REALTIME_STEPS, sample.getSteps()) - .putExtra(DeviceService.EXTRA_TIMESTAMP, System.currentTimeMillis()); - LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); - } - if (sample.getHeartRate() != ActivitySample.NOT_MEASURED) { - Intent intent = new Intent(DeviceService.ACTION_HEARTRATE_MEASUREMENT) - .putExtra(DeviceService.EXTRA_HEART_RATE_VALUE, sample.getHeartRate()) - .putExtra(DeviceService.EXTRA_TIMESTAMP, System.currentTimeMillis()); - LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); - } - -// Intent intent = new Intent(DeviceService.ACTION_REALTIME_SAMPLES) -// .putExtra(DeviceService.EXTRA_REALTIME_SAMPLE, sample); -// LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); + Intent intent = new Intent(DeviceService.ACTION_REALTIME_SAMPLES) + .putExtra(DeviceService.EXTRA_REALTIME_SAMPLE, sample); + LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); LOG.debug("Storing realtime sample: " + sample); provider.addGBActivitySample(sample); From 8719cadc4373cf482ac8ee04c1d479104de66264 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Mon, 26 Dec 2016 01:38:20 +0100 Subject: [PATCH 3/5] Mi Band: fix live activity messing up stepcount #448 live samples now report relative steps, not absolute to the current day's stepcount. Also live samples' steps should NOT be added to the database since they are already counted in the regular stepcount. --- .../charts/LiveActivityFragment.java | 30 ++++++++----------- .../service/devices/miband/MiBandSupport.java | 12 ++++++-- .../miband/RealtimeSamplesSupport.java | 22 +++++++++++--- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java index e86fd90a0..23bef14b5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java @@ -97,32 +97,26 @@ public class LiveActivityFragment extends AbstractChartFragment { return maxStepsPerMinute; } - public void updateCurrentSteps(int newSteps, int timestamp) { + public void updateCurrentSteps(int stepsDelta, int timestamp) { try { if (steps == 0) { - steps = newSteps; + steps += stepsDelta; lastTimestamp = timestamp; - if (newSteps > 0) { - initialSteps = newSteps; - } +// if (stepsDelta > 0) { +// initialSteps = stepsDelta; +// } return; } - if (newSteps >= steps) { - int stepsDelta = newSteps - steps; - int timeDelta = timestamp - lastTimestamp; - currentStepsPerMinute = calculateStepsPerMinute(stepsDelta, timeDelta); - if (currentStepsPerMinute > maxStepsPerMinute) { - maxStepsPerMinute = currentStepsPerMinute; - maxStepsResetCounter = 0; - } - steps = newSteps; - lastTimestamp = timestamp; - } else { - // TODO: handle new day? - + int timeDelta = timestamp - lastTimestamp; + currentStepsPerMinute = calculateStepsPerMinute(stepsDelta, timeDelta); + if (currentStepsPerMinute > maxStepsPerMinute) { + maxStepsPerMinute = currentStepsPerMinute; + maxStepsResetCounter = 0; } + steps += stepsDelta; + lastTimestamp = timestamp; } catch (Exception ex) { GB.toast(LiveActivityFragment.this.getContext(), ex.getMessage(), Toast.LENGTH_SHORT, GB.ERROR, ex); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java index 059089a56..33a81bc28 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java @@ -950,16 +950,22 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { MiBandSampleProvider provider = new MiBandSampleProvider(gbDevice, session); MiBandActivitySample sample = createActivitySample(device, user, ts, provider); sample.setHeartRate(getHeartrateBpm()); - sample.setSteps(getSteps()); sample.setRawIntensity(ActivitySample.NOT_MEASURED); sample.setRawKind(MiBandSampleProvider.TYPE_ACTIVITY); // to make it visible in the charts TODO: add a MANUAL kind for that? + LOG.debug("Storing realtime sample: " + sample); + provider.addGBActivitySample(sample); + + // set the steps only afterwards, since realtime steps are also recorded + // in the regular samples and we must not count them twice + // Note: we know that the DAO sample is never committed again, so we simply + // change the value here in memory. + sample.setSteps(getSteps()); + Intent intent = new Intent(DeviceService.ACTION_REALTIME_SAMPLES) .putExtra(DeviceService.EXTRA_REALTIME_SAMPLE, sample); LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); - LOG.debug("Storing realtime sample: " + sample); - provider.addGBActivitySample(sample); } catch (Exception e) { LOG.warn("Unable to acquire db for saving realtime samples", e); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/RealtimeSamplesSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/RealtimeSamplesSupport.java index a160af8c6..990fdc62a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/RealtimeSamplesSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/RealtimeSamplesSupport.java @@ -22,6 +22,7 @@ public abstract class RealtimeSamplesSupport { protected int steps; protected int heartrateBpm; + private int lastSteps; // subclasses may add more private Timer realtimeStorageTimer; @@ -56,12 +57,22 @@ public abstract class RealtimeSamplesSupport { return realtimeStorageTimer != null; } - public void setSteps(int stepsPerMinute) { + public synchronized void setSteps(int stepsPerMinute) { this.steps = stepsPerMinute; } - public int getSteps() { - return steps; + public synchronized int getSteps() { + if (lastSteps == 0) { + return 0; // wait until we have a delta between two samples + } + if (steps == ActivitySample.NOT_MEASURED) { + return 0; + } + int delta = steps - lastSteps; + if (delta < 0) { + return 0; + } + return delta; } public void setHeartrateBpm(int hrBpm) { @@ -77,7 +88,10 @@ public abstract class RealtimeSamplesSupport { resetCurrentValues(); } - protected void resetCurrentValues() { + protected synchronized void resetCurrentValues() { + if (steps >= lastSteps) { + lastSteps = steps; + } steps = ActivitySample.NOT_MEASURED; heartrateBpm = ActivitySample.NOT_MEASURED; } From da494cde7b773e89ae96a646e7592aa2abb64ccb Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Mon, 26 Dec 2016 11:33:01 +0100 Subject: [PATCH 4/5] Handle live activity for Mi2 and Mi1 in the same way #448 Realtime samples now use ActivitySample.NOT_MEASURED for unknown or invalid values. --- .../activities/charts/LiveActivityFragment.java | 12 ++++-------- .../service/devices/miband/MiBandSupport.java | 5 ++++- .../devices/miband/RealtimeSamplesSupport.java | 13 +++++++++---- .../service/devices/miband2/MiBand2Support.java | 14 ++++++++++++-- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java index 23bef14b5..ade11b842 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java @@ -72,8 +72,6 @@ public class LiveActivityFragment extends AbstractChartFragment { private TimestampTranslation tsTranslation; private class Steps { - private int initialSteps; - private int steps; private int lastTimestamp; private int currentStepsPerMinute; @@ -90,7 +88,7 @@ public class LiveActivityFragment extends AbstractChartFragment { } public int getTotalSteps() { - return steps - initialSteps; + return steps; } public int getMaxStepsPerMinute() { @@ -102,10 +100,6 @@ public class LiveActivityFragment extends AbstractChartFragment { if (steps == 0) { steps += stepsDelta; lastTimestamp = timestamp; - -// if (stepsDelta > 0) { -// initialSteps = stepsDelta; -// } return; } @@ -162,7 +156,9 @@ public class LiveActivityFragment extends AbstractChartFragment { setCurrentHeartRate(heartRate, timestamp); } int steps = sample.getSteps(); - addEntries(steps, timestamp); + if (steps != ActivitySample.NOT_MEASURED) { + addEntries(steps, timestamp); + } } private int translateTimestampFrom(Intent intent) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java index 33a81bc28..23d7bb234 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java @@ -953,7 +953,6 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { sample.setRawIntensity(ActivitySample.NOT_MEASURED); sample.setRawKind(MiBandSampleProvider.TYPE_ACTIVITY); // to make it visible in the charts TODO: add a MANUAL kind for that? - LOG.debug("Storing realtime sample: " + sample); provider.addGBActivitySample(sample); // set the steps only afterwards, since realtime steps are also recorded @@ -962,6 +961,10 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { // change the value here in memory. sample.setSteps(getSteps()); + if (LOG.isDebugEnabled()) { + LOG.debug("realtime sample: " + sample); + } + Intent intent = new Intent(DeviceService.ACTION_REALTIME_SAMPLES) .putExtra(DeviceService.EXTRA_REALTIME_SAMPLE, sample); LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/RealtimeSamplesSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/RealtimeSamplesSupport.java index 990fdc62a..f0b83c2e6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/RealtimeSamplesSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/RealtimeSamplesSupport.java @@ -61,12 +61,17 @@ public abstract class RealtimeSamplesSupport { this.steps = stepsPerMinute; } + /** + * Returns the number of steps recorded since the last measurements. If no + * steps are available yet, ActivitySample.NOT_MEASURED is returned. + * @return + */ public synchronized int getSteps() { - if (lastSteps == 0) { - return 0; // wait until we have a delta between two samples - } if (steps == ActivitySample.NOT_MEASURED) { - return 0; + return ActivitySample.NOT_MEASURED; + } + if (lastSteps == 0) { + return ActivitySample.NOT_MEASURED; // wait until we have a delta between two samples } int delta = steps - lastSteps; if (delta < 0) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java index a9b866469..a89ff44c4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java @@ -982,12 +982,22 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { sample.setRawIntensity(ActivitySample.NOT_MEASURED); sample.setRawKind(MiBand2SampleProvider.TYPE_ACTIVITY); // to make it visible in the charts TODO: add a MANUAL kind for that? + provider.addGBActivitySample(sample); + + // set the steps only afterwards, since realtime steps are also recorded + // in the regular samples and we must not count them twice + // Note: we know that the DAO sample is never committed again, so we simply + // change the value here in memory. + sample.setSteps(getSteps()); + + if (LOG.isDebugEnabled()) { + LOG.debug("realtime sample: " + sample); + } + Intent intent = new Intent(DeviceService.ACTION_REALTIME_SAMPLES) .putExtra(DeviceService.EXTRA_REALTIME_SAMPLE, sample); LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent); - LOG.debug("Storing realtime sample: " + sample); - provider.addGBActivitySample(sample); } catch (Exception e) { LOG.warn("Unable to acquire db for saving realtime samples", e); } From bb8aff8c99226e5a1cc54a434cecf08fa48c53a3 Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Mon, 26 Dec 2016 12:51:20 +0100 Subject: [PATCH 5/5] Fix axis label color live activity (dark theme) --- .../gadgetbridge/activities/charts/LiveActivityFragment.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java index ade11b842..3e757236d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/LiveActivityFragment.java @@ -367,6 +367,9 @@ public class LiveActivityFragment extends AbstractChartFragment { // chart.getXAxis().setPosition(XAxis.XAxisPosition.TOP); chart.getXAxis().setDrawLabels(false); chart.getXAxis().setEnabled(false); + chart.getXAxis().setTextColor(CHART_TEXT_COLOR); + chart.getAxisLeft().setTextColor(CHART_TEXT_COLOR); + chart.setBackgroundColor(BACKGROUND_COLOR); chart.getDescription().setTextColor(DESCRIPTION_COLOR); chart.getDescription().setText(title);