From 8ff3ce0477227f49eaa69dcd19f04cbcf0b22e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sat, 10 Jun 2023 23:31:38 +0100 Subject: [PATCH] Zepp OS: Add experimental app management --- .../adapter/GBDeviceAdapterv2.java | 4 +- .../devices/DeviceCoordinator.java | 2 +- .../devices/UnknownDeviceCoordinator.java | 2 +- .../AsteroidOSDeviceCoordinator.java | 2 +- .../devices/banglejs/BangleJSCoordinator.java | 4 +- .../coordinator/BinarySensorCoordinator.java | 2 +- .../gb6900/CasioGB6900DeviceCoordinator.java | 2 +- .../gbx100/CasioGBX100DeviceCoordinator.java | 2 +- ...dnator.java => DomyosT540Coordinator.java} | 4 +- .../fitpro/FitProDeviceCoordinator.java | 2 +- .../flipper/zero/FlipperZeroCoordinator.java | 2 +- .../GalaxyBudsGenericCoordinator.java | 2 +- .../devices/hplus/HPlusCoordinator.java | 2 +- .../devices/huami/Huami2021Coordinator.java | 40 +++++ .../devices/huami/HuamiCoordinator.java | 2 +- .../devices/id115/ID115Coordinator.java | 2 +- .../devices/itag/ITagCoordinator.java | 2 +- .../devices/jyou/BFH16DeviceCoordinator.java | 3 +- .../TeclastH30/TeclastH30Coordinator.java | 2 +- .../devices/jyou/y5/Y5Coordinator.java | 2 +- .../devices/lefun/LefunDeviceCoordinator.java | 2 +- .../WatchXPlusDeviceCoordinator.java | 2 +- .../devices/liveview/LiveviewCoordinator.java | 2 +- .../makibeshr3/MakibesHR3Coordinator.java | 2 +- .../devices/miband/MiBandCoordinator.java | 2 +- .../MijiaLywsd02Coordinator.java | 2 +- .../miscale2/MiScale2DeviceCoordinator.java | 2 +- .../devices/no1f1/No1F1Coordinator.java | 2 +- .../devices/nothing/Ear1Coordinator.java | 2 +- .../devices/nut/NutCoordinator.java | 2 +- .../devices/pebble/PebbleCoordinator.java | 2 +- .../pinetime/PineTimeJFCoordinator.java | 2 +- .../devices/qc35/QC35Coordinator.java | 2 +- .../devices/qhybrid/QHybridCoordinator.java | 2 +- .../devices/roidmi/RoidmiCoordinator.java | 2 +- .../devices/smaq2oss/SMAQ2OSSCoordinator.java | 2 +- .../devices/soflow/SoFlowCoordinator.java | 2 +- .../headphones/SonyHeadphonesCoordinator.java | 2 +- .../sonyswr12/SonySWR12DeviceCoordinator.java | 2 +- .../supercars/SuperCarsCoordinator.java | 2 +- .../devices/tlw64/TLW64Coordinator.java | 2 +- .../um25/Coordinator/UM25Coordinator.java | 2 +- .../devices/vesc/VescCoordinator.java | 2 +- .../vibratissimo/VibratissimoCoordinator.java | 2 +- .../devices/waspos/WaspOSCoordinator.java | 2 +- .../watch9/Watch9DeviceCoordinator.java | 2 +- .../devices/xwatch/XWatchCoordinator.java | 2 +- .../devices/zetime/ZeTimeCoordinator.java | 2 +- .../devices/huami/Huami2021Support.java | 22 +++ .../zeppos/services/ZeppOsAppsService.java | 157 ++++++++++++++++++ .../gadgetbridge/util/DeviceHelper.java | 4 +- 51 files changed, 272 insertions(+), 52 deletions(-) rename app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/domyos/{DomyosT540Cooridnator.java => DomyosT540Coordinator.java} (96%) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsAppsService.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java index daf7bcf9a..caa837fb5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java @@ -438,7 +438,7 @@ public class GBDeviceAdapterv2 extends ListAdapter getAppsManagementActivity() { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/binary_sensor/coordinator/BinarySensorCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/binary_sensor/coordinator/BinarySensorCoordinator.java index a18c688e2..3862f6bfd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/binary_sensor/coordinator/BinarySensorCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/binary_sensor/coordinator/BinarySensorCoordinator.java @@ -121,7 +121,7 @@ public class BinarySensorCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return true; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/casio/gb6900/CasioGB6900DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/casio/gb6900/CasioGB6900DeviceCoordinator.java index 99144aeae..654abe191 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/casio/gb6900/CasioGB6900DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/casio/gb6900/CasioGB6900DeviceCoordinator.java @@ -138,7 +138,7 @@ public class CasioGB6900DeviceCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/casio/gbx100/CasioGBX100DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/casio/gbx100/CasioGBX100DeviceCoordinator.java index e311ae2c2..dd8b61e96 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/casio/gbx100/CasioGBX100DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/casio/gbx100/CasioGBX100DeviceCoordinator.java @@ -142,7 +142,7 @@ public class CasioGBX100DeviceCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/domyos/DomyosT540Cooridnator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/domyos/DomyosT540Coordinator.java similarity index 96% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/domyos/DomyosT540Cooridnator.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/domyos/DomyosT540Coordinator.java index 88a9973f8..94cdba0ba 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/domyos/DomyosT540Cooridnator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/domyos/DomyosT540Coordinator.java @@ -33,7 +33,7 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; -public class DomyosT540Cooridnator extends AbstractBLEDeviceCoordinator { +public class DomyosT540Coordinator extends AbstractBLEDeviceCoordinator { @NonNull @Override public DeviceType getSupportedType(GBDeviceCandidate candidate) { @@ -100,7 +100,7 @@ public class DomyosT540Cooridnator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/fitpro/FitProDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/fitpro/FitProDeviceCoordinator.java index 8af50c356..070d5d23e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/fitpro/FitProDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/fitpro/FitProDeviceCoordinator.java @@ -143,7 +143,7 @@ public class FitProDeviceCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/flipper/zero/FlipperZeroCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/flipper/zero/FlipperZeroCoordinator.java index 29f7044a8..568f33f53 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/flipper/zero/FlipperZeroCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/flipper/zero/FlipperZeroCoordinator.java @@ -87,7 +87,7 @@ public class FlipperZeroCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/galaxy_buds/GalaxyBudsGenericCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/galaxy_buds/GalaxyBudsGenericCoordinator.java index 2d6455243..01a985a78 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/galaxy_buds/GalaxyBudsGenericCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/galaxy_buds/GalaxyBudsGenericCoordinator.java @@ -76,7 +76,7 @@ public abstract class GalaxyBudsGenericCoordinator extends AbstractBLClassicDevi } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java index 8c34f04e1..8d4283abb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java @@ -161,7 +161,7 @@ public class HPlusCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/Huami2021Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/Huami2021Coordinator.java index 0ac8fb185..8365f03a5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/Huami2021Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/Huami2021Coordinator.java @@ -16,6 +16,7 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.devices.huami; +import android.app.Activity; import android.content.Context; import android.net.Uri; @@ -23,12 +24,15 @@ import androidx.annotation.NonNull; import org.apache.commons.lang3.ArrayUtils; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.appmanager.AppManagerActivity; import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettingsCustomizer; import nodomain.freeyourgadget.gadgetbridge.capabilities.HeartRateCapability; import nodomain.freeyourgadget.gadgetbridge.capabilities.password.PasswordCapabilityImpl; @@ -52,6 +56,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.service import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiLanguageType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiVibrationPatternNotificationType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsPhoneService; +import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; public abstract class Huami2021Coordinator extends HuamiCoordinator { @@ -158,6 +163,41 @@ public abstract class Huami2021Coordinator extends HuamiCoordinator { return true; } + @Override + public boolean supportsAppsManagement(final GBDevice device) { + return experimentalFeatures(device); + } + + @Override + public Class getAppsManagementActivity() { + return AppManagerActivity.class; + } + + @Override + public File getAppCacheDir() throws IOException { + return new File(FileUtils.getExternalFilesDir(), "zepp-os-app-cache"); + } + + @Override + public String getAppCacheSortFilename() { + return "zepp-os-app-cache-order.txt"; + } + + @Override + public String getAppFileExtension() { + return ".zip"; + } + + @Override + public boolean supportsAppListFetching() { + return true; + } + + @Override + public boolean supportsAppReordering() { + return false; + } + @Override public boolean supportsCalendarEvents() { return true; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java index 8d12104ea..3610eda0f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/HuamiCoordinator.java @@ -91,7 +91,7 @@ public abstract class HuamiCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/id115/ID115Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/id115/ID115Coordinator.java index 66b5be12b..2c1ca39fa 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/id115/ID115Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/id115/ID115Coordinator.java @@ -126,7 +126,7 @@ public class ID115Coordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/itag/ITagCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/itag/ITagCoordinator.java index dda92cdfd..849834db5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/itag/ITagCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/itag/ITagCoordinator.java @@ -126,7 +126,7 @@ public class ITagCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/BFH16DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/BFH16DeviceCoordinator.java index 72d5457b4..0964b8ee0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/BFH16DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/BFH16DeviceCoordinator.java @@ -160,8 +160,7 @@ public class BFH16DeviceCoordinator extends AbstractBLEDeviceCoordinator } @Override - public boolean supportsAppsManagement() - { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/TeclastH30/TeclastH30Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/TeclastH30/TeclastH30Coordinator.java index fba636a35..f5308d28b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/TeclastH30/TeclastH30Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/TeclastH30/TeclastH30Coordinator.java @@ -162,7 +162,7 @@ public class TeclastH30Coordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/y5/Y5Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/y5/Y5Coordinator.java index f0c570022..e43b36f2c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/y5/Y5Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/y5/Y5Coordinator.java @@ -118,7 +118,7 @@ public class Y5Coordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lefun/LefunDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lefun/LefunDeviceCoordinator.java index 2bc15e72b..b3f68d0b9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lefun/LefunDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lefun/LefunDeviceCoordinator.java @@ -129,7 +129,7 @@ public class LefunDeviceCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusDeviceCoordinator.java index 9f1f895cd..37af85b11 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/lenovo/watchxplus/WatchXPlusDeviceCoordinator.java @@ -161,7 +161,7 @@ public class WatchXPlusDeviceCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/liveview/LiveviewCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/liveview/LiveviewCoordinator.java index 6d120365e..33696d2c8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/liveview/LiveviewCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/liveview/LiveviewCoordinator.java @@ -100,7 +100,7 @@ public class LiveviewCoordinator extends AbstractBLClassicDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/makibeshr3/MakibesHR3Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/makibeshr3/MakibesHR3Coordinator.java index a1061d62a..034032f4a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/makibeshr3/MakibesHR3Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/makibeshr3/MakibesHR3Coordinator.java @@ -256,7 +256,7 @@ public class MakibesHR3Coordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandCoordinator.java index c59ad19bd..865e7579d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandCoordinator.java @@ -154,7 +154,7 @@ public class MiBandCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/mijia_lywsd02/MijiaLywsd02Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/mijia_lywsd02/MijiaLywsd02Coordinator.java index 6df2f9ca5..925b70e92 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/mijia_lywsd02/MijiaLywsd02Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/mijia_lywsd02/MijiaLywsd02Coordinator.java @@ -105,7 +105,7 @@ public class MijiaLywsd02Coordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miscale2/MiScale2DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miscale2/MiScale2DeviceCoordinator.java index 2540d6c12..a1347cd42 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miscale2/MiScale2DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miscale2/MiScale2DeviceCoordinator.java @@ -145,7 +145,7 @@ public class MiScale2DeviceCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/no1f1/No1F1Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/no1f1/No1F1Coordinator.java index 22fe23a5b..8e313dde9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/no1f1/No1F1Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/no1f1/No1F1Coordinator.java @@ -126,7 +126,7 @@ public class No1F1Coordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/Ear1Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/Ear1Coordinator.java index d0f1703ae..ab21ccfdd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/Ear1Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nothing/Ear1Coordinator.java @@ -87,7 +87,7 @@ public class Ear1Coordinator extends AbstractBLClassicDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nut/NutCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nut/NutCoordinator.java index 659b805d6..7c19a2eec 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nut/NutCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/nut/NutCoordinator.java @@ -128,7 +128,7 @@ public class NutCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pebble/PebbleCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pebble/PebbleCoordinator.java index 28b5e7a6b..168718b1b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pebble/PebbleCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pebble/PebbleCoordinator.java @@ -146,7 +146,7 @@ public class PebbleCoordinator extends AbstractBLClassicDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return true; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pinetime/PineTimeJFCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pinetime/PineTimeJFCoordinator.java index afc7913cc..f2680f9ca 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pinetime/PineTimeJFCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pinetime/PineTimeJFCoordinator.java @@ -105,7 +105,7 @@ public class PineTimeJFCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qc35/QC35Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qc35/QC35Coordinator.java index 992136454..e064f962f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qc35/QC35Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qc35/QC35Coordinator.java @@ -114,7 +114,7 @@ public class QC35Coordinator extends AbstractBLClassicDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridCoordinator.java index 35cfce8a5..44078d1c0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/qhybrid/QHybridCoordinator.java @@ -174,7 +174,7 @@ public class QHybridCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return true; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/roidmi/RoidmiCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/roidmi/RoidmiCoordinator.java index 9dcf006b0..ef2c5780e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/roidmi/RoidmiCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/roidmi/RoidmiCoordinator.java @@ -99,7 +99,7 @@ public abstract class RoidmiCoordinator extends AbstractBLClassicDeviceCoordinat } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/smaq2oss/SMAQ2OSSCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/smaq2oss/SMAQ2OSSCoordinator.java index 5fc7788c2..54dfd5f0d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/smaq2oss/SMAQ2OSSCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/smaq2oss/SMAQ2OSSCoordinator.java @@ -123,7 +123,7 @@ public class SMAQ2OSSCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/soflow/SoFlowCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/soflow/SoFlowCoordinator.java index 58b1b08f2..b3f98a296 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/soflow/SoFlowCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/soflow/SoFlowCoordinator.java @@ -100,7 +100,7 @@ public class SoFlowCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/sony/headphones/SonyHeadphonesCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/sony/headphones/SonyHeadphonesCoordinator.java index 964b2b426..3d6aa7769 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/sony/headphones/SonyHeadphonesCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/sony/headphones/SonyHeadphonesCoordinator.java @@ -106,7 +106,7 @@ public abstract class SonyHeadphonesCoordinator extends AbstractBLClassicDeviceC } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/sonyswr12/SonySWR12DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/sonyswr12/SonySWR12DeviceCoordinator.java index 5eebcbec1..471a6c1dc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/sonyswr12/SonySWR12DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/sonyswr12/SonySWR12DeviceCoordinator.java @@ -111,7 +111,7 @@ public class SonySWR12DeviceCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/SuperCarsCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/SuperCarsCoordinator.java index 42cf2f3ea..69d17abb1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/SuperCarsCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/SuperCarsCoordinator.java @@ -115,7 +115,7 @@ public class SuperCarsCoordinator extends AbstractDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return true; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Coordinator.java index c77ae8bcc..4de18f3f8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/tlw64/TLW64Coordinator.java @@ -111,7 +111,7 @@ public class TLW64Coordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/um25/Coordinator/UM25Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/um25/Coordinator/UM25Coordinator.java index 43fc1523c..fee9041ed 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/um25/Coordinator/UM25Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/um25/Coordinator/UM25Coordinator.java @@ -121,7 +121,7 @@ public class UM25Coordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return true; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vesc/VescCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vesc/VescCoordinator.java index c5ea6097c..e1ce9b519 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vesc/VescCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vesc/VescCoordinator.java @@ -136,7 +136,7 @@ public class VescCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return true; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java index 3f4c3d4d9..cd20158df 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java @@ -100,7 +100,7 @@ public class VibratissimoCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/waspos/WaspOSCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/waspos/WaspOSCoordinator.java index cb85d0efb..f395cf994 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/waspos/WaspOSCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/waspos/WaspOSCoordinator.java @@ -131,7 +131,7 @@ public class WaspOSCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/watch9/Watch9DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/watch9/Watch9DeviceCoordinator.java index f67b9823e..17094eb37 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/watch9/Watch9DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/watch9/Watch9DeviceCoordinator.java @@ -134,7 +134,7 @@ public class Watch9DeviceCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xwatch/XWatchCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xwatch/XWatchCoordinator.java index 35be26531..2b60f65e4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xwatch/XWatchCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xwatch/XWatchCoordinator.java @@ -107,7 +107,7 @@ public class XWatchCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimeCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimeCoordinator.java index c9352f43d..9d118d16b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimeCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimeCoordinator.java @@ -118,7 +118,7 @@ public class ZeTimeCoordinator extends AbstractBLEDeviceCoordinator { } @Override - public boolean supportsAppsManagement() { + public boolean supportsAppsManagement(final GBDevice device) { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021Support.java index 6a87fbe6e..5f53945b5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021Support.java @@ -66,6 +66,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; @@ -112,6 +113,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.operati import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsAgpsService; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsAlarmsService; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsAlexaService; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsAppsService; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsCalendarService; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsCannedMessagesService; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsNotificationService; @@ -154,6 +156,7 @@ public abstract class Huami2021Support extends HuamiSupport { private final ZeppOsCannedMessagesService cannedMessagesService = new ZeppOsCannedMessagesService(this); private final ZeppOsNotificationService notificationService = new ZeppOsNotificationService(this, fileUploadService); private final ZeppOsAlexaService alexaService = new ZeppOsAlexaService(this); + private final ZeppOsAppsService appsService = new ZeppOsAppsService(this); private final Map mServiceMap = new LinkedHashMap() {{ put(fileUploadService.getEndpoint(), fileUploadService); @@ -171,6 +174,7 @@ public abstract class Huami2021Support extends HuamiSupport { put(cannedMessagesService.getEndpoint(), cannedMessagesService); put(notificationService.getEndpoint(), notificationService); put(alexaService.getEndpoint(), alexaService); + put(appsService.getEndpoint(), appsService); }}; public Huami2021Support() { @@ -669,6 +673,24 @@ public abstract class Huami2021Support extends HuamiSupport { super.onInstallApp(uri); } + @Override + public void onAppInfoReq() { + appsService.requestApps(); + // TODO watchfaceService.requestWatchfaces(); + } + + @Override + public void onAppStart(final UUID uuid, final boolean start) { + // TODO check if watchface + //LOG.warn("TODO: onAppStart {} {}", uuid, start); + //watchfaceService.setWatchface("0x" + uuid.toString().split("-")[0]); + } + + @Override + public void onAppDelete(final UUID uuid) { + appsService.deleteApp(Integer.parseInt(uuid.toString().split("-")[0], 16)); + } + @Override protected Huami2021Support setHeartrateSleepSupport(final TransactionBuilder builder) { final boolean enableHrSleepSupport = MiBandCoordinator.getHeartrateSleepSupport(gbDevice.getAddress()); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsAppsService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsAppsService.java new file mode 100644 index 000000000..efd969699 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsAppsService.java @@ -0,0 +1,157 @@ +/* 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.service.devices.huami.zeppos.services; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppInfo; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceApp; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.Huami2021Support; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.AbstractZeppOsService; +import nodomain.freeyourgadget.gadgetbridge.util.GB; + +public class ZeppOsAppsService extends AbstractZeppOsService { + private static final Logger LOG = LoggerFactory.getLogger(ZeppOsAppsService.class); + + private static final short ENDPOINT = 0x00a0; + + private static final byte CMD_BYTE = 0x02; + + private static final byte CMD_INCOMING = 0x00; + private static final byte CMD_OUTGOING = 0x01; + + private static final byte CMD_APP_LIST = 0x01; + private static final byte CMD_APP_DELETE = 0x03; + private static final byte CMD_APP_DELETING = 0x04; + + public ZeppOsAppsService(final Huami2021Support support) { + super(support); + } + + @Override + public short getEndpoint() { + return ENDPOINT; + } + + @Override + public boolean isEncrypted() { + return false; + } + + @Override + public void handlePayload(final byte[] payload) { + if (payload[0] != CMD_BYTE) { + LOG.warn("Unexpected apps byte {}", String.format("0x%02x", payload[0])); + return; + } + + if (payload[1] != CMD_INCOMING) { + LOG.warn("Unexpected apps 2nd byte {}", String.format("0x%02x", payload[1])); + return; + } + + switch (payload[2]) { + case CMD_APP_LIST: + parseAppList(payload); + return; + case CMD_APP_DELETE: + LOG.info("Got app delete"); + return; + case CMD_APP_DELETING: + LOG.info("Got app deleting"); + return; + default: + LOG.warn("Unexpected apps payload {}", GB.hexdump(payload)); + } + } + + private void parseAppList(final byte[] payload) { + final List apps = new ArrayList<>(); + + final byte[] appListStringBytes = ArrayUtils.subarray(payload, 16, payload.length); + final String appListString = new String(appListStringBytes); + final String[] appListSplit = appListString.split(";"); + for (final String appString : appListSplit) { + if (StringUtils.isBlank(appString)) { + continue; + } + + final String[] appSplit = appString.split("-", 2); + if (appSplit.length != 2) { + LOG.warn("Failed to parse {}", appString); + continue; + } + + final int appId = Integer.parseInt(appSplit[0], 16); + final String appVersion = appSplit[1]; + + LOG.debug("Got app: '{}'", appString); + + apps.add(new GBDeviceApp( + UUID.fromString(String.format("%08x-0000-0000-0000-000000000000", appId)), + "", //String.format("0x%08x", appId), + "", + appVersion, + GBDeviceApp.Type.APP_GENERIC // it might actually be a watchface + )); + } + + final GBDeviceEventAppInfo appInfoCmd = new GBDeviceEventAppInfo(); + appInfoCmd.apps = apps.toArray(new GBDeviceApp[0]); + + getSupport().evaluateGBDeviceEvent(appInfoCmd); + } + + public void requestApps() { + LOG.info("Request apps"); + + final ByteBuffer buf = ByteBuffer.allocate(16).order(ByteOrder.LITTLE_ENDIAN); + + buf.put(CMD_BYTE); + buf.put(CMD_OUTGOING); + buf.put(CMD_APP_LIST); + buf.put((byte) 0x00); + + write("request apps", buf.array()); + } + + public void deleteApp(final int appId) { + LOG.info("Delete app {}", String.format("0x%08x", appId)); + + final ByteBuffer buf = ByteBuffer.allocate(20).order(ByteOrder.LITTLE_ENDIAN); + + buf.put(CMD_BYTE); + buf.put(CMD_OUTGOING); + buf.put(CMD_APP_DELETE); + buf.put((byte) 0x00); + buf.putInt(0x00); + buf.putInt(0x00); + buf.putInt(0x00); + buf.putInt(appId); + + write("delete app", buf.array()); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java index 02806f8ac..23304b2ce 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DeviceHelper.java @@ -57,7 +57,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.UnknownDeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.banglejs.BangleJSCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.casio.gb6900.CasioGB6900DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.casio.gbx100.CasioGBX100DeviceCoordinator; -import nodomain.freeyourgadget.gadgetbridge.devices.domyos.DomyosT540Cooridnator; +import nodomain.freeyourgadget.gadgetbridge.devices.domyos.DomyosT540Coordinator; import nodomain.freeyourgadget.gadgetbridge.devices.galaxy_buds.GalaxyBuds2DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.flipper.zero.FlipperZeroCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.galaxy_buds.GalaxyBudsDeviceCoordinator; @@ -348,7 +348,7 @@ public class DeviceHelper { result.add(new WaspOSCoordinator()); result.add(new SMAQ2OSSCoordinator()); result.add(new UM25Coordinator()); - result.add(new DomyosT540Cooridnator()); + result.add(new DomyosT540Coordinator()); result.add(new FitProDeviceCoordinator()); result.add(new Ear1Coordinator()); result.add(new GalaxyBudsDeviceCoordinator());