From 3644d5e7a64fa38879277998b568757636078cb5 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Mon, 9 Jan 2017 16:33:00 +0100 Subject: [PATCH] Pebble: remove notifications when dismissed on the phone (#326) Most of the code is generic, so it could be implemented by other devices. I dont know what happens if multiple messages arrive in the same notification. So, this is experimental. --- .../gadgetbridge/devices/EventHandler.java | 2 ++ .../externalevents/NotificationListener.java | 3 ++- .../gadgetbridge/impl/GBDeviceService.java | 8 ++++++++ .../gadgetbridge/model/DeviceService.java | 1 + .../service/DeviceCommunicationService.java | 5 +++++ .../gadgetbridge/service/ServiceDeviceSupport.java | 5 +++++ .../service/devices/hplus/HPlusSupport.java | 5 +++++ .../service/devices/miband/MiBandSupport.java | 5 +++++ .../service/devices/miband2/MiBand2Support.java | 5 +++++ .../service/devices/pebble/PebbleProtocol.java | 11 +++++++---- .../devices/vibratissimo/VibratissimoSupport.java | 5 +++++ .../service/serial/AbstractSerialDeviceSupport.java | 6 ++++++ .../gadgetbridge/service/serial/GBDeviceProtocol.java | 4 ++++ .../gadgetbridge/service/TestDeviceSupport.java | 5 +++++ 14 files changed, 65 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java index 00374072..6cfaa1ef 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java @@ -22,6 +22,8 @@ import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec; public interface EventHandler { void onNotification(NotificationSpec notificationSpec); + void onDeleteNotification(int id); + void onSetTime(); void onSetAlarms(ArrayList alarms); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java index 130ea7d5..4ad5fa48 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/NotificationListener.java @@ -392,7 +392,8 @@ public class NotificationListener extends NotificationListenerService { @Override public void onNotificationRemoved(StatusBarNotification sbn) { - + LOG.info("notification removed, will ask device to delete it"); + GBApplication.deviceService().onDeleteNotification((int) sbn.getPostTime()); //FIMXE: a truly unique id would be better } private void dumpExtras(Bundle bundle) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java index 361dbe26..949791c7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java @@ -105,6 +105,14 @@ public class GBDeviceService implements DeviceService { invokeService(intent); } + @Override + public void onDeleteNotification(int id) { + Intent intent = createIntent().setAction(ACTION_DELETE_NOTIFICATION) + .putExtra(EXTRA_NOTIFICATION_ID, id); + invokeService(intent); + + } + @Override public void onSetTime() { Intent intent = createIntent().setAction(ACTION_SETTIME); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java index b536fefb..f03a58d5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java @@ -16,6 +16,7 @@ public interface DeviceService extends EventHandler { String ACTION_START = PREFIX + ".action.start"; String ACTION_CONNECT = PREFIX + ".action.connect"; String ACTION_NOTIFICATION = PREFIX + ".action.notification"; + String ACTION_DELETE_NOTIFICATION = PREFIX + ".action.delete_notification"; String ACTION_CALLSTATE = PREFIX + ".action.callstate"; String ACTION_SETCANNEDMESSAGES = PREFIX + ".action.setcannedmessages"; String ACTION_SETTIME = PREFIX + ".action.settime"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index f4417fb7..0edf9171 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -60,6 +60,7 @@ import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_CA import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_CONNECT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_DELETEAPP; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_DELETE_CALENDAREVENT; +import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_DELETE_NOTIFICATION; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_DISCONNECT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_ENABLE_HEARTRATE_SLEEP_SUPPORT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_ENABLE_REALTIME_HEARTRATE_MEASUREMENT; @@ -355,6 +356,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere mDeviceSupport.onNotification(notificationSpec); break; } + case ACTION_DELETE_NOTIFICATION: { + mDeviceSupport.onDeleteNotification(intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1)); + break; + } case ACTION_ADD_CALENDAREVENT: { CalendarEventSpec calendarEventSpec = new CalendarEventSpec(); calendarEventSpec.id = intent.getLongExtra(EXTRA_CALENDAREVENT_ID, -1); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java index 437bf5c7..e46d03db 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java @@ -135,6 +135,11 @@ public class ServiceDeviceSupport implements DeviceSupport { delegate.onNotification(notificationSpec); } + @Override + public void onDeleteNotification(int id) { + delegate.onDeleteNotification(id); + } + @Override public void onSetTime() { if (checkBusy("set time") || checkThrottle("set time")) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java index be083b07..c92c8736 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/hplus/HPlusSupport.java @@ -447,6 +447,11 @@ public class HPlusSupport extends AbstractBTLEDeviceSupport { showText(notificationSpec.body); } + @Override + public void onDeleteNotification(int id) { + + } + @Override public void onSetTime() { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java index 1971c073..be1e32fb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java @@ -545,6 +545,11 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { performPreferredNotification(origin + " received", origin, null); } + @Override + public void onDeleteNotification(int id) { + + } + @Override public void onSetTime() { try { 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 b89e9e08..d068c2c5 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 @@ -594,6 +594,11 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport { performPreferredNotification(origin + " received", origin, alertLevel, null); } + @Override + public void onDeleteNotification(int id) { + + } + @Override public void onSetTime() { try { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java index fb0016d7..ede3da7a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java @@ -483,6 +483,11 @@ public class PebbleProtocol extends GBDeviceProtocol { } } + @Override + public byte[] encodeDeleteNotification(int id) { + return encodeBlobdb(new UUID(GB_UUID_MASK, id), BLOBDB_DELETE, BLOBDB_NOTIFICATION, null); + } + @Override public byte[] encodeAddCalendarEvent(CalendarEventSpec calendarEventSpec) { long id = calendarEventSpec.id != -1 ? calendarEventSpec.id : mRandom.nextLong(); @@ -917,16 +922,14 @@ public class PebbleProtocol extends GBDeviceProtocol { } } - UUID uuid = UUID.randomUUID(); short pin_length = (short) (NOTIFICATION_PIN_LENGTH + attributes_length); ByteBuffer buf = ByteBuffer.allocate(pin_length); // pin - 46 bytes buf.order(ByteOrder.BIG_ENDIAN); - buf.putLong(uuid.getMostSignificantBits()); - buf.putInt((int) (uuid.getLeastSignificantBits() >>> 32)); - buf.putInt(id); + buf.putLong(GB_UUID_MASK); + buf.putLong(id); buf.putLong(UUID_NOTIFICATIONS.getMostSignificantBits()); buf.putLong(UUID_NOTIFICATIONS.getLeastSignificantBits()); buf.order(ByteOrder.LITTLE_ENDIAN); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java index b19b4329..cca5825d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/vibratissimo/VibratissimoSupport.java @@ -124,6 +124,11 @@ public class VibratissimoSupport extends AbstractBTLEDeviceSupport { public void onNotification(NotificationSpec notificationSpec) { } + @Override + public void onDeleteNotification(int id) { + + } + @Override public void onSetTime() { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java index 216f2c51..d3df5c13 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java @@ -108,6 +108,12 @@ public abstract class AbstractSerialDeviceSupport extends AbstractDeviceSupport sendToDevice(bytes); } + @Override + public void onDeleteNotification(int id) { + byte[] bytes = gbDeviceProtocol.encodeDeleteNotification(id); + sendToDevice(bytes); + } + @Override public void onSetTime() { byte[] bytes = gbDeviceProtocol.encodeSetTime(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java index 77a5bc2e..ca3e3ee9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java @@ -21,6 +21,10 @@ public abstract class GBDeviceProtocol { return null; } + public byte[] encodeDeleteNotification(int id) { + return null; + } + public byte[] encodeSetTime() { return null; } diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java index 160b855b..45ba1217 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java @@ -54,6 +54,11 @@ class TestDeviceSupport extends AbstractDeviceSupport { } + @Override + public void onDeleteNotification(int id) { + + } + @Override public void onSetTime() {