From b27c75c09a7eb6cf12fff192e21caf9b1cda7151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Thu, 5 Oct 2023 23:23:33 +0100 Subject: [PATCH] Mi Band 8: World clocks (wip) --- .../devices/xiaomi/XiaomiCoordinator.java | 3 +- .../services/XiaomiScheduleService.java | 45 ++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java index 2b8cef3bf..71be9dd5a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xiaomi/XiaomiCoordinator.java @@ -230,7 +230,8 @@ public abstract class XiaomiCoordinator extends AbstractBLEDeviceCoordinator { @Override public int getWorldClocksLabelLength() { - // TODO how much? + // TODO no labels + // TODO list of supported timezones return 5; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiScheduleService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiScheduleService.java index 81dd91d44..ba1f99a4e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiScheduleService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiScheduleService.java @@ -47,6 +47,8 @@ public class XiaomiScheduleService extends AbstractXiaomiService { private static final int CMD_ALARMS_CREATE = 1; private static final int CMD_ALARMS_EDIT = 3; private static final int CMD_ALARMS_DELETE = 4; + private static final int CMD_WORLD_CLOCKS_GET = 10; + private static final int CMD_WORLD_CLOCKS_SET = 11; private static final int REPETITION_ONCE = 0; private static final int REPETITION_DAILY = 1; @@ -57,6 +59,12 @@ public class XiaomiScheduleService extends AbstractXiaomiService { private static final int ALARM_SMART = 1; private static final int ALARM_NORMAL = 2; + private static final Map WORLD_CLOCK_CODES = new HashMap() {{ + put("Europe/Lisbon", "C173"); + put("Australia/Sydney", "C151"); + // TODO map everything + }}; + // Map of alarm position to Alarm, as returned by the band private final Map watchAlarms = new HashMap<>(); @@ -70,12 +78,16 @@ public class XiaomiScheduleService extends AbstractXiaomiService { case CMD_ALARMS_GET: handleAlarms(cmd.getSchedule().getAlarms()); break; + case CMD_WORLD_CLOCKS_GET: + handleWorldClocks(cmd.getSchedule().getWorldClocks()); + break; } } @Override public void initialize(final TransactionBuilder builder) { requestAlarms(builder); + requestWorldClocks(builder); } public void onSetReminders(final ArrayList reminders) { @@ -83,7 +95,38 @@ public class XiaomiScheduleService extends AbstractXiaomiService { } public void onSetWorldClocks(final ArrayList clocks) { - // TODO + final XiaomiProto.WorldClocks.Builder worldClocksBuilder = XiaomiProto.WorldClocks.newBuilder(); + + for (final WorldClock clock : clocks) { + final String clockCode = WORLD_CLOCK_CODES.get(clock.getTimeZoneId()); + if (clockCode != null) { + worldClocksBuilder.addWorldClock(clockCode); + } else { + LOG.warn("Unknown timezone code for {}", clock.getTimeZoneId()); + } + } + + final XiaomiProto.Schedule schedule = XiaomiProto.Schedule.newBuilder() + .setWorldClocks(worldClocksBuilder.build()) + .build(); + + getSupport().sendCommand( + "send world clocks", + XiaomiProto.Command.newBuilder() + .setType(COMMAND_TYPE) + .setSubtype(CMD_WORLD_CLOCKS_SET) + .setSchedule(schedule) + .build() + ); + } + + public void requestWorldClocks(final TransactionBuilder builder) { + getSupport().sendCommand(builder, COMMAND_TYPE, CMD_WORLD_CLOCKS_GET); + } + + public void handleWorldClocks(final XiaomiProto.WorldClocks worldClocks) { + LOG.info("Got {} world clocks: {}", worldClocks.getWorldClockCount(), worldClocks.getWorldClockList()); + // TODO map the world clock codes } public void onSetAlarms(final ArrayList alarms) {