diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java index babe4eafd8f35..12c16fc43bd3f 100644 --- a/services/core/java/com/android/server/notification/SnoozeHelper.java +++ b/services/core/java/com/android/server/notification/SnoozeHelper.java @@ -129,7 +129,7 @@ public final class SnoozeHelper { protected Long getSnoozeTimeForUnpostedNotification(int userId, String pkg, String key) { Long time = null; synchronized (mLock) { - time = mPersistedSnoozedNotifications.get(key); + time = mPersistedSnoozedNotifications.get(getTrimmedString(key)); } if (time == null) { time = 0L; @@ -139,7 +139,7 @@ public final class SnoozeHelper { protected String getSnoozeContextForUnpostedNotification(int userId, String pkg, String key) { synchronized (mLock) { - return mPersistedSnoozedNotificationsWithContext.get(key); + return mPersistedSnoozedNotificationsWithContext.get(getTrimmedString(key)); } } @@ -364,8 +364,9 @@ public final class SnoozeHelper { final NotificationRecord record = mSnoozedNotifications.valueAt(i); if (record.getUserId() == userId && record.getSbn().getPackageName().equals(pkg)) { mSnoozedNotifications.removeAt(i); - mPersistedSnoozedNotificationsWithContext.remove(record.getKey()); - mPersistedSnoozedNotifications.remove(record.getKey()); + String trimmedKey = getTrimmedString(record.getKey()); + mPersistedSnoozedNotificationsWithContext.remove(trimmedKey); + mPersistedSnoozedNotifications.remove(trimmedKey); Runnable runnable = () -> { final PendingIntent pi = createPendingIntent(record.getKey()); mAm.cancel(pi); @@ -386,8 +387,9 @@ public final class SnoozeHelper { final NotificationRecord record = mSnoozedNotifications.valueAt(i); if (record.getUserId() == userId) { mSnoozedNotifications.removeAt(i); - mPersistedSnoozedNotificationsWithContext.remove(record.getKey()); - mPersistedSnoozedNotifications.remove(record.getKey()); + String trimmedKey = getTrimmedString(record.getKey()); + mPersistedSnoozedNotificationsWithContext.remove(trimmedKey); + mPersistedSnoozedNotifications.remove(trimmedKey); Runnable runnable = () -> { final PendingIntent pi = createPendingIntent(record.getKey()); 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 1f117b3697c97..9c3d5a7fb6d9d 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java @@ -234,7 +234,7 @@ public class SnoozeHelperTest extends UiServiceTestCase { } @Test - public void testScheduleRepostsForLongTagPersistedNotification() throws Exception { + public void testLongTagPersistedNotification() throws Exception { String longTag = "A".repeat(66000); NotificationRecord r = getNotificationRecord("pkg", 1, longTag, UserHandle.SYSTEM); mSnoozeHelper.snooze(r, 0); @@ -612,7 +612,8 @@ public class SnoozeHelperTest extends UiServiceTestCase { public void testClearData_userPackage() { // snooze 2 from same package NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); - NotificationRecord r2 = getNotificationRecord("pkg", 2, "two", UserHandle.SYSTEM); + NotificationRecord r2 = getNotificationRecord("pkg", 2, "two" + "2".repeat(66000), + UserHandle.SYSTEM); // include notif with very long tag mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(r2, 1000); assertTrue(mSnoozeHelper.isSnoozed( @@ -634,11 +635,14 @@ public class SnoozeHelperTest extends UiServiceTestCase { @Test public void testClearData_user() { - // snooze 2 from same package + // snooze 2 from same package, including notifs with long tag NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); - NotificationRecord r2 = getNotificationRecord("pkg2", 2, "two", UserHandle.SYSTEM); - NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", UserHandle.SYSTEM); - NotificationRecord r4 = getNotificationRecord("pkg", 2, "two", UserHandle.ALL); + NotificationRecord r2 = getNotificationRecord("pkg2", 2, "two" + "2".repeat(66000), + UserHandle.SYSTEM); + NotificationRecord r3 = getNotificationRecord("pkg2", 3, "three", + UserHandle.SYSTEM); + NotificationRecord r4 = getNotificationRecord("pkg", 2, "two" + "2".repeat(66000), + UserHandle.ALL); mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(r2, 1000); mSnoozeHelper.snooze(r3, "until"); @@ -653,6 +657,19 @@ public class SnoozeHelperTest extends UiServiceTestCase { assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_ALL, r4.getSbn().getPackageName(), r4.getKey())); + assertFalse(0L == mSnoozeHelper.getSnoozeTimeForUnpostedNotification( + r.getUser().getIdentifier(), r.getSbn().getPackageName(), + r.getSbn().getKey())); + assertFalse(0L == mSnoozeHelper.getSnoozeTimeForUnpostedNotification( + r2.getUser().getIdentifier(), r2.getSbn().getPackageName(), + r2.getSbn().getKey())); + assertNotNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( + r3.getUser().getIdentifier(), r3.getSbn().getPackageName(), + r3.getSbn().getKey())); + assertNotNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( + r4.getUser().getIdentifier(), r4.getSbn().getPackageName(), + r4.getSbn().getKey())); + // clear data mSnoozeHelper.clearData(UserHandle.USER_SYSTEM); @@ -666,18 +683,18 @@ public class SnoozeHelperTest extends UiServiceTestCase { assertTrue(mSnoozeHelper.isSnoozed( UserHandle.USER_SYSTEM, r4.getSbn().getPackageName(), r4.getKey())); - assertNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( - r3.getUser().getIdentifier(), r3.getSbn().getPackageName(), - r3.getSbn().getKey())); - assertNotNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( - r4.getUser().getIdentifier(), r4.getSbn().getPackageName(), - r4.getSbn().getKey())); assertEquals(0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( r.getUser().getIdentifier(), r.getSbn().getPackageName(), r.getSbn().getKey()).longValue()); assertEquals(0L, mSnoozeHelper.getSnoozeTimeForUnpostedNotification( r2.getUser().getIdentifier(), r2.getSbn().getPackageName(), r2.getSbn().getKey()).longValue()); + assertNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( + r3.getUser().getIdentifier(), r3.getSbn().getPackageName(), + r3.getSbn().getKey())); + assertNotNull(mSnoozeHelper.getSnoozeContextForUnpostedNotification( + r4.getUser().getIdentifier(), r4.getSbn().getPackageName(), + r4.getSbn().getKey())); // 2 for initial timed-snoozes, once each for canceling the USER_SYSTEM snoozes verify(mAm, times(5)).cancel(any(PendingIntent.class));