diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java index a3af9b205..7c7002ee3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java @@ -67,5 +67,12 @@ public interface EventHandler { void onDeleteCalendarEvent(byte type, long id); + /** + * Sets the given option in the device, typically with values from the preferences. + * The config name is device specific. + * @param config the device specific option to set on the device + */ + void onSendConfiguration(String config); + void onTestNewFunction(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/DateTimeDisplay.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/DateTimeDisplay.java new file mode 100644 index 000000000..40857aa45 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/DateTimeDisplay.java @@ -0,0 +1,6 @@ +package nodomain.freeyourgadget.gadgetbridge.devices.miband; + +public enum DateTimeDisplay { + TIME, + DATE_TIME +} 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 329575371..94070a194 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 @@ -7,10 +7,13 @@ import android.net.Uri; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; +import nodomain.freeyourgadget.gadgetbridge.util.Prefs; public class MiBand2Coordinator extends MiBandCoordinator { private static final Logger LOG = LoggerFactory.getLogger(MiBand2Coordinator.class); @@ -55,4 +58,13 @@ public class MiBand2Coordinator extends MiBandCoordinator { public InstallHandler findInstallHandler(Uri uri, Context context) { return null; // not supported at the moment } + + public static DateTimeDisplay getDateDisplay(Context context) throws IllegalArgumentException { + Prefs prefs = GBApplication.getPrefs(); + String dateFormatTime = context.getString(R.string.p_dateformat_time); + if (dateFormatTime.equals(prefs.getString(MiBandConst.PREF_MI2_DATEFORMAT, dateFormatTime))) { + return DateTimeDisplay.TIME; + } + return DateTimeDisplay.DATE_TIME; + } } 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 fce2f84d4..145f8179e 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 @@ -17,6 +17,7 @@ public final class MiBandConst { public static final String PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR = "mi_reserve_alarm_calendar"; 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_TRY_SMS = "mi_try_sms"; 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 4c8de0aab..cb289b1c8 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 @@ -18,6 +18,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.NotificationType; import nodomain.freeyourgadget.gadgetbridge.util.GB; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.ORIGIN_INCOMING_CALL; +import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DATEFORMAT; 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; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_FITNESS_GOAL; @@ -44,8 +45,22 @@ public class MiBandPreferencesActivity extends AbstractSettingsActivity { return true; } }); + final Preference setDateFormat = findPreference(PREF_MI2_DATEFORMAT); + setDateFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + getListView().post(new Runnable() { // delayed execution so that the preferences are applied first + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MI2_DATEFORMAT); + } + }); + return true; + } + }); } + @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); final Preference developmentMiaddr = findPreference(PREF_MIBAND_ADDRESS); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java index a46736550..8fd47d311 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java @@ -281,6 +281,13 @@ public class GBDeviceService implements DeviceService { invokeService(intent); } + @Override + public void onSendConfiguration(String config) { + Intent intent = createIntent().setAction(ACTION_SEND_CONFIGURATION) + .putExtra(EXTRA_CONFIG, config); + invokeService(intent); + } + @Override public void onTestNewFunction() { Intent intent = createIntent().setAction(ACTION_TEST_NEW_FUNCTION); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java index 6afa7e346..82fd39582 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java @@ -48,6 +48,7 @@ public interface DeviceService extends EventHandler { String ACTION_HEARTRATE_MEASUREMENT = PREFIX + ".action.hr_measurement"; String ACTION_ADD_CALENDAREVENT = PREFIX + ".action.add_calendarevent"; String ACTION_DELETE_CALENDAREVENT = PREFIX + ".action.delete_calendarevent"; + String ACTION_SEND_CONFIGURATION = PREFIX + ".action.send_configuration"; String ACTION_TEST_NEW_FUNCTION = PREFIX + ".action.test_new_function"; String EXTRA_DEVICE_ADDRESS = "device_address"; String EXTRA_NOTIFICATION_BODY = "notification_body"; @@ -80,6 +81,7 @@ public interface DeviceService extends EventHandler { String EXTRA_APP_START = "app_start"; String EXTRA_APP_CONFIG = "app_config"; String EXTRA_URI = "uri"; + String EXTRA_CONFIG = "config"; String EXTRA_ALARMS = "alarms"; String EXTRA_PERFORM_PAIR = "perform_pair"; String EXTRA_BOOLEAN_ENABLE = "enable_realtime_steps"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 82222bcfe..ef36a80bf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -72,6 +72,7 @@ import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_RE import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_REQUEST_APPINFO; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_REQUEST_DEVICEINFO; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_REQUEST_SCREENSHOT; +import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_SEND_CONFIGURATION; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_SETCANNEDMESSAGES; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_SETMUSICINFO; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_SETMUSICSTATE; @@ -96,6 +97,7 @@ import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_CAL import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_CALL_PHONENUMBER; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_CANNEDMESSAGES; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_CANNEDMESSAGES_TYPE; +import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_CONFIG; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_DEVICE_ADDRESS; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_FIND_START; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.EXTRA_MUSIC_ALBUM; @@ -485,6 +487,11 @@ public class DeviceCommunicationService extends Service implements SharedPrefere mDeviceSupport.onEnableRealtimeHeartRateMeasurement(enable); break; } + case ACTION_SEND_CONFIGURATION: { + String config = intent.getStringExtra(EXTRA_CONFIG); + mDeviceSupport.onSendConfiguration(config); + break; + } case ACTION_TEST_NEW_FUNCTION: { mDeviceSupport.onTestNewFunction(); break; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java index 0772633d7..a90ee63c5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java @@ -320,6 +320,14 @@ public class ServiceDeviceSupport implements DeviceSupport { delegate.onDeleteCalendarEvent(type, id); } + @Override + public void onSendConfiguration(String config) { + if (checkBusy("send configuration: " + config)) { + return; + } + delegate.onSendConfiguration(config); + } + @Override public void onTestNewFunction() { if (checkBusy("test new function event")) { 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 d8754e803..e8602b766 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 @@ -26,6 +26,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo; +import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Coordinator; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBand2Service; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandCoordinator; @@ -56,7 +57,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateA import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.WriteAction; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile; import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.heartrate.HeartRateProfile; -import nodomain.freeyourgadget.gadgetbridge.service.devices.miband2.DateDisplay; +import nodomain.freeyourgadget.gadgetbridge.devices.miband.DateTimeDisplay; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband2.Mi2NotificationStrategy; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband2.operations.InitOperation; import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; @@ -401,6 +402,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { LOG.info("Attempting to set wear location..."); BluetoothGattCharacteristic characteristic = getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC8); if (characteristic != null) { + builder.notify(characteristic, true); int location = MiBandCoordinator.getWearLocation(getDevice().getAddress()); switch (location) { case 0: // left hand @@ -410,6 +412,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { builder.write(characteristic, MiBand2Service.WEAR_LOCATION_RIGHT_WRIST); break; } + builder.notify(characteristic, false); // TODO: this should actually be in some kind of finally-block in the queue } return this; } @@ -444,6 +447,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { BluetoothGattCharacteristic characteristicHRControlPoint = getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_HEART_RATE_CONTROL_POINT); final boolean enableHrSleepSupport = MiBandCoordinator.getHeartrateSleepSupport(getDevice().getAddress()); if (characteristicHRControlPoint != null) { + builder.notify(characteristicHRControlPoint, true); if (enableHrSleepSupport) { LOG.info("Enabling heartrate sleep support..."); builder.write(characteristicHRControlPoint, MiBand2Service.COMMAND_ENABLE_HR_SLEEP_MEASUREMENT); @@ -451,6 +455,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { LOG.info("Disabling heartrate sleep support..."); builder.write(characteristicHRControlPoint, MiBand2Service.COMMAND_DISABLE_HR_SLEEP_MEASUREMENT); } + builder.notify(characteristicHRControlPoint, false); // TODO: this should run in some kind of finally-block in the queue } return this; } @@ -1154,13 +1159,30 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { } } + @Override + public void onSendConfiguration(String config) { + TransactionBuilder builder = null; + try { + builder = performInitialized("Sending configuration for option: " + config); + switch (config) { + case MiBandConst.PREF_MI2_DATEFORMAT: + setDateDisplay(builder); + break; + } + builder.queue(getQueue()); + } catch (IOException e) { + GB.toast("Error setting configuration", Toast.LENGTH_LONG, GB.ERROR, e); + } + } + @Override public void onTestNewFunction() { } - public MiBand2Support setDateDisplay(DateDisplay displayConfig, TransactionBuilder builder) { - LOG.info("Setting date display to " + displayConfig); - switch (displayConfig) { + private MiBand2Support setDateDisplay(TransactionBuilder builder) { + DateTimeDisplay dateTimeDisplay = MiBand2Coordinator.getDateDisplay(getContext()); + LOG.info("Setting date display to " + dateTimeDisplay); + switch (dateTimeDisplay) { case TIME: builder.write(getCharacteristic(MiBand2Service.UUID_UNKNOWN_CHARACTERISTIC3), MiBand2Service.DATEFORMAT_TIME); break; @@ -1174,8 +1196,9 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { public void phase2Initialize(TransactionBuilder builder) { LOG.info("phase2Initialize..."); enableFurtherNotifications(builder, true); - setDateDisplay(DateDisplay.TIME, builder); + setDateDisplay(builder); setWearLocation(builder); setHeartrateSleepSupport(builder); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java index 35cf1e0e0..fafab86fe 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java @@ -1190,6 +1190,11 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { } } + @Override + public void onSendConfiguration(String config) { + // nothing yet + } + @Override public void onTestNewFunction() { try { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/DateDisplay.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/DateDisplay.java deleted file mode 100644 index 0ac7de537..000000000 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband2/DateDisplay.java +++ /dev/null @@ -1,6 +0,0 @@ -package nodomain.freeyourgadget.gadgetbridge.service.devices.miband2; - -public enum DateDisplay { - TIME, - DATE_TIME -} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java index dcf14ada3..2b37852a9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java @@ -157,6 +157,13 @@ public class PebbleSupport extends AbstractSerialDeviceSupport { } } + @Override + public void onSendConfiguration(String config) { + if (reconnect()) { + super.onSendConfiguration(config); + } + } + @Override public void onTestNewFunction() { if (reconnect()) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java index e53d63b8b..a5f3e0d36 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java @@ -272,6 +272,11 @@ public class VibratissimoSupport extends AbstractBTLEDeviceSupport { return false; } + @Override + public void onSendConfiguration(String config) { + + } + @Override public void onTestNewFunction() { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java index 71acbb87c..9c8add33c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java @@ -215,6 +215,12 @@ public abstract class AbstractSerialDeviceSupport extends AbstractDeviceSupport sendToDevice(bytes); } + @Override + public void onSendConfiguration(String config) { + byte[] bytes = gbDeviceProtocol.encodeSendConfiguration(config); + sendToDevice(bytes); + } + @Override public void onTestNewFunction() { byte[] bytes = gbDeviceProtocol.encodeTestNewFunction(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java index 55d4c10c6..c4fe1e737 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java @@ -94,6 +94,10 @@ public abstract class GBDeviceProtocol { return null; } + public byte[] encodeSendConfiguration(String config) { + return null; + } + public byte[] encodeTestNewFunction() { return null; } public GBDeviceEvent[] decodeResponse(byte[] responseData) { @@ -103,4 +107,5 @@ public abstract class GBDeviceProtocol { public GBDevice getDevice() { return mDevice; } + } diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 830f7002d..e2aff8f58 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -113,5 +113,13 @@ 3 1 + + @string/dateformat_time + @string/dateformat_date_time + + + @string/p_dateformat_time + @string/p_dateformat_datetime + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 00ece7d21..7e9e7dd2e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -345,4 +345,7 @@ Vibration + Mi2: Date Format + Time + diff --git a/app/src/main/res/values/values.xml b/app/src/main/res/values/values.xml index a89f911ca..df90cb5b7 100644 --- a/app/src/main/res/values/values.xml +++ b/app/src/main/res/values/values.xml @@ -9,4 +9,7 @@ ring alarm_clock + dateformat_time + dateformat_datetime + diff --git a/app/src/main/res/xml/miband_preferences.xml b/app/src/main/res/xml/miband_preferences.xml index faf1d7323..b2a5c3635 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" /> + + +