From bf4e948c3578da2731eaaf47b86771f34e74f12a Mon Sep 17 00:00:00 2001 From: Daniel Dakhno Date: Fri, 15 Apr 2022 02:08:51 +0200 Subject: [PATCH] UM25: added notification on below current threshold --- .../DeviceSettingsPreferenceConst.java | 3 + .../DeviceSpecificSettingsFragment.java | 3 + .../um25/Coordinator/UM25Coordinator.java | 8 +++ .../devices/um25/Support/UM25Support.java | 71 ++++++++++++++++++- app/src/main/res/xml/devicesettings_um25.xml | 11 +++ 5 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/xml/devicesettings_um25.xml diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java index 2903eb033..7e461dfd1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java @@ -178,6 +178,9 @@ public class DeviceSettingsPreferenceConst { public static final String PREFS_ACTIVITY_IN_DEVICE_CARD_DISTANCE = "prefs_activity_in_device_card_distance"; public static final String PREFS_DEVICE_CHARTS_TABS = "charts_tabs"; + public static final String PREF_UM25_SHOW_THRESHOLD_NOTIFICATION = "um25_current_threshold_notify"; + public static final String PREF_UM25_SHOW_THRESHOLD = "um25_current_threshold"; + public static final String PREF_SOUNDS = "sounds"; public static final String PREF_AUTH_KEY = "authkey"; public static final String PREF_USER_FITNESS_GOAL = "fitness_goal"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index 373e03aee..260a64ea8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -456,6 +456,9 @@ public class DeviceSpecificSettingsFragment extends PreferenceFragmentCompat imp addPreferenceHandlerFor(PREF_QC35_NOISE_CANCELLING_LEVEL); addPreferenceHandlerFor(PREF_USER_FITNESS_GOAL); + addPreferenceHandlerFor(PREF_UM25_SHOW_THRESHOLD_NOTIFICATION); + addPreferenceHandlerFor(PREF_UM25_SHOW_THRESHOLD); + String sleepTimeState = prefs.getString(PREF_SLEEP_TIME, PREF_DO_NOT_DISTURB_OFF); boolean sleepTimeScheduled = sleepTimeState.equals(PREF_DO_NOT_DISTURB_SCHEDULED); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/um25/Coordinator/UM25Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/um25/Coordinator/UM25Coordinator.java index efe70c99a..65c312caf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/um25/Coordinator/UM25Coordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/um25/Coordinator/UM25Coordinator.java @@ -16,6 +16,7 @@ import java.util.Collections; import cyanogenmod.app.CustomTile; import nodomain.freeyourgadget.gadgetbridge.GBException; +import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler; @@ -55,6 +56,13 @@ public class UM25Coordinator extends AbstractDeviceCoordinator { return DeviceType.UNKNOWN; } + @Override + public int[] getSupportedDeviceSpecificSettings(GBDevice device) { + return new int[]{ + R.xml.devicesettings_um25 + }; + } + @Override public DeviceType getDeviceType() { return DeviceType.UM25; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/um25/Support/UM25Support.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/um25/Support/UM25Support.java index 7a728c375..8a6c8b19d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/um25/Support/UM25Support.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/um25/Support/UM25Support.java @@ -1,12 +1,15 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.um25.Support; +import android.app.Notification; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCharacteristic; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.SharedPreferences; +import androidx.core.app.NotificationCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import org.slf4j.Logger; @@ -19,12 +22,16 @@ import java.util.UUID; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.service.btle.BtLEAction; import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction; import nodomain.freeyourgadget.gadgetbridge.service.devices.um25.Data.CaptureGroup; import nodomain.freeyourgadget.gadgetbridge.service.devices.um25.Data.MeasurementData; +import nodomain.freeyourgadget.gadgetbridge.util.GB; import nodomain.freeyourgadget.gadgetbridge.util.StringUtils; public class UM25Support extends UM25BaseSupport { @@ -44,6 +51,12 @@ public class UM25Support extends UM25BaseSupport { private static final Logger logger = LoggerFactory.getLogger(UM25Support.class); + SharedPreferences preferences; + + private boolean notifyOnCurrentThreshold; + private int notificationCurrentThreshold; + private boolean wasOverNotificationCurrent = false; + private long lastOverThresholdTimestamp = 0; public UM25Support() { super(logger); @@ -63,8 +76,22 @@ public class UM25Support extends UM25BaseSupport { } }; + void readPreferences(){ + notifyOnCurrentThreshold = preferences.getBoolean(DeviceSettingsPreferenceConst.PREF_UM25_SHOW_THRESHOLD_NOTIFICATION, false); + notificationCurrentThreshold = Integer.parseInt(preferences.getString(DeviceSettingsPreferenceConst.PREF_UM25_SHOW_THRESHOLD, "100")); + } + + @Override + public void onSendConfiguration(String config) { + readPreferences(); + } + @Override protected TransactionBuilder initializeDevice(TransactionBuilder builder) { + preferences = GBApplication.getDeviceSpecificSharedPrefs(getDevice().getAddress()); + + readPreferences(); + return builder .add(new SetDeviceStateAction(getDevice(), GBDevice.State.INITIALIZING, getContext())) .notify(getCharacteristic(UUID.fromString(UUID_CHAR)), true) @@ -132,6 +159,46 @@ public class UM25Support extends UM25BaseSupport { return true; } + private void handleCurrentNotification(int currentMa){ + logger.debug("current: " + currentMa); + + if(!notifyOnCurrentThreshold){ + return; + } + + boolean isOverNotificationCurrent = currentMa > notificationCurrentThreshold; + + long now = System.currentTimeMillis(); + + if(isOverNotificationCurrent){ + lastOverThresholdTimestamp = now; + wasOverNotificationCurrent = true; + return; + } + long deltaSinceOverThreshold = now - lastOverThresholdTimestamp; + + if(deltaSinceOverThreshold < 5000){ + // must be below threshold for over certain time before triggering notification + return; + } + + if(wasOverNotificationCurrent){ + // handle change from over threshold to below threshold + wasOverNotificationCurrent = false; + Notification notification = new NotificationCompat.Builder(getContext(), GB.NOTIFICATION_CHANNEL_HIGH_PRIORITY_ID) + .setSmallIcon(R.drawable.ic_notification_low_battery) + .setContentTitle("USB current") + .setContentText("USB current below threshold") + .build(); + + GB.notify( + GB.NOTIFICATION_ID_LOW_BATTERY, + notification, + getContext() + ); + } + } + private void handlePayload(ByteBuffer payload){ String payloadString = StringUtils.bytesToHex(payload.array()); payloadString = payloadString.replaceAll("(..)", "$1 "); @@ -163,8 +230,6 @@ public class UM25Support extends UM25BaseSupport { int chargingSeconds = payload.getInt(112); int cableResistance = payload.getInt(122); - logger.debug("variable: " + chargedCurrent); - MeasurementData data = new MeasurementData( voltage, current, @@ -185,6 +250,8 @@ public class UM25Support extends UM25BaseSupport { measurementIntent.putExtra(EXTRA_KEY_MEASUREMENT_DATA, data); + handleCurrentNotification(current / 10); + LocalBroadcastManager.getInstance(getContext()) .sendBroadcast(measurementIntent); } diff --git a/app/src/main/res/xml/devicesettings_um25.xml b/app/src/main/res/xml/devicesettings_um25.xml new file mode 100644 index 000000000..ebc0cb7fb --- /dev/null +++ b/app/src/main/res/xml/devicesettings_um25.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file