Loading services/core/java/com/android/server/notification/NotificationManagerService.java +14 −5 Original line number Diff line number Diff line Loading @@ -7030,6 +7030,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void snoozeLocked(NotificationRecord r) { final List<NotificationRecord> recordsToSnooze = new ArrayList<>(); if (r.getSbn().isGroup()) { final List<NotificationRecord> groupNotifications = findCurrentAndSnoozedGroupNotificationsLocked( Loading @@ -7038,8 +7039,8 @@ public class NotificationManagerService extends SystemService { if (r.getNotification().isGroupSummary()) { // snooze all children for (int i = 0; i < groupNotifications.size(); i++) { if (mKey != groupNotifications.get(i).getKey()) { snoozeNotificationLocked(groupNotifications.get(i)); if (!mKey.equals(groupNotifications.get(i).getKey())) { recordsToSnooze.add(groupNotifications.get(i)); } } } else { Loading @@ -7049,8 +7050,8 @@ public class NotificationManagerService extends SystemService { if (groupNotifications.size() == 2) { // snooze summary and the one child for (int i = 0; i < groupNotifications.size(); i++) { if (mKey != groupNotifications.get(i).getKey()) { snoozeNotificationLocked(groupNotifications.get(i)); if (!mKey.equals(groupNotifications.get(i).getKey())) { recordsToSnooze.add(groupNotifications.get(i)); } } } Loading @@ -7058,7 +7059,15 @@ public class NotificationManagerService extends SystemService { } } // snooze the notification snoozeNotificationLocked(r); recordsToSnooze.add(r); if (mSnoozeHelper.canSnooze(recordsToSnooze.size())) { for (int i = 0; i < recordsToSnooze.size(); i++) { snoozeNotificationLocked(recordsToSnooze.get(i)); } } else { Log.w(TAG, "Cannot snooze " + r.getKey() + ": too many snoozed notifications"); } } Loading services/core/java/com/android/server/notification/SnoozeHelper.java +11 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,8 @@ import java.util.Set; public class SnoozeHelper { public static final int XML_SNOOZED_NOTIFICATION_VERSION = 1; static final int CONCURRENT_SNOOZE_LIMIT = 500; protected static final String XML_TAG_NAME = "snoozed-notifications"; private static final String XML_SNOOZED_NOTIFICATION = "notification"; Loading Loading @@ -135,6 +137,15 @@ public class SnoozeHelper { } } protected boolean canSnooze(int numberToSnooze) { synchronized (mLock) { if ((mPackages.size() + numberToSnooze) > CONCURRENT_SNOOZE_LIMIT) { return false; } } return true; } @NonNull protected Long getSnoozeTimeForUnpostedNotification(int userId, String pkg, String key) { Long time = null; Loading services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +75 −10 Original line number Diff line number Diff line Loading @@ -3380,39 +3380,98 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() throws Exception { public void testSnoozeRunnable_tooManySnoozed_singleNotification() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, null, true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); when(mSnoozeHelper.canSnooze(1)).thenReturn(false); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = verify(mSnoozeHelper, never()).snooze(any(NotificationRecord.class), anyLong()); assertThat(mService.getNotificationRecordCount()).isEqualTo(1); } @Test public void testSnoozeRunnable_tooManySnoozed_singleGroupChildNotification() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); final NotificationRecord notificationChild = generateNotificationRecord( mTestNotificationChannel, 1, "group", false); mService.addNotification(notification); mService.addNotification(notificationChild); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); when(mSnoozeHelper.canSnooze(2)).thenReturn(false); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notificationChild.getKey(), 100, null); snoozeNotificationRunnable.run(); verify(mSnoozeHelper, never()).snooze(any(NotificationRecord.class), anyLong()); assertThat(mService.getNotificationRecordCount()).isEqualTo(2); } @Test public void testSnoozeRunnable_tooManySnoozed_summaryNotification() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); final NotificationRecord notificationChild = generateNotificationRecord( mTestNotificationChannel, 12, "group", false); final NotificationRecord notificationChild2 = generateNotificationRecord( mTestNotificationChannel, 13, "group", false); mService.addNotification(notification); mService.addNotification(notificationChild); mService.addNotification(notificationChild2); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); when(mSnoozeHelper.canSnooze(3)).thenReturn(false); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); verify(mSnoozeHelper, never()).snooze(any(NotificationRecord.class), anyLong()); assertThat(mService.getNotificationRecordCount()).isEqualTo(3); } @Test public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, null, true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); snoozeNotificationRunnable.run(); // snooze twice verify(mSnoozeHelper, times(2)).snooze(any(NotificationRecord.class), anyLong()); } @Test public void testSnoozeRunnable_reSnoozeASnoozedNotificationWithGroupKey() throws Exception { public void testSnoozeRunnable_reSnoozeASnoozedNotificationWithGroupKey() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); // snooze twice Loading @@ -3430,6 +3489,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.getNotifications( anyString(), anyString(), anyInt())).thenReturn(new ArrayList<>()); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading @@ -3439,8 +3499,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { .thenReturn(new ArrayList<>(Arrays.asList(notification, notification2))); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); notification2.getKey(), 100, null); snoozeNotificationRunnable2.run(); // snooze twice verify(mSnoozeHelper, times(4)).snooze(any(NotificationRecord.class), anyLong()); Loading @@ -3454,6 +3514,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mTestNotificationChannel, 2, "group", false); mService.addNotification(grouped); mService.addNotification(nonGrouped); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading Loading @@ -3483,6 +3544,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mService.addNotification(parent); mService.addNotification(child); mService.addNotification(child2); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading @@ -3504,6 +3566,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mService.addNotification(parent); mService.addNotification(child); mService.addNotification(child2); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading @@ -3529,6 +3592,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mTestNotificationChannel, 2, "group", false); mService.addNotification(parent); mService.addNotification(child); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading Loading @@ -3556,6 +3620,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { final NotificationRecord child = generateNotificationRecord( mTestNotificationChannel, 2, "group", false); mService.addNotification(child); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +17 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.server.notification; import static com.android.server.notification.SnoozeHelper.CONCURRENT_SNOOZE_LIMIT; import static com.android.server.notification.SnoozeHelper.EXTRA_KEY; import static junit.framework.Assert.assertEquals; Loading Loading @@ -280,6 +281,22 @@ public class SnoozeHelperTest extends UiServiceTestCase { UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); } @Test public void testSnoozeLimit() { for (int i = 0; i < CONCURRENT_SNOOZE_LIMIT; i++ ) { NotificationRecord r = getNotificationRecord("pkg", i, i+"", UserHandle.SYSTEM); assertTrue("cannot snooze record " + i, mSnoozeHelper.canSnooze(1)); if (i % 2 == 0) { mSnoozeHelper.snooze(r, null); } else { mSnoozeHelper.snooze(r, 9000); } } assertFalse(mSnoozeHelper.canSnooze(1)); } @Test public void testCancelByApp() throws Exception { NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); Loading Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +14 −5 Original line number Diff line number Diff line Loading @@ -7030,6 +7030,7 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void snoozeLocked(NotificationRecord r) { final List<NotificationRecord> recordsToSnooze = new ArrayList<>(); if (r.getSbn().isGroup()) { final List<NotificationRecord> groupNotifications = findCurrentAndSnoozedGroupNotificationsLocked( Loading @@ -7038,8 +7039,8 @@ public class NotificationManagerService extends SystemService { if (r.getNotification().isGroupSummary()) { // snooze all children for (int i = 0; i < groupNotifications.size(); i++) { if (mKey != groupNotifications.get(i).getKey()) { snoozeNotificationLocked(groupNotifications.get(i)); if (!mKey.equals(groupNotifications.get(i).getKey())) { recordsToSnooze.add(groupNotifications.get(i)); } } } else { Loading @@ -7049,8 +7050,8 @@ public class NotificationManagerService extends SystemService { if (groupNotifications.size() == 2) { // snooze summary and the one child for (int i = 0; i < groupNotifications.size(); i++) { if (mKey != groupNotifications.get(i).getKey()) { snoozeNotificationLocked(groupNotifications.get(i)); if (!mKey.equals(groupNotifications.get(i).getKey())) { recordsToSnooze.add(groupNotifications.get(i)); } } } Loading @@ -7058,7 +7059,15 @@ public class NotificationManagerService extends SystemService { } } // snooze the notification snoozeNotificationLocked(r); recordsToSnooze.add(r); if (mSnoozeHelper.canSnooze(recordsToSnooze.size())) { for (int i = 0; i < recordsToSnooze.size(); i++) { snoozeNotificationLocked(recordsToSnooze.get(i)); } } else { Log.w(TAG, "Cannot snooze " + r.getKey() + ": too many snoozed notifications"); } } Loading
services/core/java/com/android/server/notification/SnoozeHelper.java +11 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,8 @@ import java.util.Set; public class SnoozeHelper { public static final int XML_SNOOZED_NOTIFICATION_VERSION = 1; static final int CONCURRENT_SNOOZE_LIMIT = 500; protected static final String XML_TAG_NAME = "snoozed-notifications"; private static final String XML_SNOOZED_NOTIFICATION = "notification"; Loading Loading @@ -135,6 +137,15 @@ public class SnoozeHelper { } } protected boolean canSnooze(int numberToSnooze) { synchronized (mLock) { if ((mPackages.size() + numberToSnooze) > CONCURRENT_SNOOZE_LIMIT) { return false; } } return true; } @NonNull protected Long getSnoozeTimeForUnpostedNotification(int userId, String pkg, String key) { Long time = null; Loading
services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +75 −10 Original line number Diff line number Diff line Loading @@ -3380,39 +3380,98 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() throws Exception { public void testSnoozeRunnable_tooManySnoozed_singleNotification() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, null, true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); when(mSnoozeHelper.canSnooze(1)).thenReturn(false); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = verify(mSnoozeHelper, never()).snooze(any(NotificationRecord.class), anyLong()); assertThat(mService.getNotificationRecordCount()).isEqualTo(1); } @Test public void testSnoozeRunnable_tooManySnoozed_singleGroupChildNotification() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); final NotificationRecord notificationChild = generateNotificationRecord( mTestNotificationChannel, 1, "group", false); mService.addNotification(notification); mService.addNotification(notificationChild); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); when(mSnoozeHelper.canSnooze(2)).thenReturn(false); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notificationChild.getKey(), 100, null); snoozeNotificationRunnable.run(); verify(mSnoozeHelper, never()).snooze(any(NotificationRecord.class), anyLong()); assertThat(mService.getNotificationRecordCount()).isEqualTo(2); } @Test public void testSnoozeRunnable_tooManySnoozed_summaryNotification() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); final NotificationRecord notificationChild = generateNotificationRecord( mTestNotificationChannel, 12, "group", false); final NotificationRecord notificationChild2 = generateNotificationRecord( mTestNotificationChannel, 13, "group", false); mService.addNotification(notification); mService.addNotification(notificationChild); mService.addNotification(notificationChild2); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); when(mSnoozeHelper.canSnooze(3)).thenReturn(false); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); verify(mSnoozeHelper, never()).snooze(any(NotificationRecord.class), anyLong()); assertThat(mService.getNotificationRecordCount()).isEqualTo(3); } @Test public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, null, true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); snoozeNotificationRunnable.run(); // snooze twice verify(mSnoozeHelper, times(2)).snooze(any(NotificationRecord.class), anyLong()); } @Test public void testSnoozeRunnable_reSnoozeASnoozedNotificationWithGroupKey() throws Exception { public void testSnoozeRunnable_reSnoozeASnoozedNotificationWithGroupKey() { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); // snooze twice Loading @@ -3430,6 +3489,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.getNotifications( anyString(), anyString(), anyInt())).thenReturn(new ArrayList<>()); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading @@ -3439,8 +3499,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { .thenReturn(new ArrayList<>(Arrays.asList(notification, notification2))); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); notification2.getKey(), 100, null); snoozeNotificationRunnable2.run(); // snooze twice verify(mSnoozeHelper, times(4)).snooze(any(NotificationRecord.class), anyLong()); Loading @@ -3454,6 +3514,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mTestNotificationChannel, 2, "group", false); mService.addNotification(grouped); mService.addNotification(nonGrouped); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading Loading @@ -3483,6 +3544,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mService.addNotification(parent); mService.addNotification(child); mService.addNotification(child2); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading @@ -3504,6 +3566,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mService.addNotification(parent); mService.addNotification(child); mService.addNotification(child2); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading @@ -3529,6 +3592,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mTestNotificationChannel, 2, "group", false); mService.addNotification(parent); mService.addNotification(child); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading Loading @@ -3556,6 +3620,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { final NotificationRecord child = generateNotificationRecord( mTestNotificationChannel, 2, "group", false); mService.addNotification(child); when(mSnoozeHelper.canSnooze(anyInt())).thenReturn(true); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( Loading
services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +17 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.server.notification; import static com.android.server.notification.SnoozeHelper.CONCURRENT_SNOOZE_LIMIT; import static com.android.server.notification.SnoozeHelper.EXTRA_KEY; import static junit.framework.Assert.assertEquals; Loading Loading @@ -280,6 +281,22 @@ public class SnoozeHelperTest extends UiServiceTestCase { UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey())); } @Test public void testSnoozeLimit() { for (int i = 0; i < CONCURRENT_SNOOZE_LIMIT; i++ ) { NotificationRecord r = getNotificationRecord("pkg", i, i+"", UserHandle.SYSTEM); assertTrue("cannot snooze record " + i, mSnoozeHelper.canSnooze(1)); if (i % 2 == 0) { mSnoozeHelper.snooze(r, null); } else { mSnoozeHelper.snooze(r, 9000); } } assertFalse(mSnoozeHelper.canSnooze(1)); } @Test public void testCancelByApp() throws Exception { NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); Loading