From 3fdfb7d17221254a803741b0d48bc8b91e58291f Mon Sep 17 00:00:00 2001 From: cpfeiffer Date: Thu, 24 Nov 2016 21:58:32 +0100 Subject: [PATCH] Mi2: Support for setting the fitness goal (steps) --- .../devices/miband/MiBand2Service.java | 4 ++++ .../miband/MiBandPreferencesActivity.java | 14 ++++++++++++ .../devices/miband/MiBand2Support.java | 22 ++++++++++++------- 3 files changed, 32 insertions(+), 8 deletions(-) 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 51eead049..931b91c76 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 @@ -282,6 +282,10 @@ public class MiBand2Service { // maybe not really activity data, but steps? public static final byte COMMAND_FETCH_ACTIVITY_DATA = 0x02; + public static final byte[] COMMAND_SET_FITNESS_GOAL_START = new byte[] { 0x10, 0x0, 0x0 }; + public static final byte[] COMMAND_SET_FITNESS_GOAL_END = new byte[] { 0, 0 }; + + public static byte COMMAND_DATEFORMAT = 0x06; public static final byte[] DATEFORMAT_DATE_TIME = new byte[] { COMMAND_DATEFORMAT, 0x0a, 0x0, 0x03 }; 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 af1d07a88..00b77c060 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 @@ -74,6 +74,20 @@ public class MiBandPreferencesActivity extends AbstractSettingsActivity { return true; } }); + + final Preference fitnessGoal = findPreference(PREF_MIBAND_FITNESS_GOAL); + fitnessGoal.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MIBAND_FITNESS_GOAL); + } + }); + return true; + } + }); } /** diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java index c4714b89f..963a34b53 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBand2Support.java @@ -10,10 +10,12 @@ import android.net.Uri; import android.support.v4.content.LocalBroadcastManager; import android.widget.Toast; +import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -388,15 +390,15 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { private MiBand2Support setFitnessGoal(TransactionBuilder transaction) { LOG.info("Attempting to set Fitness Goal..."); - BluetoothGattCharacteristic characteristic = getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT); + BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC8); if (characteristic != null) { int fitnessGoal = MiBandCoordinator.getFitnessGoal(getDevice().getAddress()); - transaction.write(characteristic, new byte[]{ - MiBandService.COMMAND_SET_FITNESS_GOAL, - 0, - (byte) (fitnessGoal & 0xff), - (byte) ((fitnessGoal >>> 8) & 0xff) - }); + byte[] bytes = ArrayUtils.addAll( + MiBand2Service.COMMAND_SET_FITNESS_GOAL_START, + BLETypeConversions.fromUint16(fitnessGoal)); + bytes = ArrayUtils.addAll(bytes, + MiBand2Service.COMMAND_SET_FITNESS_GOAL_END); + transaction.write(characteristic, bytes); } else { LOG.info("Unable to set Fitness Goal"); } @@ -419,7 +421,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { case 0: // left hand builder.write(characteristic, MiBand2Service.WEAR_LOCATION_LEFT_WRIST); break; - case 1: // write hand + case 1: // right hand builder.write(characteristic, MiBand2Service.WEAR_LOCATION_RIGHT_WRIST); break; } @@ -1181,6 +1183,9 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { case MiBandConst.PREF_MI2_ACTIVATE_DISPLAY_ON_LIFT: setActivateDisplayOnLiftWrist(builder); break; + case MiBandConst.PREF_MIBAND_FITNESS_GOAL: + setFitnessGoal(builder); + break; } builder.queue(getQueue()); } catch (IOException e) { @@ -1222,6 +1227,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { enableFurtherNotifications(builder, true); setDateDisplay(builder); setWearLocation(builder); + setFitnessGoal(builder); setActivateDisplayOnLiftWrist(builder); setHeartrateSleepSupport(builder);