From f98b5eb11fa99dca9a72590491f90e850015b68b Mon Sep 17 00:00:00 2001 From: Me7c7 Date: Wed, 1 Oct 2025 17:14:44 +0300 Subject: [PATCH] Huawei: Handle device status response for upload error state. --- .../devices/huawei/HuaweiPacket.java | 9 ++++++--- .../devices/huawei/packets/FileUpload.java | 20 +++++++++++++++++++ .../devices/huawei/AsynchronousResponse.java | 17 ++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiPacket.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiPacket.java index bf267c2331..a6b06dbc5e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiPacket.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiPacket.java @@ -30,7 +30,6 @@ import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.Alarms; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.AccountRelated; import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.App; @@ -147,7 +146,7 @@ public class HuaweiPacket { public void setAuthMode(byte authMode) { this.authMode = authMode; } public byte[] getIv() { - byte[] iv = null; + byte[] iv; if (this.deviceSupportType == 0x04) { iv = HuaweiCrypto.generateNonce(); } else { @@ -663,6 +662,10 @@ public class HuaweiPacket { return new FileUpload.FileUploadConsultAck.Response(paramsProvider).fromPacket(this); case FileUpload.FileNextChunkParams.id: return new FileUpload.FileNextChunkParams(paramsProvider).fromPacket(this); + case FileUpload.FileUploadResult.id: + return new FileUpload.FileUploadResult.Response(paramsProvider).fromPacket(this); + case FileUpload.FileUploadDeviceResponse.id: + return new FileUpload.FileUploadDeviceResponse.Response(paramsProvider).fromPacket(this); default: this.isEncrypted = this.attemptDecrypt(); // Helps with debugging return this; @@ -889,7 +892,7 @@ public class HuaweiPacket { int length = packet.position() - start; if (length != packetSize - footerLength) { // TODO: exception? - LOG.error(String.format(GBApplication.getLanguage(), "Packet lengths don't match! %d != %d", length, packetSize + headerLength)); + LOG.error("Packet lengths don't match! {} != {}", length, packetSize + headerLength); } byte[] complete = new byte[length]; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/FileUpload.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/FileUpload.java index b8eae703fc..724fbacc66 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/FileUpload.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/packets/FileUpload.java @@ -236,4 +236,24 @@ public class FileUpload { } } } + + public static class FileUploadDeviceResponse { + public static final byte id = 0x08; + + public static class Response extends HuaweiPacket { + public byte fileId = 0; + public int code = 0; + + public Response(ParamsProvider paramsProvider) { + super(paramsProvider); + } + + @Override + public void parseTlv() throws HuaweiPacket.ParseException { + this.fileId = this.tlv.getByte(0x01, (byte) 0); + this.code = this.tlv.getAsInteger(0x7f, 0); + } + } + } + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/AsynchronousResponse.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/AsynchronousResponse.java index 7f2312f750..109d51fde1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/AsynchronousResponse.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/AsynchronousResponse.java @@ -528,6 +528,23 @@ public class AsynchronousResponse { LOG.error("Could not send file upload result request", e); } } + } else if(response.commandId == FileUpload.FileUploadDeviceResponse.id) { + // TODO: I don't currently know how to recover from this state. The proper solution is restart the watch or wait while timeout is expired in the watch + // Usually happened on the programmer error on the previous state. + // The value of timeout is unknown + LOG.error("File upload error. Possible error in the previous state. Try to restart your watch."); + if (support.huaweiUploadManager.getFileUploadInfo() == null) { + LOG.error("No current upload"); + } else { + FileUpload.FileUploadDeviceResponse.Response resp = (FileUpload.FileUploadDeviceResponse.Response) response; + if(support.huaweiUploadManager.getFileUploadInfo().getFileId() == resp.fileId) { + if (support.huaweiUploadManager.getFileUploadInfo().getFileUploadCallback() != null) { + support.huaweiUploadManager.getFileUploadInfo().getFileUploadCallback().onError(resp.code); + } + //Cleanup + support.huaweiUploadManager.setFileUploadInfo(null); + } + } } } }