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 f3fcea18..b18d9a2b 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); + } + public static boolean getRotateWristToSwitchInfo() { Prefs prefs = GBApplication.getPrefs(); return prefs.getBoolean(MiBandConst.PREF_MI2_ROTATE_WRIST_TO_SWITCH_INFO, false); 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 bf83b220..79f5b326 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 5b4a7d98..ae74cf57 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_ROTATE_WRIST_TO_SWITCH_INFO = "mi2_rotate_wrist_to_switch_info"; public static final String PREF_MI2_ENABLE_TEXT_NOTIFICATIONS = "mi2_enable_text_notifications"; 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 18aeb91a..d645d14f 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_MI2_ROTATE_WRIST_TO_SWITCH_INFO; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_ADDRESS; @@ -81,6 +82,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 631c541c..5ecf2735 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 MiBandConst.PREF_MI2_ROTATE_WRIST_TO_SWITCH_INFO: setRotateWristToSwitchInfo(builder); break; @@ -1142,6 +1146,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; + } + private MiBand2Support setRotateWristToSwitchInfo(TransactionBuilder builder) { boolean enable = MiBand2Coordinator.getRotateWristToSwitchInfo(); LOG.info("Setting rotate wrist to cycle info to " + enable); @@ -1161,6 +1193,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { setTimeFormat(builder); setWearLocation(builder); setFitnessGoal(builder); + setDisplayItems(builder); setRotateWristToSwitchInfo(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 7e0641ff..9574189f 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 Rodar o pulso para mudar de ecrã Prestes a transferir dados desde %1$s 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 1acc8998..e598326e 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 Rotate wrist to switch info 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 562d269c..0f5fbdbe 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" /> + +