From 7bb4802a03fed6aa3e7eaee7a30b7c2c4c0105f4 Mon Sep 17 00:00:00 2001 From: Koji Fukui Date: Mon, 2 Sep 2019 20:06:36 +0900 Subject: Update NotificationRecord of snooze even after it is cancelled Symptom: If a snoozed notification is cancelled and new notification that has same key is registered, the system continue to snooze the notification. But the notification won't be notified when the snoozing period expires. Root cause: SnoozeHelper doesn't update NotificationRecord if the existing record has already been cancelled. SnoozeHelper continue to use existing cancelled record. So SnoozeHelper doesn't repost notification when the snoozing period expires. Solution: SnoozeHelper updates NotificationRecord even if the existing record has been cancelled. Fixes: 140462813 Change-Id: I4b58aed20eec08819e36dac9dda250ac046205b8 --- .../android/server/notification/SnoozeHelper.java | 3 --- .../server/notification/SnoozeHelperTest.java | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java index abc98412e126..fbb6d6a06433 100644 --- a/services/core/java/com/android/server/notification/SnoozeHelper.java +++ b/services/core/java/com/android/server/notification/SnoozeHelper.java @@ -231,9 +231,6 @@ public class SnoozeHelper { return; } NotificationRecord existing = pkgRecords.get(record.getKey()); - if (existing != null && existing.isCanceled) { - return; - } pkgRecords.put(record.getKey(), record); } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java index 1e645436e7ea..8939375f7ebe 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java @@ -226,6 +226,26 @@ public class SnoozeHelperTest extends UiServiceTestCase { verify(mCallback, times(1)).repost(UserHandle.USER_SYSTEM, r); } + @Test + public void testUpdateAfterCancel() throws Exception { + // snooze a notification + NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); + mSnoozeHelper.snooze(r , 1000); + + // cancel the notification + mSnoozeHelper.cancel(UserHandle.USER_SYSTEM, false); + + // update the notification + r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); + mSnoozeHelper.update(UserHandle.USER_SYSTEM, r); + + // verify callback is called when repost (snooze is expired) + verify(mCallback, never()).repost(anyInt(), any(NotificationRecord.class)); + mSnoozeHelper.repost(r.getKey(), UserHandle.USER_SYSTEM); + verify(mCallback, times(1)).repost(UserHandle.USER_SYSTEM, r); + assertFalse(r.isCanceled); + } + @Test public void testGetSnoozedByUser() throws Exception { NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); -- cgit v1.2.3-59-g8ed1b