From 9b7d5eee42b6e483f61e9718802f7afe3cf68330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Thu, 15 Jun 2023 21:59:16 +0100 Subject: [PATCH] Zepp OS: Cache apps for app management --- .../AmazfitBand7FWInstallHandler.java | 4 +- .../AmazfitGTR3FWInstallHandler.java | 4 +- .../AmazfitGTR3ProFWInstallHandler.java | 4 +- .../AmazfitGTR4FWInstallHandler.java | 4 +- .../AmazfitGTS3FWInstallHandler.java | 4 +- .../AmazfitGTS4FWInstallHandler.java | 4 +- .../AmazfitGTS4MiniFWInstallHandler.java | 4 +- .../AmazfitTRex2FWInstallHandler.java | 4 +- .../miband7/MiBand7FWInstallHandler.java | 4 +- .../AbstractMiBandFWInstallHandler.java | 6 ++ .../AbstractHuami2021FWInstallHandler.java | 78 ++++++++++++++++++- 11 files changed, 101 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitband7/AmazfitBand7FWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitband7/AmazfitBand7FWInstallHandler.java index 659164e72..ada6d57f7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitband7/AmazfitBand7FWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitband7/AmazfitBand7FWInstallHandler.java @@ -22,7 +22,7 @@ import android.net.Uri; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.AbstractHuami2021FWInstallHandler; @@ -38,7 +38,7 @@ class AmazfitBand7FWInstallHandler extends AbstractHuami2021FWInstallHandler { } @Override - protected AbstractMiBandFWHelper createHelper(final Uri uri, final Context context) throws IOException { + protected HuamiFWHelper createHelper(final Uri uri, final Context context) throws IOException { return new AmazfitBand7FWHelper(uri, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3/AmazfitGTR3FWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3/AmazfitGTR3FWInstallHandler.java index 7220bddcd..81affbbb5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3/AmazfitGTR3FWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3/AmazfitGTR3FWInstallHandler.java @@ -22,7 +22,7 @@ import android.net.Uri; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.AbstractHuami2021FWInstallHandler; @@ -38,7 +38,7 @@ class AmazfitGTR3FWInstallHandler extends AbstractHuami2021FWInstallHandler { } @Override - protected AbstractMiBandFWHelper createHelper(Uri uri, Context context) throws IOException { + protected HuamiFWHelper createHelper(Uri uri, Context context) throws IOException { return new AmazfitGTR3FWHelper(uri, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3pro/AmazfitGTR3ProFWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3pro/AmazfitGTR3ProFWInstallHandler.java index 00a5b1b77..fbf8d8d4e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3pro/AmazfitGTR3ProFWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3pro/AmazfitGTR3ProFWInstallHandler.java @@ -22,7 +22,7 @@ import android.net.Uri; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.AbstractHuami2021FWInstallHandler; @@ -38,7 +38,7 @@ class AmazfitGTR3ProFWInstallHandler extends AbstractHuami2021FWInstallHandler { } @Override - protected AbstractMiBandFWHelper createHelper(Uri uri, Context context) throws IOException { + protected HuamiFWHelper createHelper(Uri uri, Context context) throws IOException { return new AmazfitGTR3ProFWHelper(uri, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr4/AmazfitGTR4FWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr4/AmazfitGTR4FWInstallHandler.java index 64fcd3fbe..8dac806d9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr4/AmazfitGTR4FWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr4/AmazfitGTR4FWInstallHandler.java @@ -22,7 +22,7 @@ import android.net.Uri; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.AbstractHuami2021FWInstallHandler; @@ -38,7 +38,7 @@ class AmazfitGTR4FWInstallHandler extends AbstractHuami2021FWInstallHandler { } @Override - protected AbstractMiBandFWHelper createHelper(final Uri uri, final Context context) throws IOException { + protected HuamiFWHelper createHelper(final Uri uri, final Context context) throws IOException { return new AmazfitGTR4FWHelper(uri, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts3/AmazfitGTS3FWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts3/AmazfitGTS3FWInstallHandler.java index f9203b700..9ecb2f428 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts3/AmazfitGTS3FWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts3/AmazfitGTS3FWInstallHandler.java @@ -22,7 +22,7 @@ import android.net.Uri; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.AbstractHuami2021FWInstallHandler; @@ -38,7 +38,7 @@ class AmazfitGTS3FWInstallHandler extends AbstractHuami2021FWInstallHandler { } @Override - protected AbstractMiBandFWHelper createHelper(Uri uri, Context context) throws IOException { + protected HuamiFWHelper createHelper(Uri uri, Context context) throws IOException { return new AmazfitGTS3FWHelper(uri, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts4/AmazfitGTS4FWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts4/AmazfitGTS4FWInstallHandler.java index ccc5d3f58..c022eb621 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts4/AmazfitGTS4FWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts4/AmazfitGTS4FWInstallHandler.java @@ -22,7 +22,7 @@ import android.net.Uri; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.AbstractHuami2021FWInstallHandler; @@ -38,7 +38,7 @@ class AmazfitGTS4FWInstallHandler extends AbstractHuami2021FWInstallHandler { } @Override - protected AbstractMiBandFWHelper createHelper(final Uri uri, final Context context) throws IOException { + protected HuamiFWHelper createHelper(final Uri uri, final Context context) throws IOException { return new AmazfitGTS4FWHelper(uri, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts4mini/AmazfitGTS4MiniFWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts4mini/AmazfitGTS4MiniFWInstallHandler.java index 8adcfca39..a2bddbc86 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts4mini/AmazfitGTS4MiniFWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts4mini/AmazfitGTS4MiniFWInstallHandler.java @@ -22,7 +22,7 @@ import android.net.Uri; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.AbstractHuami2021FWInstallHandler; @@ -38,7 +38,7 @@ class AmazfitGTS4MiniFWInstallHandler extends AbstractHuami2021FWInstallHandler } @Override - protected AbstractMiBandFWHelper createHelper(final Uri uri, final Context context) throws IOException { + protected HuamiFWHelper createHelper(final Uri uri, final Context context) throws IOException { return new AmazfitGTS4MiniFWHelper(uri, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfittrex2/AmazfitTRex2FWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfittrex2/AmazfitTRex2FWInstallHandler.java index 9c3a72cb3..a293992e7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfittrex2/AmazfitTRex2FWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfittrex2/AmazfitTRex2FWInstallHandler.java @@ -22,7 +22,7 @@ import android.net.Uri; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.AbstractHuami2021FWInstallHandler; @@ -38,7 +38,7 @@ class AmazfitTRex2FWInstallHandler extends AbstractHuami2021FWInstallHandler { } @Override - protected AbstractMiBandFWHelper createHelper(final Uri uri, final Context context) throws IOException { + protected HuamiFWHelper createHelper(final Uri uri, final Context context) throws IOException { return new AmazfitTRex2FWHelper(uri, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband7/MiBand7FWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband7/MiBand7FWInstallHandler.java index 7c0c35cae..db3887bb3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband7/MiBand7FWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband7/MiBand7FWInstallHandler.java @@ -22,7 +22,7 @@ import android.net.Uri; import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.AbstractHuami2021FWInstallHandler; @@ -38,7 +38,7 @@ class MiBand7FWInstallHandler extends AbstractHuami2021FWInstallHandler { } @Override - protected AbstractMiBandFWHelper createHelper(Uri uri, Context context) throws IOException { + protected HuamiFWHelper createHelper(Uri uri, Context context) throws IOException { return new MiBand7FWHelper(uri, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/AbstractMiBandFWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/AbstractMiBandFWInstallHandler.java index ebe949d34..caa71c104 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/AbstractMiBandFWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/AbstractMiBandFWInstallHandler.java @@ -36,11 +36,13 @@ import static nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFi public abstract class AbstractMiBandFWInstallHandler implements InstallHandler { private static final Logger LOG = LoggerFactory.getLogger(AbstractMiBandFWInstallHandler.class); + protected final Uri mUri; protected final Context mContext; protected AbstractMiBandFWHelper helper; private String errorMessage; public AbstractMiBandFWInstallHandler(Uri uri, Context context) { + mUri = uri; mContext = context; try { @@ -51,6 +53,10 @@ public abstract class AbstractMiBandFWInstallHandler implements InstallHandler { } } + public Uri getUri() { + return mUri; + } + public Context getContext() { return mContext; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/AbstractHuami2021FWInstallHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/AbstractHuami2021FWInstallHandler.java index f053b643a..45e69a3b6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/AbstractHuami2021FWInstallHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/AbstractHuami2021FWInstallHandler.java @@ -17,21 +17,97 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.huami; import android.content.Context; +import android.graphics.Bitmap; import android.net.Uri; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; + +import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; +import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiFWHelper; +import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWHelper; import nodomain.freeyourgadget.gadgetbridge.devices.miband.AbstractMiBandFWInstallHandler; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceApp; +import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; +import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; public abstract class AbstractHuami2021FWInstallHandler extends AbstractMiBandFWInstallHandler { + private static final Logger LOG = LoggerFactory.getLogger(AbstractHuami2021FWInstallHandler.class); + public AbstractHuami2021FWInstallHandler(final Uri uri, final Context context) { super(uri, context); } @Override - public void onStartInstall(GBDevice device) { + public void onStartInstall(final GBDevice device) { + final AbstractHuamiFirmwareInfo firmwareInfo = getHelper().getFirmwareInfo(); + if (firmwareInfo instanceof Huami2021FirmwareInfo) { + saveToCache((Huami2021FirmwareInfo) firmwareInfo, device); + } else { + LOG.warn("firmwareInfo is {} - this should never happen", firmwareInfo.getClass()); + } + // Unset the firmware bytes // Huami2021 firmwares are large (> 130MB). With the current architecture, the update operation // will re-read them to memory, and we run out-of-memory. helper.unsetFwBytes(); } + + protected abstract HuamiFWHelper createHelper(Uri uri, Context context) throws IOException; + + public HuamiFWHelper getHelper() { + return (HuamiFWHelper) helper; + } + + private void saveToCache(final Huami2021FirmwareInfo firmwareInfo, final GBDevice device) { + final DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device); + + final File appCacheDir; + try { + appCacheDir = coordinator.getAppCacheDir(); + } catch (final IOException e) { + LOG.error("Failed to get app cache dir", e); + return ; + } + + final GBDeviceApp app = firmwareInfo.getAppInfo(); + + // write app zip + final File appOutputFile = new File(appCacheDir, app.getUUID().toString() + coordinator.getAppFileExtension()); + try { + appCacheDir.mkdirs(); + FileUtils.copyURItoFile(getContext(), getUri(), appOutputFile); + } catch (final IOException e) { + LOG.error("Failed to save app to cache", e); + return; + } + + // write app metadata + final File metadataOutputFile = new File(appCacheDir, app.getUUID().toString() + ".json"); + try (Writer writer = new BufferedWriter(new FileWriter(metadataOutputFile))) { + final JSONObject appJSON = app.getJSON(); + writer.write(appJSON.toString()); + } catch (final IOException e) { + LOG.error("Failed to write app metadata", e); + return; + } + + if (app.getPreviewImage() != null) { + final File previewOutputFile = new File(appCacheDir, app.getUUID().toString() + "_preview.png"); + try (FileOutputStream fos = new FileOutputStream(previewOutputFile)) { + app.getPreviewImage().compress(Bitmap.CompressFormat.PNG, 9, fos); + } catch (final IOException e) { + LOG.error("Failed to write app preview", e); + } + } + } }