summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulia Reynolds <juliacr@google.com>2017-07-13 11:23:12 -0400
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-08-23 18:44:44 +0000
commit1bcbd6e6d513436c01d5a5721b8368662cd5c14f (patch)
tree634126d9b3ccaa908572c0fb5b1579616d1d4961
parent149289c7971f29a74a1442ad7b3466a315e2c274 (diff)
downloadbase-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)
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java24
-rw-r--r--services/tests/notification/src/com/android/server/notification/NotificationManagerServiceTest.java53
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