From 606e20a065bc2035095bacefac7e9ef21315c37f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Tue, 25 Jul 2023 21:43:58 +0100 Subject: [PATCH] Amazfit GTR/S 3: Enable AGPS Updates --- .../devices/huami/Huami2021Coordinator.java | 4 +++ .../amazfitgtr3/AmazfitGTR3Coordinator.java | 10 ++++++ .../amazfitgts3/AmazfitGTS3Coordinator.java | 10 ++++++ .../devices/huami/Huami2021FirmwareInfo.java | 13 +++++++ .../devices/huami/Huami2021Support.java | 36 +++++++++++++++---- 5 files changed, 66 insertions(+), 7 deletions(-) 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 a22ef0fb4..af35598aa 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 @@ -465,6 +465,10 @@ public abstract class Huami2021Coordinator extends HuamiCoordinator { return false; } + public boolean sendAgpsAsFileTransfer() { + return true; + } + public boolean supportsGpxUploads() { return false; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3/AmazfitGTR3Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3/AmazfitGTR3Coordinator.java index 7fdf02e35..7106dc432 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3/AmazfitGTR3Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgtr3/AmazfitGTR3Coordinator.java @@ -61,6 +61,16 @@ public class AmazfitGTR3Coordinator extends Huami2021Coordinator { return new AmazfitGTR3FWInstallHandler(uri, context); } + @Override + public boolean supportsAgpsUpdates() { + return true; + } + + @Override + public boolean sendAgpsAsFileTransfer() { + return false; + } + @Override public boolean supportsBluetoothPhoneCalls(final GBDevice device) { return false; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts3/AmazfitGTS3Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts3/AmazfitGTS3Coordinator.java index d2266ef2e..5ad214ffd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts3/AmazfitGTS3Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitgts3/AmazfitGTS3Coordinator.java @@ -61,6 +61,16 @@ public class AmazfitGTS3Coordinator extends Huami2021Coordinator { return new AmazfitGTS3FWInstallHandler(uri, context); } + @Override + public boolean supportsAgpsUpdates() { + return true; + } + + @Override + public boolean sendAgpsAsFileTransfer() { + return false; + } + @Override public boolean supportsBluetoothPhoneCalls(final GBDevice device) { return false; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021FirmwareInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021FirmwareInfo.java index b097a6dd8..7e465ee64 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021FirmwareInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/Huami2021FirmwareInfo.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.lang.reflect.Constructor; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.HashSet; import java.util.Set; import java.util.UUID; @@ -84,6 +85,7 @@ public abstract class Huami2021FirmwareInfo extends AbstractHuamiFirmwareInfo { return HuamiFirmwareType.INVALID; } + final Set agpsEpoTypes = new HashSet<>(); UIHHContainer.FileEntry uihhFirmwareZipFile = null; boolean hasChangelog = false; for (final UIHHContainer.FileEntry file : uihh.getFiles()) { @@ -94,12 +96,18 @@ public abstract class Huami2021FirmwareInfo extends AbstractHuamiFirmwareInfo { case FIRMWARE_CHANGELOG: hasChangelog = true; continue; + case AGPS_EPO_GR_3: + case AGPS_EPO_GAL_7: + case AGPS_EPO_BDS_3: + agpsEpoTypes.add(file.getType()); + continue; default: LOG.warn("Unexpected file for {}", file.getType()); } } if (uihhFirmwareZipFile != null && hasChangelog) { + // UIHH firmware update final ZipFile zipFile = new ZipFile(uihhFirmwareZipFile.getContent()); final byte[] firmwareBin; try { @@ -114,6 +122,11 @@ public abstract class Huami2021FirmwareInfo extends AbstractHuamiFirmwareInfo { } } + if (agpsEpoTypes.size() == 3) { + // AGPS EPO update + return HuamiFirmwareType.AGPS_UIHH; + } + return HuamiFirmwareType.INVALID; } 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 9a4fba27b..e11b83a29 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 @@ -94,6 +94,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.model.Reminder; import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; +import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEOperation; import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions; import nodomain.freeyourgadget.gadgetbridge.service.btle.GattCharacteristic; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; @@ -581,13 +582,34 @@ public abstract class Huami2021Support extends HuamiSupport implements ZeppOsFil final ZeppOsAgpsInstallHandler agpsHandler = new ZeppOsAgpsInstallHandler(uri, getContext()); if (agpsHandler.isValid()) { try { - new ZeppOsAgpsUpdateOperation( - this, - agpsHandler.getFile(), - agpsService, - fileTransferService, - configService - ).perform(); + if (getCoordinator().sendAgpsAsFileTransfer()) { + LOG.info("Sending AGPS as file transfer"); + new ZeppOsAgpsUpdateOperation( + this, + agpsHandler.getFile(), + agpsService, + fileTransferService, + configService + ).perform(); + } else { + LOG.info("Sending AGPS as firmware update"); + + // Write the agps epo update to a temporary file in cache, so we can reuse the firmware update operation + final File cacheDir = getContext().getCacheDir(); + final File agpsCacheDir = new File(cacheDir, "zepp-os-agps"); + agpsCacheDir.mkdir(); + final File uihhFile = new File(agpsCacheDir, "epo-agps.uihh"); + + try (FileOutputStream outputStream = new FileOutputStream(uihhFile)) { + outputStream.write(agpsHandler.getFile().getUihhBytes()); + } catch (final IOException e) { + LOG.error("Failed to write agps bytes to temporary uihhFile", e); + return; + } + + new UpdateFirmwareOperation2021(Uri.parse(uihhFile.toURI().toString()), this).perform(); + } + } catch (final Exception e) { GB.toast(getContext(), "AGPS file cannot be installed: " + e.getMessage(), Toast.LENGTH_LONG, GB.ERROR, e); }