From 9eb3ed9026de2d3546493ebf420571571c650aaf Mon Sep 17 00:00:00 2001 From: "Martin.JM" Date: Sat, 24 Jan 2026 17:13:08 +0100 Subject: [PATCH] [Huawei] Add RequestBuilder --- .../devices/huawei/requests/Request.java | 8 ++ .../huawei/requests/RequestBuilder.java | 117 ++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/RequestBuilder.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/Request.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/Request.java index 7f437670f5..88158ecad6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/Request.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/Request.java @@ -95,6 +95,7 @@ public class Request { protected OperationStatus operationStatus = OperationStatus.INITIAL; protected byte serviceId; protected byte commandId; + protected HuaweiPacket sendingPacket = null; protected HuaweiPacket receivedPacket = null; protected HuaweiSupportProvider supportProvider; protected HuaweiPacket.ParamsProvider paramsProvider; @@ -221,6 +222,13 @@ public class Request { } protected List createRequest() throws RequestCreationException { + if (sendingPacket != null) { + try { + return sendingPacket.serialize(); + } catch (HuaweiPacket.CryptoException e) { + throw new RequestCreationException(e); + } + } return null; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/RequestBuilder.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/RequestBuilder.java new file mode 100644 index 0000000000..35ba6f04ff --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/RequestBuilder.java @@ -0,0 +1,117 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket; +import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider; + +public class RequestBuilder { + private static final Logger LOG = LoggerFactory.getLogger(RequestBuilder.class); + + public interface OnCallback { + void callback(U packet); + } + + public interface OnTimeout { + void timeout(U packet); + } + + public interface OnException { + void except(Request.ResponseParseException e); + } + + public static class GenericTypeException extends Request.ResponseParseException { + public GenericTypeException(byte serviceId, byte commandId, Exception e) { + super(String.format("Generic type exception for response for serviceId 0x%x, commandId 0x%x", serviceId, commandId), e); + } + } + + private final HuaweiSupportProvider supportProvider; + private final byte serviceId; + private final byte commandId; + private final HuaweiPacket requestPacket; + + private boolean addToResponse = true; + + private OnCallback onCallback = null; + private OnTimeout onTimeout = null; + private OnException onException = null; + + public RequestBuilder( + HuaweiSupportProvider supportProvider, + byte serviceId, + byte commandId, + HuaweiPacket requestPacket + ) { + this.supportProvider = supportProvider; + this.serviceId = serviceId; + this.commandId = commandId; + this.requestPacket = requestPacket; + } + + public RequestBuilder noResponse() { + this.addToResponse = false; + return this; + } + + public RequestBuilder onCallback(OnCallback onCallback) { + this.onCallback = onCallback; + return this; + } + + public RequestBuilder onTimeout(OnTimeout onTimeout) { + this.onTimeout = onTimeout; + return this; + } + + public RequestBuilder onException(OnException onException) { + this.onException = onException; + return this; + } + + public Request build() { + Request r = new Request(this.supportProvider); + r.serviceId = serviceId; + r.commandId = commandId; + r.sendingPacket = requestPacket; + r.addToResponse = this.addToResponse; + r.setFinalizeReq(new Request.RequestCallback() { + @Override + public void call(Request request) { + if (onCallback == null) + return; + try { + // Try-catch takes care of the class cast exception, so ignore it + //noinspection unchecked + onCallback.callback((T) request.receivedPacket); + } catch (ClassCastException e) { + handleException(new GenericTypeException(serviceId, commandId, e)); + } + } + + @Override + public void timeout(Request request) { + if (onTimeout == null) + return; + try { + // Try-catch takes care of the class cast exception, so ignore it + //noinspection unchecked + onTimeout.timeout((T) request.receivedPacket); + } catch (ClassCastException e) { + handleException(new GenericTypeException(serviceId, commandId, e)); + } + } + + @Override + public void handleException(Request.ResponseParseException e) { + if (onException == null) { + LOG.error("Unhandled exception in a request made by the request builder", e); + return; + } + onException.except(e); + } + }); + return r; + } +}