diff --git a/CHANGELOG.md b/CHANGELOG.md index fb62c8767..3ec739933 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,11 @@ ### Changelog +#### Version 0.19.4 +* Replace or relicense CC-NC licensed icons to satisfy F-Droid +* Mi Band 2: Make infos to display on the Band configurable +* Mi Band 2: Support wrist rotation to switch info setting +* Mi Band 2: Support goal notification setting +* Mi Band 2: Support do not disturb setting +* Mi Band 2: Support inactivity warning setting #### Version 0.19.3 * Pebble: Fix crash when calendar access permission has been denied diff --git a/LICENSE.artwork b/LICENSE.artwork index 67dfe5c60..d33a2fcd8 100644 --- a/LICENSE.artwork +++ b/LICENSE.artwork @@ -1,19 +1,22 @@ The following artwork is licensed under the following licenses Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0): + ic_launcher.png ic_device_pebble.png ic_device_miband.png + ic_device_lovetoy.png + ic_device_hplus.png + ic_device_default.png ic_activitytracker.png ic_watchface.png ic_languagepack.png ic_firmware.png ic_watchapp.png ic_systemapp.png + icon.png (fastlane metadata directories) + featureGraphic.png (fastlane metadata directories) (All of the above by xphnx) -Creative Commons Attribution-NonCommercial-ShareAlike (CC BY-NC-SA): - ic_launcher.png (by Joseph Kim) - Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0): "GET IT ON F-Droid" button by Laura Kalbag. Source: https://ind.ie/about/blog/f-droid-button/ diff --git a/app/build.gradle b/app/build.gradle index dd0056da3..d8aab74f0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,8 +26,8 @@ android { targetSdkVersion 25 // note: always bump BOTH versionCode and versionName! - versionName "0.19.3" - versionCode 96 + versionName "0.19.4" + versionCode 97 vectorDrawables.useSupportLibrary = true } buildTypes { diff --git a/app/src/main/assets/ic_launcher.svg b/app/src/main/assets/ic_launcher.svg index 03b479948..248c7760d 100644 --- a/app/src/main/assets/ic_launcher.svg +++ b/app/src/main/assets/ic_launcher.svg @@ -1,65 +1,443 @@ + + + version="1.1" + inkscape:version="0.92.1 r15371" + sodipodi:docname="template1.svg" + inkscape:export-xdpi="648" + inkscape:export-ydpi="648"> + Gadgetbridge Icon + inkscape:snap-grids="true" + inkscape:snap-to-guides="false" + inkscape:snap-page="true"> + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -69,81 +447,128 @@ image/svg+xml - + Gadgetbridge Icon + + 18/07/2017 + + + xphnx + + + + + CC (BY-SA) + + + Launcher icon for Gadgetbridge. Based on Blue Minimal Template (GPLv3) + https://github.com/scoute-dich/Blue-Minimal/tree/master/IconTemplates + + + xphnx based on a work of scoute-dich + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java index a8ad87d53..a2b0cb8c0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java @@ -487,7 +487,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { } activityEntries.add(createBarEntry(value, ts)); if (hr && isValidHeartRateValue(sample.getHeartRate())) { - if (lastHrSampleIndex > -1 && ts - lastHrSampleIndex > 60*HeartRateUtils.MAX_HR_MEASUREMENTS_GAP_MINUTES) { + if (lastHrSampleIndex > -1 && ts - lastHrSampleIndex > 1800*HeartRateUtils.MAX_HR_MEASUREMENTS_GAP_MINUTES) { heartrateEntries.add(createLineEntry(0, lastHrSampleIndex + 1)); heartrateEntries.add(createLineEntry(0, ts - 1)); } @@ -530,7 +530,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { List list = new ArrayList<>(); list.add(activitySet); BarData barData = new BarData(list); - barData.setBarWidth(100f); + barData.setBarWidth(200f); // barData.setGroupSpace(0); combinedData.setData(barData); @@ -595,10 +595,10 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { protected LineDataSet createHeartrateSet(List values, String label) { LineDataSet set1 = new LineDataSet(values, label); - set1.setLineWidth(0.8f); + set1.setLineWidth(2.2f); set1.setColor(HEARTRATE_COLOR); // set1.setDrawCubic(true); - set1.setMode(LineDataSet.Mode.CUBIC_BEZIER); + set1.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER); set1.setCubicIntensity(0.1f); set1.setDrawCircles(false); // set1.setCircleRadius(2f); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java index 993b0a921..b4b74d7e4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java @@ -245,4 +245,5 @@ public interface DeviceCoordinator { * This can be live HR, steps etc. */ boolean supportsRealtimeData(); + } 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 535da565b..7cc267211 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 @@ -47,9 +47,6 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDeviceCandidate; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DO_NOT_DISTURB_END; -import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DO_NOT_DISTURB_START; - public class MiBand2Coordinator extends MiBandCoordinator { private static final Logger LOG = LoggerFactory.getLogger(MiBand2Coordinator.class); @@ -139,27 +136,54 @@ public class MiBand2Coordinator extends MiBandCoordinator { return prefs.getBoolean(MiBandConst.PREF_MI2_ROTATE_WRIST_TO_SWITCH_INFO, false); } - public static Date getDoNotDisturbStart() { + public static boolean getInactivityWarnings() { Prefs prefs = GBApplication.getPrefs(); - String time = prefs.getString(PREF_MI2_DO_NOT_DISTURB_START, "01:00"); + return prefs.getBoolean(MiBandConst.PREF_MI2_INACTIVITY_WARNINGS, false); + } - DateFormat df = new SimpleDateFormat("HH:mm"); - try { - return df.parse(time); - } catch(Exception e) { - } + public static int getInactivityWarningsThreshold() { + Prefs prefs = GBApplication.getPrefs(); + return prefs.getInt(MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD, 60); + } - return new Date(); + public static boolean getInactivityWarningsDnd() { + Prefs prefs = GBApplication.getPrefs(); + return prefs.getBoolean(MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND, false); + } + + public static Date getInactivityWarningsStart() { + return getTimePreference(MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_START, "06:00"); + } + + public static Date getInactivityWarningsEnd() { + return getTimePreference(MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_END, "22:00"); + } + + public static Date getInactivityWarningsDndStart() { + return getTimePreference(MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND_START, "12:00"); + } + + public static Date getInactivityWarningsDndEnd() { + return getTimePreference(MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND_END, "14:00"); + } + + public static Date getDoNotDisturbStart() { + return getTimePreference(MiBandConst.PREF_MI2_DO_NOT_DISTURB_START, "01:00"); } public static Date getDoNotDisturbEnd() { + return getTimePreference(MiBandConst.PREF_MI2_DO_NOT_DISTURB_END, "06:00"); + } + + public static Date getTimePreference(String key, String defaultValue) { Prefs prefs = GBApplication.getPrefs(); - String time = prefs.getString(PREF_MI2_DO_NOT_DISTURB_END, "06:00"); + String time = prefs.getString(key, defaultValue); DateFormat df = new SimpleDateFormat("HH:mm"); try { return df.parse(time); } catch(Exception e) { + LOG.error("Unexpected exception in MiBand2Coordinator.getTime: " + e.getMessage()); } return new Date(); 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 3442cecbd..90fb9c7b7 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 @@ -174,6 +174,22 @@ public class MiBand2Service { public static final byte[] DISPLAY_XXX = new byte[] {ENDPOINT_DISPLAY, 0x03, 0x0, 0x0 }; public static final byte[] DISPLAY_YYY = new byte[] {ENDPOINT_DISPLAY, 0x10, 0x0, 0x1, 0x1 }; + // The third byte controls the threshold, in minutes + // The last 8 bytes represent 2 separate time intervals for the inactivity warnings + // If there is no do not disturb interval, the last 4 bytes (the second interval) are 0 + // and only the first interval of the command is used + public static int INACTIVITY_WARNINGS_THRESHOLD = 2; + public static int INACTIVITY_WARNINGS_INTERVAL_1_START_HOURS = 4; + public static int INACTIVITY_WARNINGS_INTERVAL_1_START_MINUTES = 5; + public static int INACTIVITY_WARNINGS_INTERVAL_1_END_HOURS = 6; + public static int INACTIVITY_WARNINGS_INTERVAL_1_END_MINUTES = 7; + public static int INACTIVITY_WARNINGS_INTERVAL_2_START_HOURS = 8; + public static int INACTIVITY_WARNINGS_INTERVAL_2_START_MINUTES = 9; + public static int INACTIVITY_WARNINGS_INTERVAL_2_END_HOURS = 10; + public static int INACTIVITY_WARNINGS_INTERVAL_2_END_MINUTES = 11; + public static final byte[] COMMAND_ENABLE_INACTIVITY_WARNINGS = new byte[] { 0x08, 0x01, 0x3c, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00 }; + public static final byte[] COMMAND_DISABLE_INACTIVITY_WARNINGS = new byte[] { 0x08, 0x00, 0x3c, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00 }; + public static byte ENDPOINT_DND = 0x09; public static final byte[] COMMAND_DO_NOT_DISTURB_AUTOMATIC = new byte[] { ENDPOINT_DND, (byte) 0x83 }; 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 a9bffb2c5..cba053dfd 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 @@ -52,6 +52,13 @@ public final class MiBandConst { public static final String PREF_MI2_DO_NOT_DISTURB_SCHEDULED = "scheduled"; public static final String PREF_MI2_DO_NOT_DISTURB_START = "mi2_do_not_disturb_start"; public static final String PREF_MI2_DO_NOT_DISTURB_END = "mi2_do_not_disturb_end"; + public static final String PREF_MI2_INACTIVITY_WARNINGS = "mi2_inactivity_warnings"; + public static final String PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD = "mi2_inactivity_warnings_threshold"; + public static final String PREF_MI2_INACTIVITY_WARNINGS_START = "mi2_inactivity_warnings_start"; + public static final String PREF_MI2_INACTIVITY_WARNINGS_END = "mi2_inactivity_warnings_end"; + public static final String PREF_MI2_INACTIVITY_WARNINGS_DND = "mi2_inactivity_warnings_dnd"; + public static final String PREF_MI2_INACTIVITY_WARNINGS_DND_START = "mi2_inactivity_warnings_dnd_start"; + public static final String PREF_MI2_INACTIVITY_WARNINGS_DND_END = "mi2_inactivity_warnings_dnd_end"; public static final String PREF_MIBAND_SETUP_BT_PAIRING = "mi_setup_bt_pairing"; 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 124608a2c..9aabf77ed 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 @@ -48,6 +48,13 @@ import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PR import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_DO_NOT_DISTURB_START; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_ENABLE_TEXT_NOTIFICATIONS; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_GOAL_NOTIFICATION; +import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS; +import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND; +import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND_END; +import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND_START; +import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_END; +import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_START; +import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD; 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; import static nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst.PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS; @@ -147,6 +154,104 @@ public class MiBandPreferencesActivity extends AbstractSettingsActivity { } }); + final Preference inactivityWarnings = findPreference(PREF_MI2_INACTIVITY_WARNINGS); + inactivityWarnings.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MI2_INACTIVITY_WARNINGS); + } + }); + return true; + } + }); + + final Preference inactivityWarningsThreshold = findPreference(PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD); + inactivityWarningsThreshold.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD); + } + }); + return true; + } + }); + + final Preference inactivityWarningsStart = findPreference(PREF_MI2_INACTIVITY_WARNINGS_START); + inactivityWarningsStart.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MI2_INACTIVITY_WARNINGS_START); + } + }); + return true; + } + }); + + final Preference inactivityWarningsEnd = findPreference(PREF_MI2_INACTIVITY_WARNINGS_END); + inactivityWarningsEnd.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MI2_INACTIVITY_WARNINGS_END); + } + }); + return true; + } + }); + + final Preference inactivityWarningsDnd = findPreference(PREF_MI2_INACTIVITY_WARNINGS_DND); + inactivityWarningsDnd.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MI2_INACTIVITY_WARNINGS_DND); + } + }); + return true; + } + }); + + final Preference inactivityWarningsDndStart = findPreference(PREF_MI2_INACTIVITY_WARNINGS_DND_START); + inactivityWarningsDndStart.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MI2_INACTIVITY_WARNINGS_DND_START); + } + }); + return true; + } + }); + + final Preference inactivityWarningsDndEnd = findPreference(PREF_MI2_INACTIVITY_WARNINGS_DND_END); + inactivityWarningsDndEnd.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(PREF_MI2_INACTIVITY_WARNINGS_DND_END); + } + }); + return true; + } + }); + String doNotDisturbState = prefs.getString(MiBandConst.PREF_MI2_DO_NOT_DISTURB, PREF_MI2_DO_NOT_DISTURB_OFF); boolean doNotDisturbScheduled = doNotDisturbState.equals(PREF_MI2_DO_NOT_DISTURB_SCHEDULED); @@ -270,6 +375,7 @@ public class MiBandPreferencesActivity extends AbstractSettingsActivity { prefKeys.add(PREF_MIBAND_RESERVE_ALARM_FOR_CALENDAR); prefKeys.add(PREF_MIBAND_DEVICE_TIME_OFFSET_HOURS); prefKeys.add(PREF_MI2_ENABLE_TEXT_NOTIFICATIONS); + prefKeys.add(PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD); prefKeys.add(getNotificationPrefKey(VIBRATION_COUNT, ORIGIN_ALARM_CLOCK)); prefKeys.add(getNotificationPrefKey(VIBRATION_COUNT, ORIGIN_INCOMING_CALL)); 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 13878293c..3307e7660 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 @@ -1097,6 +1097,16 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { case MiBandConst.PREF_MI2_DO_NOT_DISTURB_START: case MiBandConst.PREF_MI2_DO_NOT_DISTURB_END: setDoNotDisturb(builder); + break; + case MiBandConst.PREF_MI2_INACTIVITY_WARNINGS: + case MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_THRESHOLD: + case MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_START: + case MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_END: + case MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND: + case MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND_START: + case MiBandConst.PREF_MI2_INACTIVITY_WARNINGS_DND_END: + setInactivityWarnings(builder); + break; } builder.queue(getQueue()); } catch (IOException e) { @@ -1238,6 +1248,60 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { return this; } + private MiBand2Support setInactivityWarnings(TransactionBuilder builder) { + boolean enable = MiBand2Coordinator.getInactivityWarnings(); + LOG.info("Setting inactivity warnings to " + enable); + + if (enable) { + byte[] data = MiBand2Service.COMMAND_ENABLE_INACTIVITY_WARNINGS.clone(); + + int threshold = MiBand2Coordinator.getInactivityWarningsThreshold(); + data[MiBand2Service.INACTIVITY_WARNINGS_THRESHOLD] = (byte) threshold; + + Calendar calendar = GregorianCalendar.getInstance(); + + boolean enableDnd = MiBand2Coordinator.getInactivityWarningsDnd(); + + Date intervalStart = MiBand2Coordinator.getInactivityWarningsStart(); + Date intervalEnd = MiBand2Coordinator.getInactivityWarningsEnd(); + Date dndStart = MiBand2Coordinator.getInactivityWarningsDndStart(); + Date dndEnd = MiBand2Coordinator.getInactivityWarningsDndEnd(); + + // The first interval always starts when the warnings interval starts + calendar.setTime(intervalStart); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_START_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_START_MINUTES] = (byte) calendar.get(Calendar.MINUTE); + + if(enableDnd) { + // The first interval ends when the dnd interval starts + calendar.setTime(dndStart); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE); + + // The second interval starts when the dnd interval ends + calendar.setTime(dndEnd); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_2_START_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_2_START_MINUTES] = (byte) calendar.get(Calendar.MINUTE); + + // ... and it ends when the warnings interval ends + calendar.setTime(intervalEnd); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_2_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_2_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE); + } else { + // No Dnd, use the first interval + calendar.setTime(intervalEnd); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_END_HOURS] = (byte) calendar.get(Calendar.HOUR_OF_DAY); + data[MiBand2Service.INACTIVITY_WARNINGS_INTERVAL_1_END_MINUTES] = (byte) calendar.get(Calendar.MINUTE); + } + + builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), data); + } else { + builder.write(getCharacteristic(MiBand2Service.UUID_CHARACTERISTIC_3_CONFIGURATION), MiBand2Service.COMMAND_DISABLE_INACTIVITY_WARNINGS); + } + + return this; + } + public void phase2Initialize(TransactionBuilder builder) { LOG.info("phase2Initialize..."); enableFurtherNotifications(builder, true); @@ -1251,6 +1315,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { setRotateWristToSwitchInfo(builder); setActivateDisplayOnLiftWrist(builder); setGoalNotification(builder); + setInactivityWarnings(builder); setHeartrateSleepSupport(builder); } } diff --git a/app/src/main/res/drawable-hdpi/ic_device_default_disabled.png b/app/src/main/res/drawable-hdpi/ic_device_default_disabled.png index af629f563..1bac776d6 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_device_default_disabled.png and b/app/src/main/res/drawable-hdpi/ic_device_default_disabled.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_device_hplus.png b/app/src/main/res/drawable-hdpi/ic_device_hplus.png index 7af95bddc..e587d6c94 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_device_hplus.png and b/app/src/main/res/drawable-hdpi/ic_device_hplus.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_device_hplus_disabled.png b/app/src/main/res/drawable-hdpi/ic_device_hplus_disabled.png index a4a7d7fdb..e0161308c 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_device_hplus_disabled.png and b/app/src/main/res/drawable-hdpi/ic_device_hplus_disabled.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_device_lovetoy.png b/app/src/main/res/drawable-hdpi/ic_device_lovetoy.png index dee058966..c7178523e 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_device_lovetoy.png and b/app/src/main/res/drawable-hdpi/ic_device_lovetoy.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_device_lovetoy_disabled.png b/app/src/main/res/drawable-hdpi/ic_device_lovetoy_disabled.png index c9589fa3f..3dd7f4066 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_device_lovetoy_disabled.png and b/app/src/main/res/drawable-hdpi/ic_device_lovetoy_disabled.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png index ca5ed91e2..2f00d1339 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_launcher.png and b/app/src/main/res/drawable-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_device_default_disabled.png b/app/src/main/res/drawable-mdpi/ic_device_default_disabled.png index 113ad06c6..8e63a4de1 100644 Binary files a/app/src/main/res/drawable-mdpi/ic_device_default_disabled.png and b/app/src/main/res/drawable-mdpi/ic_device_default_disabled.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_device_hplus.png b/app/src/main/res/drawable-mdpi/ic_device_hplus.png index 88e4c9c13..1c75995d9 100644 Binary files a/app/src/main/res/drawable-mdpi/ic_device_hplus.png and b/app/src/main/res/drawable-mdpi/ic_device_hplus.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_device_hplus_disabled.png b/app/src/main/res/drawable-mdpi/ic_device_hplus_disabled.png index 84496f3e7..c95833b78 100644 Binary files a/app/src/main/res/drawable-mdpi/ic_device_hplus_disabled.png and b/app/src/main/res/drawable-mdpi/ic_device_hplus_disabled.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_device_lovetoy.png b/app/src/main/res/drawable-mdpi/ic_device_lovetoy.png index 70fe4aa1d..1b29201fb 100644 Binary files a/app/src/main/res/drawable-mdpi/ic_device_lovetoy.png and b/app/src/main/res/drawable-mdpi/ic_device_lovetoy.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_device_lovetoy_disabled.png b/app/src/main/res/drawable-mdpi/ic_device_lovetoy_disabled.png index 2e4236a42..0734fe39a 100644 Binary files a/app/src/main/res/drawable-mdpi/ic_device_lovetoy_disabled.png and b/app/src/main/res/drawable-mdpi/ic_device_lovetoy_disabled.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_launcher.png b/app/src/main/res/drawable-mdpi/ic_launcher.png index efbe18c47..fc5448876 100644 Binary files a/app/src/main/res/drawable-mdpi/ic_launcher.png and b/app/src/main/res/drawable-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_device_default_disabled.png b/app/src/main/res/drawable-xhdpi/ic_device_default_disabled.png index 0b51f592d..f345ede52 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_device_default_disabled.png and b/app/src/main/res/drawable-xhdpi/ic_device_default_disabled.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_device_hplus.png b/app/src/main/res/drawable-xhdpi/ic_device_hplus.png index e91f060f8..79ed8c60d 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_device_hplus.png and b/app/src/main/res/drawable-xhdpi/ic_device_hplus.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_device_hplus_disabled.png b/app/src/main/res/drawable-xhdpi/ic_device_hplus_disabled.png index 2c3f219cd..838b66ad1 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_device_hplus_disabled.png and b/app/src/main/res/drawable-xhdpi/ic_device_hplus_disabled.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_device_lovetoy.png b/app/src/main/res/drawable-xhdpi/ic_device_lovetoy.png index bea0a9b40..54773d9a0 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_device_lovetoy.png and b/app/src/main/res/drawable-xhdpi/ic_device_lovetoy.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_device_lovetoy_disabled.png b/app/src/main/res/drawable-xhdpi/ic_device_lovetoy_disabled.png index abb430304..4889a2712 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_device_lovetoy_disabled.png and b/app/src/main/res/drawable-xhdpi/ic_device_lovetoy_disabled.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png index af114dff2..3c1c88f28 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_launcher.png and b/app/src/main/res/drawable-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_device_default_disabled.png b/app/src/main/res/drawable-xxhdpi/ic_device_default_disabled.png index b5758d1c3..4289e81fa 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_device_default_disabled.png and b/app/src/main/res/drawable-xxhdpi/ic_device_default_disabled.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_device_hplus.png b/app/src/main/res/drawable-xxhdpi/ic_device_hplus.png index 01996225f..6f8cd91ba 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_device_hplus.png and b/app/src/main/res/drawable-xxhdpi/ic_device_hplus.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_device_hplus_disabled.png b/app/src/main/res/drawable-xxhdpi/ic_device_hplus_disabled.png index a70528df4..b2cea45b2 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_device_hplus_disabled.png and b/app/src/main/res/drawable-xxhdpi/ic_device_hplus_disabled.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_device_lovetoy.png b/app/src/main/res/drawable-xxhdpi/ic_device_lovetoy.png index 37d405037..3eab74f0c 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_device_lovetoy.png and b/app/src/main/res/drawable-xxhdpi/ic_device_lovetoy.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_device_lovetoy_disabled.png b/app/src/main/res/drawable-xxhdpi/ic_device_lovetoy_disabled.png index 959b6279b..4eebb7933 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_device_lovetoy_disabled.png and b/app/src/main/res/drawable-xxhdpi/ic_device_lovetoy_disabled.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxhdpi/ic_launcher.png index d75e49287..63e70984a 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_launcher.png and b/app/src/main/res/drawable-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 3516f7d21..fa52294b3 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -310,6 +310,10 @@ A pulseira não recebe notificações enquanto activo Hora de início Hora de fim + Avisos de inactividade + A pulseira irá vibrar quando estiver inactivo durante algum tempo + Limite de inactividade (em minutos) + Desactivar os avisos de inactividade durante um intervalo de tempo Prestes a transferir dados desde %1$s aguarde para tornar a ligar Sobre você diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 645fb5ab1..5973dd937 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -354,6 +354,10 @@ Rotate wrist to switch info Do Not Disturb The band won\'t receive notifications while active + Inactivity warnings + The band will vibrate when you have been inactive for a while + Inactivity threshold (in minutes) + Disable the inactivity warnings for a time interval Start time End time About to transfer data since %1$s diff --git a/app/src/main/res/xml/changelog_master.xml b/app/src/main/res/xml/changelog_master.xml index d91c8ef02..2ee226c78 100644 --- a/app/src/main/res/xml/changelog_master.xml +++ b/app/src/main/res/xml/changelog_master.xml @@ -1,5 +1,13 @@ + + Replace or relicense CC-NC licensed icons to satisfy F-Droid + Mi Band 2: Make infos to display on the Band configurable + Mi Band 2: Support wrist rotation to switch info setting + Mi Band 2: Support goal notification setting + Mi Band 2: Support do not disturb setting + Mi Band 2: Support inactivity warning setting + Pebble: Fix crash when calendar access permission has been denied Pebble: Fix wrong timestamps with Morpheuz running on Firmware >=3 diff --git a/app/src/main/res/xml/miband_preferences.xml b/app/src/main/res/xml/miband_preferences.xml index e7338045f..8419ab9ff 100644 --- a/app/src/main/res/xml/miband_preferences.xml +++ b/app/src/main/res/xml/miband_preferences.xml @@ -84,6 +84,63 @@ android:title="@string/miband2_prefs_dateformat" android:summary="%s" /> + + + + + + + + + + + + + + + + + + + + =3 +* Mi Band 2: Improve reliability when fetching activity data +* HPlus: Fix intensity calculation without continuous connectivity +* HPlus: Fix Unicode handling +* HPlus: Initial not work detection +* Fix memory leak +* Only show Realtime Chart on devices supporting it \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/97.txt b/fastlane/metadata/android/en-US/changelogs/97.txt new file mode 100644 index 000000000..fb39cf2ad --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/97.txt @@ -0,0 +1,6 @@ +* Replace or relicense CC-NC licensed icons to satisfy F-Droid +* Mi Band 2: Make infos to display on the Band configurable +* Mi Band 2: Support wrist rotation to switch info setting +* Mi Band 2: Support goal notification setting +* Mi Band 2: Support do not disturb setting +* Mi Band 2: Support inactivity warning setting diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 000000000..c5125a0b4 --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,7 @@ +Use your Pebble/Mi Band/Hplus device without the vendor's closed source application and without the need to create an account and transmit any of your data to the vendor's servers. + +You can get notifications on your wrist and (depending on the device): +- collect data from the device sensors +- control music playing on your android device +- see the weather +- get directions \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.jpg b/fastlane/metadata/android/en-US/images/featureGraphic.jpg new file mode 100644 index 000000000..81fe49245 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/featureGraphic.jpg differ diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 000000000..1c8dcb3b0 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/icon.png differ diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 000000000..eee6feb52 --- /dev/null +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +Use your Pebble/Mi Band/Hplus device without the vendor's closed source application and without the need to create an account and transmit any of your data to the vendor's servers. \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt new file mode 100644 index 000000000..e7ee542a5 --- /dev/null +++ b/fastlane/metadata/android/en-US/title.txt @@ -0,0 +1 @@ +Gadgetbridge \ No newline at end of file diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt new file mode 100644 index 000000000..90da37d9f --- /dev/null +++ b/fastlane/metadata/android/it-IT/full_description.txt @@ -0,0 +1,8 @@ +Utilizza il tuo dispositivo Pebble/Mi Band/Hplus senza dipendere dall'applicazione proprietaria del vendor e senza bisogno di creare accounts e trasferire i tuoi dati altrove. + +Vedi le notifiche direttamente sul tuo polso, e inoltre (a seconda del dispositivo): + +- memorizza i dati della tua attività fisica dai sensori +- controlla le app per riprodurre musica sul tuo dispositivo android +- vedi le condizioni meteorologiche +- vedi le indicazioni stradali \ No newline at end of file diff --git a/fastlane/metadata/android/it-IT/images/featureGraphic.jpg b/fastlane/metadata/android/it-IT/images/featureGraphic.jpg new file mode 100644 index 000000000..81fe49245 Binary files /dev/null and b/fastlane/metadata/android/it-IT/images/featureGraphic.jpg differ diff --git a/fastlane/metadata/android/it-IT/images/icon.png b/fastlane/metadata/android/it-IT/images/icon.png new file mode 100644 index 000000000..1c8dcb3b0 Binary files /dev/null and b/fastlane/metadata/android/it-IT/images/icon.png differ diff --git a/fastlane/metadata/android/it-IT/short_description.txt b/fastlane/metadata/android/it-IT/short_description.txt new file mode 100644 index 000000000..9771770e3 --- /dev/null +++ b/fastlane/metadata/android/it-IT/short_description.txt @@ -0,0 +1 @@ +Utilizza il tuo dispositivo Pebble/Mi Band/Hplus senza dipendere dall'applicazione proprietaria del vendor e senza bisogno di creare accounts e trasferire i tuoi dati altrove. \ No newline at end of file diff --git a/fastlane/metadata/android/it-IT/title.txt b/fastlane/metadata/android/it-IT/title.txt new file mode 100644 index 000000000..e7ee542a5 --- /dev/null +++ b/fastlane/metadata/android/it-IT/title.txt @@ -0,0 +1 @@ +Gadgetbridge \ No newline at end of file