From 2f127e1982fe629afab37d5d923ab2fdaccb5b6c Mon Sep 17 00:00:00 2001 From: Me7c7 Date: Sun, 12 Oct 2025 14:42:01 +0300 Subject: [PATCH] Huawei: ECG activation support. No sync. --- .../devices/huawei/HuaweiConstants.java | 2 +- .../devices/huawei/HuaweiCoordinator.java | 23 ++++- .../huawei/HuaweiSettingsCustomizer.java | 2 + .../devices/huawei/packets/ECG.java | 42 +++++++++ .../huawei/packets/FileDownloadService2C.java | 3 + .../huawei/HuaweiFileDownloadManager.java | 8 +- .../devices/huawei/HuaweiSupportProvider.java | 27 +++++- .../huawei/datasync/HuaweiDataSyncEcg.java | 92 +++++++++++++++++++ .../requests/GetFileDownloadInitRequest.java | 2 + .../requests/SendSetECGOpenRequest.java | 31 +++++++ app/src/main/res/drawable/ic_ecg.xml | 10 ++ app/src/main/res/values/strings.xml | 3 + .../res/xml/devicesettings_huawei_ecg.xml | 19 ++++ 13 files changed, 257 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/ECG.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/datasync/HuaweiDataSyncEcg.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/SendSetECGOpenRequest.java create mode 100644 app/src/main/res/drawable/ic_ecg.xml create mode 100644 app/src/main/res/xml/devicesettings_huawei_ecg.xml diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiConstants.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiConstants.java index 27e7a508b3..d98a1f5a8d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiConstants.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiConstants.java @@ -117,7 +117,7 @@ public final class HuaweiConstants { public static final String PREF_HUAWEI_ARRHYTHMIA_SWITCH = "pref_huawei_arrhythmia_switch"; public static final String PREF_HUAWEI_ARRHYTHMIA_AUTOMATIC = "pref_huawei_arrhythmia_automatic"; public static final String PREF_HUAWEI_ARRHYTHMIA_ALERT = "pref_huawei_arrhythmia_alert"; - + public static final String PREF_HUAWEI_ECG_SWITCH = "pref_huawei_ecg_switch"; public static final String PKG_NAME = "com.huawei.devicegroupmanage"; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiCoordinator.java index cdd2b58dea..1d9c3263d7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiCoordinator.java @@ -321,11 +321,12 @@ public class HuaweiCoordinator { if(supportsAutoStress()) { deviceSpecificSettings.addRootScreen(DeviceSpecificSettingsScreen.HEALTH, R.xml.devicesettings_huawei_stress); } - if(supportsArrhythmia() && isShowForceCountrySpecificFeatures(device)) { deviceSpecificSettings.addRootScreen(DeviceSpecificSettingsScreen.HEALTH, R.xml.devicesettings_huawei_arrhythmia); } - + if(supportsECG() && isShowForceCountrySpecificFeatures(device)) { + deviceSpecificSettings.addRootScreen(DeviceSpecificSettingsScreen.HEALTH, R.xml.devicesettings_huawei_ecg); + } if(supportsThreeCircle() || supportsThreeCircleLite()) { deviceSpecificSettings.addRootScreen(DeviceSpecificSettingsScreen.HEALTH, R.xml.devicesettings_huawei_activity_reminders); } @@ -923,6 +924,24 @@ public class HuaweiCoordinator { return false; } + public boolean supportsECG() { + if (supportsExpandCapability()) + return supportsExpandCapability(106); // 226 + return false; + } + + public boolean supportsECGOpen() { + if (supportsExpandCapability()) + return supportsExpandCapability(27); + return false; + } + + public boolean supportsECGNotification() { + if (supportsExpandCapability()) + return supportsExpandCapability(138); + return false; + } + public boolean supportsPromptPushMessage () { // do not ask for capabilities under specific condition // if (deviceType == 10 && deviceVersion == 73617766697368 && deviceSoftVersion == 372E312E31) -> leo device diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiSettingsCustomizer.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiSettingsCustomizer.java index 88893e5320..3e8b767b5a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiSettingsCustomizer.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiSettingsCustomizer.java @@ -50,6 +50,7 @@ import static nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiConstant import static nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiConstants.PREF_HUAWEI_ARRHYTHMIA_SWITCH; import static nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiConstants.PREF_HUAWEI_DEBUG_REQUEST; import static nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiConstants.PREF_HUAWEI_CONTINUOUS_SKIN_TEMPERATURE_MEASUREMENT; +import static nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiConstants.PREF_HUAWEI_ECG_SWITCH; import static nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiConstants.PREF_HUAWEI_HEART_RATE_HIGH_ALERT; import static nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiConstants.PREF_HUAWEI_HEART_RATE_LOW_ALERT; import static nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiConstants.PREF_HUAWEI_HEART_RATE_REALTIME_MODE; @@ -135,6 +136,7 @@ public class HuaweiSettingsCustomizer implements DeviceSpecificSettingsCustomize handler.addPreferenceHandlerFor(PREF_HUAWEI_SPO_LOW_ALERT); handler.addPreferenceHandlerFor(PREF_HUAWEI_STRESS_SWITCH); handler.addPreferenceHandlerFor(PREF_HUAWEI_STRESS_CALIBRATE); + handler.addPreferenceHandlerFor(PREF_HUAWEI_ECG_SWITCH); handler.addPreferenceHandlerFor(PREF_HUAWEI_ACTIVITY_REMINDER_STAND); handler.addPreferenceHandlerFor(PREF_HUAWEI_ACTIVITY_REMINDER_PROGRESS); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/ECG.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/ECG.java new file mode 100644 index 0000000000..f7347b778d --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/ECG.java @@ -0,0 +1,42 @@ +/* Copyright (C) 2025 Me7c7 + + 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.huawei.packets; + +import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket; +import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiTLV; + +public class ECG { + public static final byte id = 0x23; + + public static class SetECGOpen { + public static final byte id = 0x10; + + public static class Request extends HuaweiPacket { + public Request(ParamsProvider paramsProvider, byte state) { + super(paramsProvider); + + this.serviceId = ECG.id; + this.commandId = id; + + this.tlv = new HuaweiTLV().put(0x1, state); + + this.isEncrypted = true; + this.complete = true; + } + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/FileDownloadService2C.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/FileDownloadService2C.java index 03bf020e45..fc9b9dc365 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/FileDownloadService2C.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/FileDownloadService2C.java @@ -36,6 +36,7 @@ public class FileDownloadService2C { RRI, GPS, SEQUENCE_DATA, + ECG_ANALYSIS_DATA, UNKNOWN; // Never use this as input static byte fileTypeToByte(FileType fileType) { @@ -45,6 +46,7 @@ public class FileDownloadService2C { case RRI -> (byte) 0x10; case GPS -> (byte) 0x11; case SEQUENCE_DATA -> (byte) 0x16; + case ECG_ANALYSIS_DATA -> (byte) 0x18; default -> throw new RuntimeException(); }; } @@ -56,6 +58,7 @@ public class FileDownloadService2C { case 0x10 -> FileType.RRI; case 0x11 -> FileType.GPS; case 0x16 -> FileType.SEQUENCE_DATA; + case 0x18 -> FileType.ECG_ANALYSIS_DATA; default -> FileType.UNKNOWN; }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiFileDownloadManager.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiFileDownloadManager.java index 54692c5af4..35497df6d7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiFileDownloadManager.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiFileDownloadManager.java @@ -124,6 +124,7 @@ public class HuaweiFileDownloadManager { RRI, GPS, SEQUENCE_DATA, + ECG_ANALYSIS_DATA, UNKNOWN // Never for input! } @@ -183,9 +184,14 @@ public class HuaweiFileDownloadManager { } public static FileRequest rriFileRequest(boolean supportsRriNewSync, int startTime, int endTime, FileDownloadCallback fileDownloadCallback) { - return new FileRequest("rrisqi_data.bin", FileType.RRI, supportsRriNewSync, startTime, endTime,fileDownloadCallback); + return new FileRequest("rrisqi_data.bin", FileType.RRI, supportsRriNewSync, startTime, endTime, fileDownloadCallback); } + public static FileRequest ecgAnalysisFileRequest(int startTime, int endTime, FileDownloadCallback fileDownloadCallback) { + return new FileRequest("ecg_analysis_data.bin", FileType.ECG_ANALYSIS_DATA, true, startTime, endTime, fileDownloadCallback); + } + + private FileRequest(String filename, FileType fileType, int startTime, int endTime, int dictId, FileDownloadCallback fileDownloadCallback) { this.filename = filename; this.fileType = fileType; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSupportProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSupportProvider.java index 3c2b68b282..d152666568 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSupportProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSupportProvider.java @@ -136,6 +136,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.datasync.HuaweiDataSyncArrhythmia; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.datasync.HuaweiDataSyncEcg; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.datasync.HuaweiDataSyncFeatureManager; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.datasync.HuaweiDataSyncEmotion; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.datasync.HuaweiDataSyncFindDevice; @@ -174,6 +175,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.Send import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendSetContactsRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendNotifyHeartRateCapabilityRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendNotifyRestHeartRateCapabilityRequest; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendSetECGOpenRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendSleepBreathRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SetAutomaticHeartrateRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SetAutomaticSpoRequest; @@ -308,6 +310,8 @@ public class HuaweiSupportProvider { private HuaweiDataSyncArrhythmia huaweiDataSyncArrhythmia = null; + private HuaweiDataSyncEcg huaweiDataSyncEcg = null; + protected HuaweiOTAManager huaweiOTAManager = new HuaweiOTAManager(this); HuaweiStressCalibration stressCalibration = null; @@ -872,6 +876,9 @@ public class HuaweiSupportProvider { if (getHuaweiCoordinator().supportsArrhythmia() && getHuaweiCoordinator().isShowForceCountrySpecificFeatures(getCoordinator().getDevice())) { huaweiDataSyncArrhythmia = new HuaweiDataSyncArrhythmia(HuaweiSupportProvider.this); } + if (getHuaweiCoordinator().supportsECG() && getHuaweiCoordinator().isShowForceCountrySpecificFeatures(getCoordinator().getDevice())) { + huaweiDataSyncEcg = new HuaweiDataSyncEcg(HuaweiSupportProvider.this); + } // All of the below check that they are supported and otherwise they skip themselves final List initRequestQueue = new ArrayList<>(); @@ -919,6 +926,7 @@ public class HuaweiSupportProvider { initRequestQueue.add(new GetOTAChangeLog(this)); initRequestQueue.add(new SendCountryCodeRequest(this)); initRequestQueue.add(new GetWorkoutCapability(this)); + initRequestQueue.add(new SendSetECGOpenRequest(this)); initRequestQueue.add(new GetEventAlarmList(this)); initRequestQueue.add(new GetSmartAlarmList(this)); @@ -972,7 +980,7 @@ public class HuaweiSupportProvider { appIconService.register(); } } - if(getHuaweiCoordinator().supportsContactsSync()) { + if (getHuaweiCoordinator().supportsContactsSync()) { if (HuaweiP2PContactsService.getRegisteredInstance(huaweiP2PManager) == null) { HuaweiP2PContactsService contactsService = new HuaweiP2PContactsService(huaweiP2PManager); contactsService.register(); @@ -1214,6 +1222,8 @@ public class HuaweiSupportProvider { break; case HuaweiConstants.PREF_HUAWEI_ARRHYTHMIA_ALERT: setArrhythmiaAlert(); + case HuaweiConstants.PREF_HUAWEI_ECG_SWITCH: + setECG(); break; case DeviceSettingsPreferenceConst.PREF_FORCE_ENABLE_SMART_ALARM: getAlarms(); @@ -2482,6 +2492,17 @@ public class HuaweiSupportProvider { } } + private void setECG() { + boolean ecgEnabled = GBApplication + .getDeviceSpecificSharedPrefs(getDevice().getAddress()) + .getBoolean(HuaweiConstants.PREF_HUAWEI_ECG_SWITCH, false); + if (huaweiDataSyncEcg != null) { + if (!huaweiDataSyncEcg.changeECGState(ecgEnabled)) { + LOG.error("Error to set ECG"); + } + } + } + public void storeLastStressData(HuaweiStressParser.StressData data) { String str = HuaweiStressParser.stressDataToJsonStr(data); if (TextUtils.isEmpty(str)) { @@ -2772,13 +2793,13 @@ public class HuaweiSupportProvider { } public void onSetContacts(ArrayList contacts) { - if(getHuaweiCoordinator().supportsContactsSync()) { + if (getHuaweiCoordinator().supportsContactsSync()) { HuaweiP2PContactsService P2PContactsService = HuaweiP2PContactsService.getRegisteredInstance(huaweiP2PManager); if (P2PContactsService != null) { P2PContactsService.startSync(); } - } else if(getHuaweiCoordinator().supportsContacts()) { + } else if (getHuaweiCoordinator().supportsContacts()) { SendSetContactsRequest sendSetContactsRequest = new SendSetContactsRequest( this, contacts, diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/datasync/HuaweiDataSyncEcg.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/datasync/HuaweiDataSyncEcg.java new file mode 100644 index 0000000000..adcd9edb9a --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/datasync/HuaweiDataSyncEcg.java @@ -0,0 +1,92 @@ +/* Copyright (C) 2025 Me7c7 + + 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.service.devices.huawei.datasync; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiTLV; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider; + +public class HuaweiDataSyncEcg implements HuaweiDataSyncCommon.DataCallback { + private final Logger LOG = LoggerFactory.getLogger(HuaweiDataSyncEcg.class); + + private final HuaweiSupportProvider support; + + public static final String SRC_PKG_NAME = "hw.health.ecganalysis"; + public static final String PKG_NAME = "hw.watch.health.ecganalysis"; + + public HuaweiDataSyncEcg(HuaweiSupportProvider support) { + LOG.info("HuaweiDataSyncEcg"); + this.support = support; + this.support.getHuaweiDataSyncManager().registerCallback(PKG_NAME, this); + } + + private boolean sendCommonConfig(int configId, byte configAction, byte[] configData) { + LOG.info("HuaweiDataSyncEcg sendCommonConfig"); + HuaweiDataSyncCommon.ConfigCommandData data = new HuaweiDataSyncCommon.ConfigCommandData(); + HuaweiDataSyncCommon.ConfigData ecgConfigData = new HuaweiDataSyncCommon.ConfigData(); + ecgConfigData.configId = configId; + ecgConfigData.configAction = configAction; + ecgConfigData.configData = configData; + List list = new ArrayList<>(); + list.add(ecgConfigData); + data.setConfigDataList(list); + return this.support.getHuaweiDataSyncManager().sendConfigCommand(SRC_PKG_NAME, PKG_NAME, data); + } + + public boolean changeECGState(boolean state) { + HuaweiTLV tlv = new HuaweiTLV().put(0x01, (byte) (state ? 1 : 0)).put(0x02, "hw.health.ecganalysis"); + return sendCommonConfig(900300005, (byte) 1, tlv.serialize()); + } + + public boolean activateECG() { + return sendCommonConfig(900300006, (byte) 2, new byte[0]); + } + + // TODO: + public boolean sendNotifications(boolean state) { + HuaweiTLV tlv = new HuaweiTLV() + .put(0x01, (byte)0) // 1 - enable, 0 - disable + .put(0x02, (byte)0) // days as bits sun,mon,tue,wed,thu,fri,sat. 1 is set. ex. 0100001 - mon and sat. CAn be wrong, not tested. + .put(0x03, (byte)0) // hours + .put(0x04, (byte)0); // minutes + return sendCommonConfig(900300014, (byte) 1, tlv.serialize()); + } + + + @Override + public void onConfigCommand(HuaweiDataSyncCommon.ConfigCommandData data) { + } + + @Override + public void onEventCommand(HuaweiDataSyncCommon.EventCommandData data) { + + } + + @Override + public void onDataCommand(HuaweiDataSyncCommon.DataCommandData data) { + + } + + @Override + public void onDictDataCommand(HuaweiDataSyncCommon.DictDataCommandData data) { + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/GetFileDownloadInitRequest.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/GetFileDownloadInitRequest.java index ea9c742bbd..8cb3539a59 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/GetFileDownloadInitRequest.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/GetFileDownloadInitRequest.java @@ -58,6 +58,7 @@ public class GetFileDownloadInitRequest extends Request { case RRI -> FileDownloadService2C.FileType.RRI; case GPS -> FileDownloadService2C.FileType.GPS; case SEQUENCE_DATA -> FileDownloadService2C.FileType.SEQUENCE_DATA; + case ECG_ANALYSIS_DATA -> FileDownloadService2C.FileType.ECG_ANALYSIS_DATA; default -> FileDownloadService2C.FileType.UNKNOWN; }; } @@ -69,6 +70,7 @@ public class GetFileDownloadInitRequest extends Request { case RRI -> HuaweiFileDownloadManager.FileType.RRI; case GPS -> HuaweiFileDownloadManager.FileType.GPS; case SEQUENCE_DATA -> HuaweiFileDownloadManager.FileType.SEQUENCE_DATA; + case ECG_ANALYSIS_DATA -> HuaweiFileDownloadManager.FileType.ECG_ANALYSIS_DATA; default -> HuaweiFileDownloadManager.FileType.UNKNOWN; }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/SendSetECGOpenRequest.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/SendSetECGOpenRequest.java new file mode 100644 index 0000000000..4ec2aba8c3 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/SendSetECGOpenRequest.java @@ -0,0 +1,31 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests; + +import java.util.List; + +import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket; +import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.ECG; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider; + +public class SendSetECGOpenRequest extends Request { + + public SendSetECGOpenRequest(HuaweiSupportProvider support) { + super(support); + this.serviceId = ECG.id; + this.commandId = ECG.SetECGOpen.id; + } + + @Override + protected boolean requestSupported() { + return supportProvider.getHuaweiCoordinator().supportsECGOpen(); + } + + @Override + protected List createRequest() throws Request.RequestCreationException { + + try { + return new ECG.SetECGOpen.Request(paramsProvider, (byte) 0).serialize(); + } catch (HuaweiPacket.CryptoException e) { + throw new Request.RequestCreationException(e); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_ecg.xml b/app/src/main/res/drawable/ic_ecg.xml new file mode 100644 index 0000000000..d79407f973 --- /dev/null +++ b/app/src/main/res/drawable/ic_ecg.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1c3d4bd9a0..e4efee56c5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4390,4 +4390,7 @@ The device will automatically monitor your heart rate. Arrhythmia alert Receive alert when your heart rate is abnormal + ECG + Activate ECG + Activate or deactivate ECG on the device diff --git a/app/src/main/res/xml/devicesettings_huawei_ecg.xml b/app/src/main/res/xml/devicesettings_huawei_ecg.xml new file mode 100644 index 0000000000..0516655332 --- /dev/null +++ b/app/src/main/res/xml/devicesettings_huawei_ecg.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file