Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c326690 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix nomanservice notificationrecord leak" into oc-dev

parents 6df58d8d 61e1f496
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -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) {
@@ -1010,6 +1011,25 @@ public class NotificationManagerService extends SystemService {
        mScreenOn = on;
    }

    @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);
@@ -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);
            }
        }
+51 −2
Original line number Diff line number Diff line
@@ -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