From 2c0b105aa62d43fc8698b895fd0af7fd76fa67ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sun, 9 Jul 2017 15:17:13 +0100 Subject: [PATCH] Mi Band 2: Display item settings --- .../devices/miband/MiBand2Coordinator.java | 6 ++++ .../devices/miband/MiBand2Service.java | 13 ++++++++ .../devices/miband/MiBandConst.java | 7 ++++ .../miband/MiBandPreferencesActivity.java | 15 +++++++++ .../devices/miband2/MiBand2Support.java | 33 +++++++++++++++++++ app/src/main/res/values-pt/strings.xml | 5 +++ app/src/main/res/values/arrays.xml | 22 +++++++++++++ app/src/main/res/values/strings.xml | 5 +++ app/src/main/res/values/values.xml | 7 ++++ app/src/main/res/xml/miband_preferences.xml | 9 +++++ 10 files changed, 122 insertions(+) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Coordinator.java index 04aa8bde..bd11211f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Coordinator.java @@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.Collections; +import java.util.Set; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; @@ -117,6 +118,11 @@ public class MiBand2Coordinator extends MiBandCoordinator { return prefs.getBoolean(MiBandConst.PREF_MI2_ACTIVATE_DISPLAY_ON_LIFT, true); } + public static Set getDisplayItems() { + Prefs prefs = GBApplication.getPrefs(); + return prefs.getStringSet(MiBandConst.PREF_MI2_DISPLAY_ITEMS, null); + } + @Override public InstallHandler findInstallHandler(Uri uri, Context context) { MiBand2FWInstallHandler handler = new MiBand2FWInstallHandler(uri, context); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java index 62f260ee..4a706568 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBand2Service.java @@ -145,6 +145,19 @@ public class MiBand2Service { public static final byte ICON_HIGH_PRIORITY = 0x7; + public static byte ENDPOINT_DISPLAY_ITEMS = 0x0a; + + public static byte DISPLAY_ITEM_BIT_CLOCK = 0x01; + public static byte DISPLAY_ITEM_BIT_STEPS = 0x02; + public static byte DISPLAY_ITEM_BIT_DISTANCE = 0x04; + public static byte DISPLAY_ITEM_BIT_CALORIES= 0x08; + public static byte DISPLAY_ITEM_BIT_HEART_RATE = 0x10; + public static byte DISPLAY_ITEM_BIT_BATTERY = 0x20; + + // Second byte must be a bitwise OR combination of the above + // The clock can't be disabled + public static int SCREEN_CHANGE_BYTE = 1; + public static final byte[] COMMAND_CHANGE_SCREENS = new byte[]{ENDPOINT_DISPLAY_ITEMS, DISPLAY_ITEM_BIT_CLOCK, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05}; public static byte ENDPOINT_DISPLAY = 0x06; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandConst.java index 998e94b3..7d5508db 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandConst.java @@ -35,6 +35,13 @@ public final class MiBandConst { public static final String PREF_MIBAND_USE_HR_FOR_SLEEP_DETECTION = "mi_hr_sleep_detection"; public static final String PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS = "mi_device_time_offset_hours"; public static final String PREF_MI2_DATEFORMAT = "mi2_dateformat"; + public static final String PREF_MI2_DISPLAY_ITEMS = "mi2_display_items"; + public static final String PREF_MI2_DISPLAY_ITEM_CLOCK = "clock"; + public static final String PREF_MI2_DISPLAY_ITEM_STEPS = "steps"; + public static final String PREF_MI2_DISPLAY_ITEM_DISTANCE = "distance"; + public static final String PREF_MI2_DISPLAY_ITEM_CALORIES = "calories"; + public static final String PREF_MI2_DISPLAY_ITEM_HEART_RATE = "heart_rate"; + public static final String PREF_MI2_DISPLAY_ITEM_BATTERY = "battery"; public static final String PREF_MI2_ACTIVATE_DISPLAY_ON_LIFT = "mi2_activate_display_on_lift_wrist"; public static final String PREF_MI2_ENABLE_TEXT_NOTIFICATIONS = "mi2_enable_text_notifications"; public static final String PREF_MIBAND_SETUP_BT_PAIRING = "mi_setup_bt_pairing"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandPreferencesActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandPreferencesActivity.java index a7916376..8af2155f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandPreferencesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandPreferencesActivity.java @@ -39,6 +39,7 @@ import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.OR import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.ORIGIN_INCOMING_CALL; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_ACTIVATE_DISPLAY_ON_LIFT; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DATEFORMAT; +import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DISPLAY_ITEMS; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_ENABLE_TEXT_NOTIFICATIONS; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_ADDRESS; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS; @@ -80,6 +81,20 @@ public class MiBandPreferencesActivity extends AbstractSettingsActivity { } }); + final Preference displayPages = findPreference(PREF_MI2_DISPLAY_ITEMS); + displayPages.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MI2_DISPLAY_ITEMS); + } + }); + return true; + } + }); + final Preference activateDisplayOnLift = findPreference(PREF_MI2_ACTIVATE_DISPLAY_ON_LIFT); activateDisplayOnLift.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java index 7663b816..ad14e965 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/MiBand2Support.java @@ -38,6 +38,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; +import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -1078,6 +1079,9 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { case MiBandConst.PREF_MI2_ACTIVATE_DISPLAY_ON_LIFT: setActivateDisplayOnLiftWrist(builder); break; + case MiBandConst.PREF_MI2_DISPLAY_ITEMS: + setDisplayItems(builder); + break; case ActivityUser.PREF_USER_STEPS_GOAL: setFitnessGoal(builder); break; @@ -1139,6 +1143,34 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { return this; } + private MiBand2Support setDisplayItems(TransactionBuilder builder) { + Set pages = MiBand2Coordinator.getDisplayItems(); + LOG.info("Setting display items to " + (pages == null ? "none" : pages)); + + byte[] data = MiBand2Service.COMMAND_CHANGE_SCREENS.clone(); + + if(pages != null) { + if(pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_STEPS)) + data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_STEPS; + + if(pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_DISTANCE)) + data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_DISTANCE; + + if(pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_CALORIES)) + data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_CALORIES; + + if(pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_HEART_RATE)) + data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_HEART_RATE; + + if(pages.contains(MiBandConst.PREF_MI2_DISPLAY_ITEM_BATTERY)) + data[MiBand2Service.SCREEN_CHANGE_BYTE] |= MiBand2Service.DISPLAY_ITEM_BIT_BATTERY; + } + + builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), data); + + return this; + } + public void phase2Initialize(TransactionBuilder builder) { LOG.info("phase2Initialize..."); enableFurtherNotifications(builder, true); @@ -1147,6 +1179,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { setTimeFormat(builder); setWearLocation(builder); setFitnessGoal(builder); + setDisplayItems(builder); setActivateDisplayOnLiftWrist(builder); setHeartrateSleepSupport(builder); } diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 53900faa..416c5c2b 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -270,6 +270,9 @@ Passos Calorias Distância + Relógio + Ritmo Cardíaco + Bateria Atividade em tempo real Passos hoje, objetivo: %1$s Não confirmar a transferência de dados de atividade @@ -297,6 +300,8 @@ Mi2: Formato da Data Hora + Items do ecrã + Escolher os items a mostrar no ecrã Ativar ecrã do dispositivo quando o levantar Prestes a transferir dados desde %1$s aguarde para tornar a ligar diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 0bac667b..ed31547d 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -135,6 +135,28 @@ @string/p_dateformat_datetime + + @string/chart_steps + @string/distance + @string/calories + @string/heart_rate + @string/battery + + + @string/p_steps + @string/p_distance + @string/p_calories + @string/p_heart_rate + @string/p_battery + + + @string/p_steps + @string/p_distance + @string/p_calories + @string/p_heart_rate + @string/p_battery + + @string/unit_metric @string/unit_imperial diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 996f7015..f213fba8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -315,6 +315,9 @@ Steps Calories Distance + Clock + Heart Rate + Battery Live Activity Steps today, target: %1$s Do not ack activity data transfer @@ -343,6 +346,8 @@ Mi2: Date Format Time + Display items + Choose the items displayed on the band screen Activate display upon lift About to transfer data since %1$s diff --git a/app/src/main/res/values/values.xml b/app/src/main/res/values/values.xml index 27745d3e..10b562f2 100644 --- a/app/src/main/res/values/values.xml +++ b/app/src/main/res/values/values.xml @@ -12,6 +12,13 @@ dateformat_time dateformat_datetime + clock + steps + distance + calories + heart_rate + battery + metric imperial diff --git a/app/src/main/res/xml/miband_preferences.xml b/app/src/main/res/xml/miband_preferences.xml index e1bbb2f9..373e9891 100644 --- a/app/src/main/res/xml/miband_preferences.xml +++ b/app/src/main/res/xml/miband_preferences.xml @@ -43,6 +43,15 @@ android:maxLength="2" android:title="@string/miband_prefs_device_time_offset_hours" /> + +