From e53c67e8bf8f4c4134d7f2ecff86cd636526856c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sun, 26 Nov 2023 18:03:20 +0000 Subject: [PATCH] Xiaomi: Fix SpO2 --- .../AbstractSampleToTimeSampleProvider.java | 6 +- .../devices/xiaomi/XiaomiCoordinator.java | 24 +------ .../xiaomi/XiaomiSpo2SampleProvider.java | 66 +++++++++++++++++++ .../gadgetbridge/model/Spo2Sample.java | 1 + 4 files changed, 74 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiSpo2SampleProvider.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractSampleToTimeSampleProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractSampleToTimeSampleProvider.java index c65b58e61..1b10367d0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractSampleToTimeSampleProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractSampleToTimeSampleProvider.java @@ -41,6 +41,7 @@ public abstract class AbstractSampleToTimeSampleProvider upstreamSamples = mSampleProvider.getAllActivitySamples((int) (timestampFrom / 1000L), (int) (timestampTo / 1000L)); final List ret = new ArrayList<>(); for (final S sample : upstreamSamples) { - ret.add(convertSample(sample)); + final T converted = convertSample(sample); + if (converted != null) { + ret.add(converted); + } } return ret; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java index 6d68ce2fc..7e818fc33 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java @@ -76,8 +76,7 @@ public abstract class XiaomiCoordinator extends AbstractBLEDeviceCoordinator { @Override public TimeSampleProvider getSpo2SampleProvider(final GBDevice device, final DaoSession session) { - // TODO XiaomiSpo2SampleProvider - return super.getSpo2SampleProvider(device, session); + return new XiaomiSpo2SampleProvider(device, session); } @Override @@ -156,24 +155,6 @@ public abstract class XiaomiCoordinator extends AbstractBLEDeviceCoordinator { return AppManagerActivity.class; } - @Override - public File getAppCacheDir() throws IOException { - // TODO we don't need this - return new File(FileUtils.getExternalFilesDir(), "xiaomi-app-cache"); - } - - @Override - public String getAppCacheSortFilename() { - // TODO we don't need this - return "xiaomi-app-cache-order.txt"; - } - - @Override - public String getAppFileExtension() { - // TODO we don't need this - return ".bin"; - } - @Override public boolean supportsAppListFetching() { return true; @@ -217,8 +198,7 @@ public abstract class XiaomiCoordinator extends AbstractBLEDeviceCoordinator { @Override public boolean supportsSpo2() { - // TODO it does, but not yet implemented, so let's not crash - return false; + return true; } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiSpo2SampleProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiSpo2SampleProvider.java new file mode 100644 index 000000000..c499a287d --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiSpo2SampleProvider.java @@ -0,0 +1,66 @@ +/* Copyright (C) 2023 José Rebelo + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.devices.xiaomi; + +import nodomain.freeyourgadget.gadgetbridge.devices.AbstractSampleToTimeSampleProvider; +import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; +import nodomain.freeyourgadget.gadgetbridge.entities.XiaomiActivitySample; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.model.Spo2Sample; + +public class XiaomiSpo2SampleProvider extends AbstractSampleToTimeSampleProvider { + public XiaomiSpo2SampleProvider(final GBDevice device, final DaoSession session) { + super(new XiaomiSampleProvider(device, session), device, session); + } + + @Override + protected Spo2Sample convertSample(final XiaomiActivitySample sample) { + if (sample.getSpo2() == 0) { + return null; + } + + return new XiaomiSpo2Sample( + sample.getTimestamp() * 1000L, + sample.getSpo2() + ); + } + + protected static class XiaomiSpo2Sample implements Spo2Sample { + private final long timestamp; + private final int spo2; + + public XiaomiSpo2Sample(final long timestamp, final int spo2) { + this.timestamp = timestamp; + this.spo2 = spo2; + } + + @Override + public long getTimestamp() { + return timestamp; + } + + @Override + public Type getType() { + return Type.UNKNOWN; + } + + @Override + public int getSpo2() { + return spo2; + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/Spo2Sample.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/Spo2Sample.java index 67a8c14dc..9982d550d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/Spo2Sample.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/Spo2Sample.java @@ -20,6 +20,7 @@ public interface Spo2Sample extends TimeSample { enum Type { MANUAL(0), AUTOMATIC(1), + UNKNOWN(2), ; private final int num;