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 @@
+
+
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 activoHora de inícioHora 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 tempoPrestes a transferir dados desde %1$saguarde para tornar a ligarSobre 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 infoDo Not DisturbThe 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 intervalStart timeEnd timeAbout 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 deniedPebble: 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