diff options
author | Julia Reynolds <juliacr@google.com> | 2017-07-13 11:23:12 -0400 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-08-23 18:44:44 +0000 |
commit | 1bcbd6e6d513436c01d5a5721b8368662cd5c14f (patch) | |
tree | 634126d9b3ccaa908572c0fb5b1579616d1d4961 | |
parent | 149289c7971f29a74a1442ad7b3466a315e2c274 (diff) | |
download | base-1bcbd6e6d513436c01d5a5721b8368662cd5c14f.tar.gz |
Fix nomanservice notificationrecord leak
Test: runtest systemui-notification
Change-Id: Ic5761b917edd000bf73b3291b0ca95bbb0b9bedb
Fixes: 63585648
(cherry picked from commit 080361ee313c4eae07ca1d17edafb371672fc76e)
(cherry picked from commit 61e1f496e86ae94fc522b421afc0ac8c695afc2d)
2 files changed, 74 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index bdea24704ef5..c3f9dc96c67b 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -519,7 +519,8 @@ public class NotificationManagerService extends SystemService { } } - private final NotificationDelegate mNotificationDelegate = new NotificationDelegate() { + @VisibleForTesting + final NotificationDelegate mNotificationDelegate = new NotificationDelegate() { @Override public void onSetDisabled(int status) { @@ -1011,6 +1012,25 @@ public class NotificationManagerService extends SystemService { } @VisibleForTesting + int getNotificationRecordCount() { + synchronized (mNotificationLock) { + int count = mNotificationList.size() + mNotificationsByKey.size() + + mSummaryByGroupKey.size() + mEnqueuedNotifications.size(); + // subtract duplicates + for (NotificationRecord posted : mNotificationList) { + if (mNotificationsByKey.containsKey(posted.getKey())) { + count--; + } + if (posted.sbn.isGroup() && posted.getNotification().isGroupSummary()) { + count --; + } + } + + return count; + } + } + + @VisibleForTesting void addNotification(NotificationRecord r) { mNotificationList.add(r); mNotificationsByKey.put(r.sbn.getKey(), r); @@ -4506,6 +4526,7 @@ public class NotificationManagerService extends SystemService { canceledNotifications = new ArrayList<>(); } notificationList.remove(i); + mNotificationsByKey.remove(r.getKey()); canceledNotifications.add(r); cancelNotificationLocked(r, sendDelete, reason, wasPosted); } @@ -4615,6 +4636,7 @@ public class NotificationManagerService extends SystemService { EventLogTags.writeNotificationCancel(callingUid, callingPid, pkg, childSbn.getId(), childSbn.getTag(), userId, 0, 0, reason, listenerName); notificationList.remove(i); + mNotificationsByKey.remove(childR.getKey()); cancelNotificationLocked(childR, sendDelete, reason, wasPosted); } } diff --git a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java index 46c536c76d46..d7815a282d17 100644 --- a/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -302,9 +302,9 @@ public class NotificationManagerServiceTest extends NotificationTestCase { mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", 0, generateNotificationRecord(null).getNotification(), 0); waitForIdle(); - StatusBarNotification[] notifs = - mBinderService.getActiveNotifications(PKG); + StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG); assertEquals(1, notifs.length); + assertEquals(1, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -316,6 +316,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG); assertEquals(0, notifs.length); + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -330,6 +331,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { StatusBarNotification[] notifs = mBinderService.getActiveNotifications(PKG); assertEquals(0, notifs.length); + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -342,6 +344,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { StatusBarNotification[] notifs = mBinderService.getActiveNotifications(sbn.getPackageName()); assertEquals(0, notifs.length); + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -354,6 +357,43 @@ public class NotificationManagerServiceTest extends NotificationTestCase { StatusBarNotification[] notifs = mBinderService.getActiveNotifications(sbn.getPackageName()); assertEquals(0, notifs.length); + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); + } + + @Test + public void testUserInitiatedClearAll_noLeak() throws Exception { + final NotificationRecord n = generateNotificationRecord( + mTestNotificationChannel, 1, "group", true); + + mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", + n.sbn.getId(), n.sbn.getNotification(), n.sbn.getUserId()); + waitForIdle(); + + mNotificationManagerService.mNotificationDelegate.onClearAll(uid, Binder.getCallingPid(), + n.getUserId()); + waitForIdle(); + StatusBarNotification[] notifs = + mBinderService.getActiveNotifications(n.sbn.getPackageName()); + assertEquals(0, notifs.length); + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); + } + + @Test + public void testCancelAllNotificationsCancelsChildren() throws Exception { + final NotificationRecord parent = generateNotificationRecord( + mTestNotificationChannel, 1, "group1", true); + final NotificationRecord child = generateNotificationRecord( + mTestNotificationChannel, 2, "group1", false); + + mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", + parent.sbn.getId(), parent.sbn.getNotification(), parent.sbn.getUserId()); + mBinderService.enqueueNotificationWithTag(PKG, "opPkg", "tag", + child.sbn.getId(), child.sbn.getNotification(), child.sbn.getUserId()); + waitForIdle(); + + mBinderService.cancelAllNotifications(PKG, parent.sbn.getUserId()); + waitForIdle(); + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -365,6 +405,8 @@ public class NotificationManagerServiceTest extends NotificationTestCase { } mBinderService.cancelAllNotifications(PKG, sbn.getUserId()); waitForIdle(); + + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -391,6 +433,8 @@ public class NotificationManagerServiceTest extends NotificationTestCase { parentAsChild.sbn.getId(), parentAsChild.sbn.getNotification(), parentAsChild.sbn.getUserId()); waitForIdle(); + + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -404,6 +448,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { StatusBarNotification[] notifs = mBinderService.getActiveNotifications(sbn.getPackageName()); assertEquals(1, notifs.length); + assertEquals(1, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -417,6 +462,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { StatusBarNotification[] notifs = mBinderService.getActiveNotifications(sbn.getPackageName()); assertEquals(1, notifs.length); + assertEquals(1, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -429,6 +475,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { StatusBarNotification[] notifs = mBinderService.getActiveNotifications(sbn.getPackageName()); assertEquals(0, notifs.length); + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -442,6 +489,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { StatusBarNotification[] notifs = mBinderService.getActiveNotifications(sbn.getPackageName()); assertEquals(1, notifs.length); + assertEquals(1, mNotificationManagerService.getNotificationRecordCount()); } @Test @@ -471,6 +519,7 @@ public class NotificationManagerServiceTest extends NotificationTestCase { mBinderService.cancelNotificationWithTag(PKG, "tag", sbn.getId(), sbn.getUserId()); waitForIdle(); assertEquals(0, mBinderService.getActiveNotifications(sbn.getPackageName()).length); + assertEquals(0, mNotificationManagerService.getNotificationRecordCount()); } @Test |