From fcf9be877a1da104e31df75f6eb8055cb0025308 Mon Sep 17 00:00:00 2001 From: Michal Novotny Date: Tue, 5 Sep 2017 22:37:41 +0200 Subject: [PATCH] Support for button actions on Mi Band 2 device (#793) Implement button actions for MiBand 2 --- .../devices/miband/MiBandConst.java | 5 ++ .../devices/miband2/MiBand2Support.java | 46 +++++++++++++++++++ app/src/main/res/values-cs/strings.xml | 15 +++++- app/src/main/res/values/strings.xml | 13 ++++++ app/src/main/res/xml/miband_preferences.xml | 44 ++++++++++++++++++ 5 files changed, 122 insertions(+), 1 deletion(-) 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 7028be7c..bc0078d8 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 @@ -32,6 +32,11 @@ public final class MiBandConst { public static final String PREF_MIBAND_ALARMS = "mi_alarms"; public static final String PREF_MIBAND_DONT_ACK_TRANSFER = "mi_dont_ack_transfer"; public static final String PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR = "mi_reserve_alarm_calendar"; + public static final String PREF_MIBAND_BUTTON_ACTION_ENABLE = "mi2_enable_button_action"; + public static final String PREF_MIBAND_BUTTON_ACTION_VIBRATE = "mi2_button_action_vibrate"; + public static final String PREF_MIBAND_BUTTON_PRESS_COUNT = "mi_button_press_count"; + public static final String PREF_MIBAND_BUTTON_PRESS_MAX_DELAY = "mi_button_press_count_max_delay"; + public static final String PREF_MIBAND_BUTTON_PRESS_BROADCAST = "mi_button_press_broadcast"; 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"; 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 80143973..e8f3bd0f 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 @@ -24,7 +24,9 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.SharedPreferences; import android.net.Uri; +import android.preference.PreferenceManager; import android.support.v4.content.LocalBroadcastManager; import android.text.format.DateFormat; import android.widget.Toast; @@ -123,6 +125,10 @@ import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.ge public class MiBand2Support extends AbstractBTLEDeviceSupport { + // We introduce key press counter for notification purposes + private static int currentButtonPressCount = 0; + private static long currentButtonPressTime = 0; + private static final Logger LOG = LoggerFactory.getLogger(MiBand2Support.class); private final DeviceInfoProfile deviceInfoProfile; private final HeartRateProfile heartRateProfile; @@ -809,8 +815,48 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { } public void handleButtonPressed(byte[] value) { + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this.getContext()); + LOG.info("Button pressed"); logMessageContent(value); + + Prefs prefs = GBApplication.getPrefs(); + + // If disabled we return from function immediately + if (!prefs.getBoolean(MiBandConst.PREF_MIBAND_BUTTON_ACTION_ENABLE, false)) { + return; + } + + int buttonPressMaxDelay = prefs.getInt(MiBandConst.PREF_MIBAND_BUTTON_PRESS_MAX_DELAY, 2000); + int requiredButtonPressCount = prefs.getInt(MiBandConst.PREF_MIBAND_BUTTON_PRESS_COUNT, 0); + + String requiredButtonPressMessage = prefs.getString(MiBandConst.PREF_MIBAND_BUTTON_PRESS_BROADCAST, + this.getContext().getString(R.string.mi2_prefs_button_press_broadcast_default_value)); + + if (requiredButtonPressCount > 0) { + long timeSinceLastPress = System.currentTimeMillis() - currentButtonPressTime; + + if ((currentButtonPressTime == 0) || (timeSinceLastPress < buttonPressMaxDelay)) { + currentButtonPressCount++; + } + else { + currentButtonPressCount = 0; + } + + currentButtonPressTime = System.currentTimeMillis(); + if (currentButtonPressCount >= requiredButtonPressCount) { + Intent in = new Intent(); + in.setAction(requiredButtonPressMessage); + this.getContext().getApplicationContext().sendBroadcast(in); + + currentButtonPressCount = 0; + currentButtonPressTime = System.currentTimeMillis(); + + if (prefs.getBoolean(MiBandConst.PREF_MIBAND_BUTTON_ACTION_VIBRATE, false)) { + performPreferredNotification(null, null, null, MiBand2Service.ALERT_LEVEL_VIBRATE_ONLY, null); + } + } + } } private void handleUnknownCharacteristic(byte[] value) { diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 8aa5216e..4d92f1c7 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -407,6 +407,19 @@ Vyberte Párování pro spárování s vaším zaříením. Pokud to selže, tak to zkuste bez párování. Párování Nepárovat + Akce tlačítka + Definujte akce při stisku tlačítka na Mi Band 2 + Počet stisků tlačítka + Definujte počet stisknutí tlačítka k vyslání broadcast zprávy + Zpráva k vyslání (broadcast) + Zpráva k vyslání do systému pokud počtu stisknutí tlačítka (viz výše) + nodomain.freeyourgadget.gadgetbridge.mibandButtonPressed + Povolit akci tlačítka + Povolit akci tlačítka na definovaný počet stisknutí + Povolit vibrace náramku + Povolit vibrace náramku při vyslání broadcast zprávy + Maximální prodleva mezi stisky + Maximální prodleva mezi stisky tlačítka v milisekundách Chystáte se nainstalovat firmware %s namísto toho, který je aktuálně na vašem Amazfit Bipu. \n \nUjistěte se, že jste nainstalovali firmware .gps, pak soubor .res a nakonec soubor .fw. Hodiny se po instalaci souboru .fw restartují. @@ -415,4 +428,4 @@ \n \nEXPERIMENTÁLNÍ PROCES, DĚLÁTE NA VAŠE VLASTNÍ RIZIKO "Firmware Amazfit Bipu %1$s" - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 256a62fd..8038d217 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -351,6 +351,19 @@ Mi2: Date format Time + Button actions + Specify actions on Mi Band 2 button press + Button press count + Number of button presses to trigger message broadcast + Broadcast message to send + Broadcast message on defined number of button presses reached + nodomain.freeyourgadget.gadgetbridge.mibandButtonPressed + Enable button action + Enable action on specified number of button presses + Enable band vibration + Enable band vibration on button action triggered + Maximum delay between presses + Maximum delay between button presses in milliseconds Goal notification The band will vibrate when the daily steps goal is reached Display items diff --git a/app/src/main/res/xml/miband_preferences.xml b/app/src/main/res/xml/miband_preferences.xml index 8419ab9f..0dcc5492 100644 --- a/app/src/main/res/xml/miband_preferences.xml +++ b/app/src/main/res/xml/miband_preferences.xml @@ -30,6 +30,50 @@ android:summary="@string/mi2_prefs_goal_notification_summary" android:title="@string/mi2_prefs_goal_notification" /> + + + + + + + + + + + + + + + +