diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index f1cb783742bbd..d2517774ab2ee 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -440,6 +440,10 @@ public class NotificationEntryManager implements mLogger.logLifetimeExtended(key, extender.getClass().getName(), "pending"); } } + if (!lifetimeExtended) { + // At this point, we are guaranteed the notification will be removed + mAllNotifications.remove(pendingEntry); + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index 972357e960ef7..bb7f73a3a9596 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -26,6 +26,7 @@ import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -93,6 +94,7 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -260,6 +262,19 @@ public class NotificationEntryManagerTest extends SysuiTestCase { assertNull(mEntryManager.getActiveNotificationUnfiltered(mSbn.getKey())); } + @Test + public void testRemoveUninflatedNotification_removesNotificationFromAllNotifsList() { + // GIVEN an uninflated entry is added + mEntryManager.addNotification(mSbn, mRankingMap); + assertTrue(entriesContainKey(mEntryManager.getAllNotifs(), mSbn.getKey())); + + // WHEN the uninflated entry is removed + mEntryManager.performRemoveNotification(mSbn, UNDEFINED_DISMISS_REASON); + + // THEN the entry is still removed from the allNotifications list + assertFalse(entriesContainKey(mEntryManager.getAllNotifs(), mSbn.getKey())); + } + @Test public void testRemoveNotification_onEntryRemoveNotFiredIfEntryDoesntExist() { @@ -545,6 +560,15 @@ public class NotificationEntryManagerTest extends SysuiTestCase { /* End annex */ + private boolean entriesContainKey(Collection entries, String key) { + for (NotificationEntry entry : entries) { + if (entry.getSbn().getKey().equals(key)) { + return true; + } + } + return false; + } + private Notification.Action createAction() { return new Notification.Action.Builder( Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon),