From 878afd79df468b02b7694af471df974b17f0bf7c Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Wed, 29 Jul 2015 18:49:16 +0200 Subject: [PATCH] Allow the user to set the target number of steps for each day (fitness goal), both in the sharedpreferences and in the MiBand. The value is then used in the graphs. #31 #44 --- .../activities/WeekStepsChartFragment.java | 11 +++++---- .../gadgetbridge/miband/MiBandConst.java | 1 + .../miband/MiBandCoordinator.java | 5 ++++ .../miband/MiBandPreferencesActivity.java | 2 ++ .../gadgetbridge/miband/MiBandService.java | 3 +-- .../gadgetbridge/miband/MiBandSupport.java | 23 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/miband_preferences.xml | 8 +++++++ 8 files changed, 47 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WeekStepsChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WeekStepsChartFragment.java index 1b1246e30..3cdb32c4f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WeekStepsChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WeekStepsChartFragment.java @@ -37,6 +37,7 @@ import nodomain.freeyourgadget.gadgetbridge.ControlCenter; import nodomain.freeyourgadget.gadgetbridge.GBDevice; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.charts.ActivityAnalysis; +import nodomain.freeyourgadget.gadgetbridge.miband.MiBandCoordinator; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; @@ -44,7 +45,7 @@ public class WeekStepsChartFragment extends AbstractChartFragment { protected static final Logger LOG = LoggerFactory.getLogger(WeekStepsChartFragment.class); private Locale mLocale; - private int mTargetSteps; + private int mTargetSteps = 10000; private BarLineChartBase mWeekStepsChart; private PieChart mTodayStepsChart; @@ -138,10 +139,6 @@ public class WeekStepsChartFragment extends AbstractChartFragment { Bundle savedInstanceState) { mLocale = getResources().getConfiguration().locale; - //TODO: through mGBDevice we should be able to retrieve the steps goal set by the user - mTargetSteps = 10000; - - View rootView = inflater.inflate(R.layout.fragment_sleepchart, container, false); Bundle extras = getActivity().getIntent().getExtras(); @@ -149,6 +146,10 @@ public class WeekStepsChartFragment extends AbstractChartFragment { mGBDevice = extras.getParcelable(GBDevice.EXTRA_DEVICE); } + if(mGBDevice != null) { + mTargetSteps = MiBandCoordinator.getFitnessGoal(mGBDevice.getAddress()); + } + IntentFilter filter = new IntentFilter(); filter.addAction(ControlCenter.ACTION_QUIT); filter.addAction(ACTION_REFRESH); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandConst.java index d85cd5ebd..ecb14feaf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandConst.java @@ -16,6 +16,7 @@ public final class MiBandConst { public static final String PREF_MIBAND_WEARSIDE = "mi_wearside"; public static final String PREF_MIBAND_ADDRESS = "development_miaddr"; // FIXME: should be prefixed mi_ public static final String PREF_MIBAND_ALARMS = "mi_alarms"; + public static final String PREF_MIBAND_FITNESS_GOAL = "mi_fitness_goal"; public static final String ORIGIN_SMS = "sms"; public static final String ORIGIN_INCOMING_CALL = "incoming_call"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandCoordinator.java index b6154e881..afdc3e4e9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandCoordinator.java @@ -106,4 +106,9 @@ public class MiBandCoordinator implements DeviceCoordinator { ); return info; } + + public static int getFitnessGoal(String miBandAddress) throws IllegalArgumentException { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(GBApplication.getContext()); + return Integer.parseInt(prefs.getString(MiBandConst.PREF_MIBAND_FITNESS_GOAL, "10000")); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandPreferencesActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandPreferencesActivity.java index a8e03ac4d..9f899a195 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandPreferencesActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandPreferencesActivity.java @@ -15,6 +15,7 @@ import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_K9M import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_PEBBLEMSG; import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.ORIGIN_SMS; import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_MIBAND_ADDRESS; +import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_MIBAND_FITNESS_GOAL; import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_MIBAND_WEARSIDE; import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_USER_ALIAS; import static nodomain.freeyourgadget.gadgetbridge.miband.MiBandConst.PREF_USER_GENDER; @@ -56,6 +57,7 @@ public class MiBandPreferencesActivity extends AbstractSettingsActivity { PREF_USER_WEIGHT_KG, PREF_MIBAND_WEARSIDE, PREF_MIBAND_ADDRESS, + PREF_MIBAND_FITNESS_GOAL, getNotificationPrefKey(VIBRATION_PROFILE, ORIGIN_SMS), getNotificationPrefKey(VIBRATION_COUNT, ORIGIN_SMS), getNotificationPrefKey(VIBRATION_PROFILE, ORIGIN_INCOMING_CALL), diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandService.java index be9f288f9..54025feb2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandService.java @@ -141,6 +141,7 @@ public class MiBandService { public static final byte COMMAND_SYNC = 0xb; + public static final byte COMMAND_SET_FITNESS_GOAL = 0x5; /* @@ -153,8 +154,6 @@ public class MiBandService { public static final int COMMAND_SET_COLOR_THEME = et; - public static final COMMAND_SET_FITNESS_GOAL = 0x5t - public static final COMMAND_SET_REALTIME_STEP = 0x10t public static final COMMAND_SET_REALTIME_STEPS_NOTIFICATION = 0x3t diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java index 612539968..37299c5cf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/miband/MiBandSupport.java @@ -93,6 +93,7 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { builder.add(new SetDeviceStateAction(getDevice(), State.INITIALIZING, getContext())); pair(builder) .sendUserInfo(builder) + .setFitnessGoal(builder) .enableNotifications(builder, true) .setCurrentTime(builder) .requestBatteryInfo(builder) @@ -263,7 +264,29 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { } return this; } + /** + * Part of device initialization process. Do not call manually. + * + * @param transaction + * @return + */ + private MiBandSupport setFitnessGoal(TransactionBuilder transaction) { + LOG.info("Attempting to set Fitness Goal..."); + BluetoothGattCharacteristic characteristic = getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT); + 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) + }); + } else { + LOG.info("Unable to set Fitness Goal"); + } + return this; + } private void performDefaultNotification(String task, short repeat, BtLEAction extraAction) { try { TransactionBuilder builder = performInitialized(task); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7efc98a01..fbd2ef837 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -157,4 +157,5 @@ Alarms sent to device! No data. Synchronize device? About to transfer %1$s of data starting from %2$s + Target steps for each day diff --git a/app/src/main/res/xml/miband_preferences.xml b/app/src/main/res/xml/miband_preferences.xml index 1ac586b22..5fbbb3866 100644 --- a/app/src/main/res/xml/miband_preferences.xml +++ b/app/src/main/res/xml/miband_preferences.xml @@ -40,6 +40,14 @@ android:entryValues="@array/wearside_values" android:key="mi_wearside" android:title="@string/miband_prefs_wearside" /> + + +