From ba0fdb8c9647bde8dcf77a921380ab3b4cc01d24 Mon Sep 17 00:00:00 2001 From: Sebastian Kranz Date: Mon, 17 Sep 2018 08:10:49 +0200 Subject: [PATCH] Part 2: Add inactivity alert - complete now. Add checkbox to en-/disable the heart rate alarm and group this with the limits in its own screen. --- .../devices/zetime/ZeTimeConstants.java | 2 + .../zetime/ZeTimePreferenceActivity.java | 161 ++++++++++++++++++ .../devices/zetime/ZeTimeDeviceSupport.java | 43 ++++- app/src/main/res/values/strings.xml | 7 +- app/src/main/res/xml/zetime_preferences.xml | 44 +++-- 5 files changed, 235 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimeConstants.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimeConstants.java index 444a42aec..a0d8deda1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimeConstants.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimeConstants.java @@ -120,6 +120,7 @@ public class ZeTimeConstants { public static final String PREF_ZETIME_DONT_DEL_ACTDATA = "zetime_dont_del_actdata"; + public static final String PREF_ZETIME_HEARTRATE_ALARM = "zetime_heartrate_alarm_enable"; public static final String PREF_ZETIME_MAX_HEARTRATE = "alarm_max_heart_rate"; public static final String PREF_ZETIME_MIN_HEARTRATE = "alarm_min_heart_rate"; @@ -127,6 +128,7 @@ public class ZeTimeConstants { public static final String PREF_DO_NOT_DISTURB_START = "zetime_do_not_disturb_start"; public static final String PREF_DO_NOT_DISTURB_END = "zetime_do_not_disturb_end"; + public static final String PREF_INACTIVITY_KEY = "zetime_inactivity_warning_key"; public static final String PREF_INACTIVITY_ENABLE = "zetime_inactivity_warnings"; public static final String PREF_INACTIVITY_START = "zetime_inactivity_warnings_start"; public static final String PREF_INACTIVITY_END = "zetime_inactivity_warnings_end"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimePreferenceActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimePreferenceActivity.java index 9d97eccc5..8eabbc36f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimePreferenceActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/zetime/ZeTimePreferenceActivity.java @@ -130,6 +130,167 @@ public class ZeTimePreferenceActivity extends AbstractSettingsActivity { return true; } }); + + final Preference inactivityAlert = findPreference(ZeTimeConstants.PREF_INACTIVITY_ENABLE); + inactivityAlert.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertStart = findPreference(ZeTimeConstants.PREF_INACTIVITY_START); + inactivityAlertStart.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertEnd = findPreference(ZeTimeConstants.PREF_INACTIVITY_END); + inactivityAlertEnd.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertThreshold = findPreference(ZeTimeConstants.PREF_INACTIVITY_THRESHOLD); + inactivityAlertThreshold.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertMo = findPreference(ZeTimeConstants.PREF_INACTIVITY_MO); + inactivityAlertMo.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertTu = findPreference(ZeTimeConstants.PREF_INACTIVITY_TU); + inactivityAlertTu.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertWe = findPreference(ZeTimeConstants.PREF_INACTIVITY_WE); + inactivityAlertWe.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertTh = findPreference(ZeTimeConstants.PREF_INACTIVITY_TH); + inactivityAlertTh.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertFr = findPreference(ZeTimeConstants.PREF_INACTIVITY_FR); + inactivityAlertFr.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertSa = findPreference(ZeTimeConstants.PREF_INACTIVITY_SA); + inactivityAlertSa.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + + final Preference inactivityAlertSu = findPreference(ZeTimeConstants.PREF_INACTIVITY_SU); + inactivityAlertSu.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newVal) { + invokeLater(new Runnable() { + @Override + public void run() { + GBApplication.deviceService().onSendConfiguration(ZeTimeConstants.PREF_INACTIVITY_KEY); + } + }); + return true; + } + }); + } + + /** + * delayed execution so that the preferences are applied first + */ + private void invokeLater(Runnable runnable) { + getListView().post(runnable); } // private void addTryListeners() { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zetime/ZeTimeDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zetime/ZeTimeDeviceSupport.java index 50787b246..51eaea75a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zetime/ZeTimeDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/zetime/ZeTimeDeviceSupport.java @@ -170,6 +170,9 @@ public class ZeTimeDeviceSupport extends AbstractBTLEDeviceSupport { case ZeTimeConstants.PREF_DATE_FORMAT: setDateFormate(builder); break; + case ZeTimeConstants.PREF_INACTIVITY_KEY: + setInactivityAlert(builder); + break; } builder.queue(getQueue()); } catch (IOException e) { @@ -1428,6 +1431,7 @@ public class ZeTimeDeviceSupport extends AbstractBTLEDeviceSupport { { Prefs prefs = GBApplication.getPrefs(); + boolean alarmEnabled = prefs.getBoolean(ZeTimeConstants.PREF_ZETIME_HEARTRATE_ALARM, false); int maxHR = prefs.getInt(ZeTimeConstants.PREF_ZETIME_MAX_HEARTRATE, 180); int minHR = prefs.getInt(ZeTimeConstants.PREF_ZETIME_MIN_HEARTRATE, 60); @@ -1438,7 +1442,7 @@ public class ZeTimeDeviceSupport extends AbstractBTLEDeviceSupport { (byte)0x0, (byte)(maxHR & 0xff), (byte)(minHR & 0xff), - (byte)0x1, // activate alarm + (byte)(alarmEnabled ? 1 : 0), // activate alarm ZeTimeConstants.CMD_END}; sendMsgToWatch(builder, heartrateAlarm); } @@ -1646,16 +1650,39 @@ public class ZeTimeDeviceSupport extends AbstractBTLEDeviceSupport { if(enabled) { + String start = prefs.getString(ZeTimeConstants.PREF_INACTIVITY_START, "06:00"); + String end = prefs.getString(ZeTimeConstants.PREF_INACTIVITY_END, "22:00"); + DateFormat df_start = new SimpleDateFormat("HH:mm"); + DateFormat df_end = new SimpleDateFormat("HH:mm"); + Calendar calendar = GregorianCalendar.getInstance(); + Calendar calendar_end = GregorianCalendar.getInstance(); + int reps = (1 << 7); // set inactivity active: set bit 7 - reps |= prefs.getInt(ZeTimeConstants.PREF_INACTIVITY_MO, 0); - reps |= (prefs.getInt(ZeTimeConstants.PREF_INACTIVITY_TU, 0) << 1); - reps |= (prefs.getInt(ZeTimeConstants.PREF_INACTIVITY_WE, 0) << 2); - reps |= (prefs.getInt(ZeTimeConstants.PREF_INACTIVITY_TH, 0) << 3); - reps |= (prefs.getInt(ZeTimeConstants.PREF_INACTIVITY_FR, 0) << 4); - reps |= (prefs.getInt(ZeTimeConstants.PREF_INACTIVITY_SA, 0) << 5); - reps |= (prefs.getInt(ZeTimeConstants.PREF_INACTIVITY_SU, 0) << 6); + reps |= (prefs.getBoolean(ZeTimeConstants.PREF_INACTIVITY_MO, false) ? 1 : 0); + reps |= ((prefs.getBoolean(ZeTimeConstants.PREF_INACTIVITY_TU, false) ? 1 : 0) << 1); + reps |= ((prefs.getBoolean(ZeTimeConstants.PREF_INACTIVITY_WE, false) ? 1 : 0) << 2); + reps |= ((prefs.getBoolean(ZeTimeConstants.PREF_INACTIVITY_TH, false) ? 1 : 0) << 3); + reps |= ((prefs.getBoolean(ZeTimeConstants.PREF_INACTIVITY_FR, false) ? 1 : 0) << 4); + reps |= ((prefs.getBoolean(ZeTimeConstants.PREF_INACTIVITY_SA, false) ? 1 : 0) << 5); + reps |= ((prefs.getBoolean(ZeTimeConstants.PREF_INACTIVITY_SU, false) ? 1 : 0) << 6); inactivity[5] = (byte)reps; + + try { + calendar.setTime(df_start.parse(start)); + try { + calendar_end.setTime(df_end.parse(end)); + + inactivity[7] = (byte)calendar.get(Calendar.HOUR_OF_DAY); + inactivity[8] = (byte)calendar.get(Calendar.MINUTE); + inactivity[9] = (byte)calendar_end.get(Calendar.HOUR_OF_DAY); + inactivity[10] = (byte)calendar_end.get(Calendar.MINUTE); + } catch(Exception e) { + LOG.error("Unexpected exception in ZeTimeDeviceSupport.setInactivityAlert: " + e.getMessage()); + } + } catch(Exception e) { + LOG.error("Unexpected exception in ZeTimeDeviceSupport.setInactivityAlert: " + e.getMessage()); + } } sendMsgToWatch(builder, inactivity); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e86ca3de9..ce8ca4777 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -209,8 +209,11 @@ ZeTime settings Heart rate settings Screen on duration in seconds - Max heart rate alarm - Min heart rate alarm + Heart rate alarm + The watch will warn you when your heart rate exceeds the limits. + Enable the heart rate alarm + Max heart rate + Min heart rate Analog mode Only hands Hands and steps diff --git a/app/src/main/res/xml/zetime_preferences.xml b/app/src/main/res/xml/zetime_preferences.xml index 0b0bcf818..9f85c7c7e 100644 --- a/app/src/main/res/xml/zetime_preferences.xml +++ b/app/src/main/res/xml/zetime_preferences.xml @@ -180,18 +180,38 @@ android:key="heartrate_measurement_interval" android:summary="%s" android:title="@string/prefs_title_heartrate_measurement_interval" /> - + - + + + + + + + + + \ No newline at end of file