From e68d6dd7b776c8fd672019a57fe2056cc6936514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Thu, 5 Oct 2023 23:59:16 +0100 Subject: [PATCH] Mi Band 8: Canned messages (wip) --- .../services/XiaomiNotificationService.java | 61 ++++++++++++++++++- app/src/main/proto/xiaomi.proto | 8 ++- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiNotificationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiNotificationService.java index acbb3a6ff..7fbef5bf6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiNotificationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiNotificationService.java @@ -25,10 +25,12 @@ import java.util.Date; import java.util.Locale; import nodomain.freeyourgadget.gadgetbridge.BuildConfig; +import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventUpdatePreferences; import nodomain.freeyourgadget.gadgetbridge.model.CallSpec; import nodomain.freeyourgadget.gadgetbridge.model.CannedMessagesSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.proto.xiaomi.XiaomiProto; +import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.devices.xiaomi.XiaomiSupport; import nodomain.freeyourgadget.gadgetbridge.util.StringUtils; @@ -40,14 +42,29 @@ public class XiaomiNotificationService extends AbstractXiaomiService { public static final int COMMAND_TYPE = 7; public static final int CMD_NOTIFICATION_SEND = 0; + public static final int CMD_CANNED_MESSAGES_GET = 9; + public static final int CMD_CANNED_MESSAGES_SET = 12; public XiaomiNotificationService(final XiaomiSupport support) { super(support); } + @Override + public void initialize(final TransactionBuilder builder) { + requestCannedMessages(builder); + } + @Override public void handleCommand(final XiaomiProto.Command cmd) { + switch (cmd.getSubtype()) { + case CMD_CANNED_MESSAGES_GET: + handleCannedMessages(cmd.getNotification().getCannedMessages()); + break; + } + // TODO + + LOG.warn("Unhandled notification command {}", cmd.getSubtype()); } public void onNotification(final NotificationSpec notificationSpec) { @@ -116,6 +133,48 @@ public class XiaomiNotificationService extends AbstractXiaomiService { } public void onSetCannedMessages(final CannedMessagesSpec cannedMessagesSpec) { - // TODO + if (cannedMessagesSpec.type != CannedMessagesSpec.TYPE_GENERIC) { + LOG.warn("Got unsupported canned messages type: {}", cannedMessagesSpec.type); + return; + } + + final XiaomiProto.CannedMessages.Builder cannedMessagesBuilder = XiaomiProto.CannedMessages.newBuilder() + // TODO get those from wathc + // TODO enforce these + .setMinReplies(1) + .setMaxReplies(10); + for (final String cannedMessage : cannedMessagesSpec.cannedMessages) { + cannedMessagesBuilder.addReply(cannedMessage); + } + + final XiaomiProto.Notification.Builder notificationBuilder = XiaomiProto.Notification.newBuilder() + .setCannedMessages(cannedMessagesBuilder); + + getSupport().sendCommand( + "set canned messages", + XiaomiProto.Command.newBuilder() + .setType(COMMAND_TYPE) + .setSubtype(CMD_CANNED_MESSAGES_SET) + .setNotification(notificationBuilder) + .build() + ); + } + + public void requestCannedMessages(final TransactionBuilder builder) { + getSupport().sendCommand( + builder, + XiaomiProto.Command.newBuilder() + .setType(COMMAND_TYPE) + .setSubtype(CMD_CANNED_MESSAGES_GET) + .setNotification(XiaomiProto.Notification.newBuilder().setUnknown8(1)) + .build() + ); + } + + public void handleCannedMessages(final XiaomiProto.CannedMessages cannedMessages) { + // TODO save them + //final GBDeviceEventUpdatePreferences gbDeviceEventUpdatePreferences = new GBDeviceEventUpdatePreferences(); + //gbDeviceEventUpdatePreferences.withPreference("canned_reply_" + i, message); + //getSupport().evaluateGBDeviceEvent(gbDeviceEventUpdatePreferences); } } diff --git a/app/src/main/proto/xiaomi.proto b/app/src/main/proto/xiaomi.proto index c50c28fe5..1141f8c47 100644 --- a/app/src/main/proto/xiaomi.proto +++ b/app/src/main/proto/xiaomi.proto @@ -442,8 +442,10 @@ message MediaKey { message Notification { optional Notification2 notification2 = 3; optional Notification4 notification4 = 4; - // 7, 12 - optional CannedReplies cannedReplies = 9; + + optional uint32 unknown8 = 8; // 1 on canned replies request? + // 7, 9 get | 7, 12 set + optional CannedMessages cannedMessages = 9; } message Notification2 { @@ -468,7 +470,7 @@ message Notification4 { optional Notification5 notification5 = 1; } -message CannedReplies { +message CannedMessages { optional uint32 minReplies = 1; repeated string reply = 2; optional uint32 maxReplies = 3;