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
This commit is contained in:
Koji Fukui
2019-09-02 20:06:36 +09:00
committed by Jay Aliomer
parent 9e5de85e21
commit 7bb4802a03
2 changed files with 20 additions and 3 deletions

View File

@@ -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);
}

View File

@@ -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);