Loading services/core/java/com/android/server/notification/NotificationManagerService.java +32 −13 Original line number Diff line number Diff line Loading @@ -5229,7 +5229,7 @@ public class NotificationManagerService extends SystemService { @Override public void run() { synchronized (mNotificationLock) { final NotificationRecord r = findNotificationByKeyLocked(mKey); final NotificationRecord r = findInCurrentAndSnoozedNotificationByKeyLocked(mKey); if (r != null) { snoozeLocked(r); } Loading @@ -5239,34 +5239,35 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void snoozeLocked(NotificationRecord r) { if (r.sbn.isGroup()) { final List<NotificationRecord> groupNotifications = findGroupNotificationsLocked( final List<NotificationRecord> groupNotifications = findCurrentAndSnoozedGroupNotificationsLocked( r.sbn.getPackageName(), r.sbn.getGroupKey(), r.sbn.getUserId()); if (r.getNotification().isGroupSummary()) { // snooze summary and all children // snooze all children for (int i = 0; i < groupNotifications.size(); i++) { if (mKey != groupNotifications.get(i).getKey()) { snoozeNotificationLocked(groupNotifications.get(i)); } } } else { // if there is a valid summary for this group, and we are snoozing the only // child, also snooze the summary if (mSummaryByGroupKey.containsKey(r.sbn.getGroupKey())) { if (groupNotifications.size() != 2) { snoozeNotificationLocked(r); } else { 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)); } } } else { snoozeNotificationLocked(r); } } } else { // just snooze the one notification snoozeNotificationLocked(r); } } // snooze the notification snoozeNotificationLocked(r); } @GuardedBy("mNotificationLock") void snoozeNotificationLocked(NotificationRecord r) { Loading Loading @@ -7049,6 +7050,15 @@ public class NotificationManagerService extends SystemService { } } @GuardedBy("mNotificationLock") @NonNull List<NotificationRecord> findCurrentAndSnoozedGroupNotificationsLocked(String pkg, String groupKey, int userId) { List<NotificationRecord> records = mSnoozeHelper.getNotifications(pkg, groupKey, userId); records.addAll(findGroupNotificationsLocked(pkg, groupKey, userId)); return records; } @GuardedBy("mNotificationLock") @NonNull List<NotificationRecord> findGroupNotificationsLocked(String pkg, String groupKey, int userId) { Loading @@ -7059,6 +7069,15 @@ public class NotificationManagerService extends SystemService { return records; } @GuardedBy("mNotificationLock") private NotificationRecord findInCurrentAndSnoozedNotificationByKeyLocked(String key) { NotificationRecord r = findNotificationByKeyLocked(key); if (r == null) { r = mSnoozeHelper.getNotification(key); } return r; } @GuardedBy("mNotificationLock") private @NonNull List<NotificationRecord> findGroupNotificationByListLocked( Loading services/core/java/com/android/server/notification/SnoozeHelper.java +40 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.server.notification; import android.annotation.NonNull; import android.app.AlarmManager; import android.app.Notification; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -104,6 +103,46 @@ public class SnoozeHelper { return Collections.EMPTY_LIST; } @NonNull ArrayList<NotificationRecord> getNotifications(String pkg, String groupKey, Integer userId) { ArrayList<NotificationRecord> records = new ArrayList<>(); if (mSnoozedNotifications.containsKey(userId) && mSnoozedNotifications.get(userId).containsKey(pkg)) { ArrayMap<String, NotificationRecord> packages = mSnoozedNotifications.get(userId).get(pkg); for (int i = 0; i < packages.size(); i++) { String currentGroupKey = packages.valueAt(i).sbn.getGroup(); if (currentGroupKey.equals(groupKey)) { records.add(packages.valueAt(i)); } } } return records; } protected NotificationRecord getNotification(String key) { List<NotificationRecord> snoozedForUser = new ArrayList<>(); IntArray userIds = mUserProfiles.getCurrentProfileIds(); if (userIds != null) { final int userIdsSize = userIds.size(); for (int i = 0; i < userIdsSize; i++) { final ArrayMap<String, ArrayMap<String, NotificationRecord>> snoozedPkgs = mSnoozedNotifications.get(userIds.get(i)); if (snoozedPkgs != null) { final int snoozedPkgsSize = snoozedPkgs.size(); for (int j = 0; j < snoozedPkgsSize; j++) { final ArrayMap<String, NotificationRecord> records = snoozedPkgs.valueAt(j); if (records != null) { return records.get(key); } } } } } return null; } protected @NonNull List<NotificationRecord> getSnoozed() { List<NotificationRecord> snoozedForUser = new ArrayList<>(); IntArray userIds = mUserProfiles.getCurrentProfileIds(); Loading services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +67 −0 Original line number Diff line number Diff line Loading @@ -2004,6 +2004,73 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertFalse(mService.hasCompanionDevice(mListener)); } @Test public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() throws Exception { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, null, true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); 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 verify(mSnoozeHelper, times(2)).snooze(any(NotificationRecord.class), anyLong()); } @Test public void testSnoozeRunnable_reSnoozeASnoozedNotificationWithGroupKey() throws Exception { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); 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 verify(mSnoozeHelper, times(2)).snooze(any(NotificationRecord.class), anyLong()); } @Test public void testSnoozeRunnable_reSnoozeMultipleNotificationsWithGroupKey() throws Exception { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); final NotificationRecord notification2 = generateNotificationRecord( mTestNotificationChannel, 2, "group", true); mService.addNotification(notification); mService.addNotification(notification2); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.getNotifications( anyString(), anyString(), anyInt())).thenReturn(new ArrayList<>()); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); when(mSnoozeHelper.getNotifications(anyString(), anyString(), anyInt())) .thenReturn(new ArrayList<>(Arrays.asList(notification, notification2))); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); // snooze twice verify(mSnoozeHelper, times(4)).snooze(any(NotificationRecord.class), anyLong()); } @Test public void testSnoozeRunnable_snoozeNonGrouped() throws Exception { final NotificationRecord nonGrouped = generateNotificationRecord( Loading services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +57 −0 Original line number Diff line number Diff line Loading @@ -263,6 +263,63 @@ public class SnoozeHelperTest extends UiServiceTestCase { assertEquals(4, mSnoozeHelper.getSnoozed().size()); } @Test public void testGetSnoozedGroupNotifications() throws Exception { IntArray profileIds = new IntArray(); profileIds.add(UserHandle.USER_CURRENT); when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds); NotificationRecord r = getNotificationRecord("pkg", 1, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r2 = getNotificationRecord("pkg", 2, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r3 = getNotificationRecord("pkg2", 3, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r4 = getNotificationRecord("pkg2", 4, "tag", UserHandle.CURRENT, "group", true); mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(r2, 1000); mSnoozeHelper.snooze(r3, 1000); mSnoozeHelper.snooze(r4, 1000); assertEquals(2, mSnoozeHelper.getNotifications("pkg", "group", UserHandle.USER_CURRENT).size()); } @Test public void testGetSnoozedNotificationByKey() throws Exception { IntArray profileIds = new IntArray(); profileIds.add(UserHandle.USER_CURRENT); when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds); NotificationRecord r = getNotificationRecord("pkg", 1, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r2 = getNotificationRecord("pkg", 2, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r3 = getNotificationRecord("pkg2", 3, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r4 = getNotificationRecord("pkg2", 4, "tag", UserHandle.CURRENT, "group", true); mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(r2, 1000); mSnoozeHelper.snooze(r3, 1000); mSnoozeHelper.snooze(r4, 1000); assertEquals(r, mSnoozeHelper.getNotification(r.getKey())); } @Test public void testGetUnSnoozedNotificationByKey() throws Exception { IntArray profileIds = new IntArray(); profileIds.add(UserHandle.USER_CURRENT); when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds); NotificationRecord r = getNotificationRecord("pkg", 1, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r2 = getNotificationRecord("pkg", 2, "tag", UserHandle.CURRENT, "group", true); mSnoozeHelper.snooze(r2, 1000); assertEquals(null, mSnoozeHelper.getNotification(r.getKey())); } @Test public void repostGroupSummary_onlyFellowGroupChildren() throws Exception { NotificationRecord r = getNotificationRecord( Loading Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +32 −13 Original line number Diff line number Diff line Loading @@ -5229,7 +5229,7 @@ public class NotificationManagerService extends SystemService { @Override public void run() { synchronized (mNotificationLock) { final NotificationRecord r = findNotificationByKeyLocked(mKey); final NotificationRecord r = findInCurrentAndSnoozedNotificationByKeyLocked(mKey); if (r != null) { snoozeLocked(r); } Loading @@ -5239,34 +5239,35 @@ public class NotificationManagerService extends SystemService { @GuardedBy("mNotificationLock") void snoozeLocked(NotificationRecord r) { if (r.sbn.isGroup()) { final List<NotificationRecord> groupNotifications = findGroupNotificationsLocked( final List<NotificationRecord> groupNotifications = findCurrentAndSnoozedGroupNotificationsLocked( r.sbn.getPackageName(), r.sbn.getGroupKey(), r.sbn.getUserId()); if (r.getNotification().isGroupSummary()) { // snooze summary and all children // snooze all children for (int i = 0; i < groupNotifications.size(); i++) { if (mKey != groupNotifications.get(i).getKey()) { snoozeNotificationLocked(groupNotifications.get(i)); } } } else { // if there is a valid summary for this group, and we are snoozing the only // child, also snooze the summary if (mSummaryByGroupKey.containsKey(r.sbn.getGroupKey())) { if (groupNotifications.size() != 2) { snoozeNotificationLocked(r); } else { 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)); } } } else { snoozeNotificationLocked(r); } } } else { // just snooze the one notification snoozeNotificationLocked(r); } } // snooze the notification snoozeNotificationLocked(r); } @GuardedBy("mNotificationLock") void snoozeNotificationLocked(NotificationRecord r) { Loading Loading @@ -7049,6 +7050,15 @@ public class NotificationManagerService extends SystemService { } } @GuardedBy("mNotificationLock") @NonNull List<NotificationRecord> findCurrentAndSnoozedGroupNotificationsLocked(String pkg, String groupKey, int userId) { List<NotificationRecord> records = mSnoozeHelper.getNotifications(pkg, groupKey, userId); records.addAll(findGroupNotificationsLocked(pkg, groupKey, userId)); return records; } @GuardedBy("mNotificationLock") @NonNull List<NotificationRecord> findGroupNotificationsLocked(String pkg, String groupKey, int userId) { Loading @@ -7059,6 +7069,15 @@ public class NotificationManagerService extends SystemService { return records; } @GuardedBy("mNotificationLock") private NotificationRecord findInCurrentAndSnoozedNotificationByKeyLocked(String key) { NotificationRecord r = findNotificationByKeyLocked(key); if (r == null) { r = mSnoozeHelper.getNotification(key); } return r; } @GuardedBy("mNotificationLock") private @NonNull List<NotificationRecord> findGroupNotificationByListLocked( Loading
services/core/java/com/android/server/notification/SnoozeHelper.java +40 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.server.notification; import android.annotation.NonNull; import android.app.AlarmManager; import android.app.Notification; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -104,6 +103,46 @@ public class SnoozeHelper { return Collections.EMPTY_LIST; } @NonNull ArrayList<NotificationRecord> getNotifications(String pkg, String groupKey, Integer userId) { ArrayList<NotificationRecord> records = new ArrayList<>(); if (mSnoozedNotifications.containsKey(userId) && mSnoozedNotifications.get(userId).containsKey(pkg)) { ArrayMap<String, NotificationRecord> packages = mSnoozedNotifications.get(userId).get(pkg); for (int i = 0; i < packages.size(); i++) { String currentGroupKey = packages.valueAt(i).sbn.getGroup(); if (currentGroupKey.equals(groupKey)) { records.add(packages.valueAt(i)); } } } return records; } protected NotificationRecord getNotification(String key) { List<NotificationRecord> snoozedForUser = new ArrayList<>(); IntArray userIds = mUserProfiles.getCurrentProfileIds(); if (userIds != null) { final int userIdsSize = userIds.size(); for (int i = 0; i < userIdsSize; i++) { final ArrayMap<String, ArrayMap<String, NotificationRecord>> snoozedPkgs = mSnoozedNotifications.get(userIds.get(i)); if (snoozedPkgs != null) { final int snoozedPkgsSize = snoozedPkgs.size(); for (int j = 0; j < snoozedPkgsSize; j++) { final ArrayMap<String, NotificationRecord> records = snoozedPkgs.valueAt(j); if (records != null) { return records.get(key); } } } } } return null; } protected @NonNull List<NotificationRecord> getSnoozed() { List<NotificationRecord> snoozedForUser = new ArrayList<>(); IntArray userIds = mUserProfiles.getCurrentProfileIds(); Loading
services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +67 −0 Original line number Diff line number Diff line Loading @@ -2004,6 +2004,73 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { assertFalse(mService.hasCompanionDevice(mListener)); } @Test public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() throws Exception { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, null, true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); 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 verify(mSnoozeHelper, times(2)).snooze(any(NotificationRecord.class), anyLong()); } @Test public void testSnoozeRunnable_reSnoozeASnoozedNotificationWithGroupKey() throws Exception { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); mService.addNotification(notification); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); 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 verify(mSnoozeHelper, times(2)).snooze(any(NotificationRecord.class), anyLong()); } @Test public void testSnoozeRunnable_reSnoozeMultipleNotificationsWithGroupKey() throws Exception { final NotificationRecord notification = generateNotificationRecord( mTestNotificationChannel, 1, "group", true); final NotificationRecord notification2 = generateNotificationRecord( mTestNotificationChannel, 2, "group", true); mService.addNotification(notification); mService.addNotification(notification2); when(mSnoozeHelper.getNotification(any())).thenReturn(notification); when(mSnoozeHelper.getNotifications( anyString(), anyString(), anyInt())).thenReturn(new ArrayList<>()); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); when(mSnoozeHelper.getNotifications(anyString(), anyString(), anyInt())) .thenReturn(new ArrayList<>(Arrays.asList(notification, notification2))); NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 = mService.new SnoozeNotificationRunnable( notification.getKey(), 100, null); snoozeNotificationRunnable.run(); // snooze twice verify(mSnoozeHelper, times(4)).snooze(any(NotificationRecord.class), anyLong()); } @Test public void testSnoozeRunnable_snoozeNonGrouped() throws Exception { final NotificationRecord nonGrouped = generateNotificationRecord( Loading
services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +57 −0 Original line number Diff line number Diff line Loading @@ -263,6 +263,63 @@ public class SnoozeHelperTest extends UiServiceTestCase { assertEquals(4, mSnoozeHelper.getSnoozed().size()); } @Test public void testGetSnoozedGroupNotifications() throws Exception { IntArray profileIds = new IntArray(); profileIds.add(UserHandle.USER_CURRENT); when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds); NotificationRecord r = getNotificationRecord("pkg", 1, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r2 = getNotificationRecord("pkg", 2, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r3 = getNotificationRecord("pkg2", 3, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r4 = getNotificationRecord("pkg2", 4, "tag", UserHandle.CURRENT, "group", true); mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(r2, 1000); mSnoozeHelper.snooze(r3, 1000); mSnoozeHelper.snooze(r4, 1000); assertEquals(2, mSnoozeHelper.getNotifications("pkg", "group", UserHandle.USER_CURRENT).size()); } @Test public void testGetSnoozedNotificationByKey() throws Exception { IntArray profileIds = new IntArray(); profileIds.add(UserHandle.USER_CURRENT); when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds); NotificationRecord r = getNotificationRecord("pkg", 1, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r2 = getNotificationRecord("pkg", 2, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r3 = getNotificationRecord("pkg2", 3, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r4 = getNotificationRecord("pkg2", 4, "tag", UserHandle.CURRENT, "group", true); mSnoozeHelper.snooze(r, 1000); mSnoozeHelper.snooze(r2, 1000); mSnoozeHelper.snooze(r3, 1000); mSnoozeHelper.snooze(r4, 1000); assertEquals(r, mSnoozeHelper.getNotification(r.getKey())); } @Test public void testGetUnSnoozedNotificationByKey() throws Exception { IntArray profileIds = new IntArray(); profileIds.add(UserHandle.USER_CURRENT); when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds); NotificationRecord r = getNotificationRecord("pkg", 1, "tag", UserHandle.CURRENT, "group", true); NotificationRecord r2 = getNotificationRecord("pkg", 2, "tag", UserHandle.CURRENT, "group", true); mSnoozeHelper.snooze(r2, 1000); assertEquals(null, mSnoozeHelper.getNotification(r.getKey())); } @Test public void repostGroupSummary_onlyFellowGroupChildren() throws Exception { NotificationRecord r = getNotificationRecord( Loading