Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java +4 −1 Original line number Diff line number Diff line Loading @@ -407,7 +407,10 @@ public class PreparationCoordinator implements Coordinator { mLogger.logGroupInflationTookTooLong(group); return false; } if (mInflatingNotifs.contains(group.getSummary())) { // Only delay release if the summary is not inflated. // TODO(253454977): Once we ensure that all other pipeline filtering and pruning has been // done by this point, we can revert back to checking for mInflatingNotifs.contains(...) if (group.getSummary() != null && !isInflated(group.getSummary())) { mLogger.logDelayingGroupRelease(group, group.getSummary()); return true; } Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/GroupEntryBuilder.java +5 −3 Original line number Diff line number Diff line Loading @@ -31,8 +31,8 @@ public class GroupEntryBuilder { private long mCreationTime = 0; @Nullable private GroupEntry mParent = GroupEntry.ROOT_ENTRY; private NotifSection mNotifSection; private NotificationEntry mSummary = null; private List<NotificationEntry> mChildren = new ArrayList<>(); @Nullable private NotificationEntry mSummary = null; private final List<NotificationEntry> mChildren = new ArrayList<>(); /** Builds a new instance of GroupEntry */ public GroupEntry build() { Loading @@ -41,7 +41,9 @@ public class GroupEntryBuilder { ge.getAttachState().setSection(mNotifSection); ge.setSummary(mSummary); if (mSummary != null) { mSummary.setParent(ge); } for (NotificationEntry child : mChildren) { ge.addChild(child); Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java +79 −11 Original line number Diff line number Diff line Loading @@ -181,7 +181,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testInflatesNewNotification() { // WHEN there is a new notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); // THEN we inflate it Loading @@ -194,7 +194,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testRebindsInflatedNotificationsOnUpdate() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), any(), any()); mNotifInflater.invokeInflateCallbackForEntry(mEntry); Loading @@ -213,7 +213,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testEntrySmartReplyAdditionWillRebindViews() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), any(), any()); mNotifInflater.invokeInflateCallbackForEntry(mEntry); Loading @@ -232,7 +232,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testEntryChangedToMinimizedSectionWillRebindViews() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), mParamsCaptor.capture(), any()); assertFalse(mParamsCaptor.getValue().isLowPriority()); Loading @@ -254,7 +254,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { public void testMinimizedEntryMovedIntoGroupWillRebindViews() { // GIVEN an inflated, minimized notification setSectionIsLowPriority(true); mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), mParamsCaptor.capture(), any()); assertTrue(mParamsCaptor.getValue().isLowPriority()); Loading @@ -275,7 +275,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testEntryRankChangeWillNotRebindViews() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), any(), any()); mNotifInflater.invokeInflateCallbackForEntry(mEntry); Loading @@ -294,7 +294,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testDoesntFilterInflatedNotifs() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), any(), any()); mNotifInflater.invokeInflateCallbackForEntry(mEntry); Loading Loading @@ -330,9 +330,9 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mCollectionListener.onEntryInit(entry); } mCollectionListener.onEntryAdded(summary); mCollectionListener.onEntryInit(summary); for (NotificationEntry entry : children) { mCollectionListener.onEntryAdded(entry); mCollectionListener.onEntryInit(entry); } mBeforeFilterListener.onBeforeFinalizeFilter(List.of(groupEntry)); Loading Loading @@ -392,6 +392,70 @@ public class PreparationCoordinatorTest extends SysuiTestCase { assertTrue(mUninflatedFilter.shouldFilterOut(child1, 401)); } @Test public void testNullGroupSummary() { // GIVEN a newly-posted group with a summary and two children final GroupEntry group = new GroupEntryBuilder() .setCreationTime(400) .setSummary(getNotificationEntryBuilder().setId(1).build()) .addChild(getNotificationEntryBuilder().setId(2).build()) .addChild(getNotificationEntryBuilder().setId(3).build()) .build(); fireAddEvents(List.of(group)); final NotificationEntry child0 = group.getChildren().get(0); final NotificationEntry child1 = group.getChildren().get(1); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(group)); // WHEN the summary is pruned new GroupEntryBuilder() .setCreationTime(400) .addChild(child0) .addChild(child1) .build(); // WHEN all of the children (but not the summary) finish inflating mNotifInflater.invokeInflateCallbackForEntry(child0); mNotifInflater.invokeInflateCallbackForEntry(child1); // THEN the entire group is not filtered out assertFalse(mUninflatedFilter.shouldFilterOut(child0, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child1, 401)); } @Test public void testPartiallyInflatedGroupsAreNotFilteredOutIfSummaryReinflate() { // GIVEN a newly-posted group with a summary and two children final String groupKey = "test_reinflate_group"; final int summaryId = 1; final GroupEntry group = new GroupEntryBuilder() .setKey(groupKey) .setCreationTime(400) .setSummary(getNotificationEntryBuilder().setId(summaryId).setImportance(1).build()) .addChild(getNotificationEntryBuilder().setId(2).build()) .addChild(getNotificationEntryBuilder().setId(3).build()) .build(); fireAddEvents(List.of(group)); final NotificationEntry summary = group.getSummary(); final NotificationEntry child0 = group.getChildren().get(0); final NotificationEntry child1 = group.getChildren().get(1); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(group)); // WHEN all of the children (but not the summary) finish inflating mNotifInflater.invokeInflateCallbackForEntry(child0); mNotifInflater.invokeInflateCallbackForEntry(child1); mNotifInflater.invokeInflateCallbackForEntry(summary); // WHEN the summary is updated and starts re-inflating summary.setRanking(new RankingBuilder(summary.getRanking()).setImportance(4).build()); fireUpdateEvents(summary); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(group)); // THEN the entire group is still not filtered out assertFalse(mUninflatedFilter.shouldFilterOut(summary, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child0, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child1, 401)); } @Test public void testCompletedInflatedGroupsAreReleased() { // GIVEN a newly-posted group with a summary and two children Loading @@ -412,7 +476,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mNotifInflater.invokeInflateCallbackForEntry(child1); mNotifInflater.invokeInflateCallbackForEntry(summary); // THEN the entire group is still filtered out // THEN the entire group is no longer filtered out assertFalse(mUninflatedFilter.shouldFilterOut(summary, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child0, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child1, 401)); Loading Loading @@ -494,7 +558,11 @@ public class PreparationCoordinatorTest extends SysuiTestCase { private void fireAddEvents(NotificationEntry entry) { mCollectionListener.onEntryInit(entry); mCollectionListener.onEntryAdded(entry); mCollectionListener.onEntryInit(entry); } private void fireUpdateEvents(NotificationEntry entry) { mCollectionListener.onEntryUpdated(entry); } private static final String TEST_MESSAGE = "TEST_MESSAGE"; Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java +4 −1 Original line number Diff line number Diff line Loading @@ -407,7 +407,10 @@ public class PreparationCoordinator implements Coordinator { mLogger.logGroupInflationTookTooLong(group); return false; } if (mInflatingNotifs.contains(group.getSummary())) { // Only delay release if the summary is not inflated. // TODO(253454977): Once we ensure that all other pipeline filtering and pruning has been // done by this point, we can revert back to checking for mInflatingNotifs.contains(...) if (group.getSummary() != null && !isInflated(group.getSummary())) { mLogger.logDelayingGroupRelease(group, group.getSummary()); return true; } Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/GroupEntryBuilder.java +5 −3 Original line number Diff line number Diff line Loading @@ -31,8 +31,8 @@ public class GroupEntryBuilder { private long mCreationTime = 0; @Nullable private GroupEntry mParent = GroupEntry.ROOT_ENTRY; private NotifSection mNotifSection; private NotificationEntry mSummary = null; private List<NotificationEntry> mChildren = new ArrayList<>(); @Nullable private NotificationEntry mSummary = null; private final List<NotificationEntry> mChildren = new ArrayList<>(); /** Builds a new instance of GroupEntry */ public GroupEntry build() { Loading @@ -41,7 +41,9 @@ public class GroupEntryBuilder { ge.getAttachState().setSection(mNotifSection); ge.setSummary(mSummary); if (mSummary != null) { mSummary.setParent(ge); } for (NotificationEntry child : mChildren) { ge.addChild(child); Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java +79 −11 Original line number Diff line number Diff line Loading @@ -181,7 +181,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testInflatesNewNotification() { // WHEN there is a new notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); // THEN we inflate it Loading @@ -194,7 +194,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testRebindsInflatedNotificationsOnUpdate() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), any(), any()); mNotifInflater.invokeInflateCallbackForEntry(mEntry); Loading @@ -213,7 +213,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testEntrySmartReplyAdditionWillRebindViews() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), any(), any()); mNotifInflater.invokeInflateCallbackForEntry(mEntry); Loading @@ -232,7 +232,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testEntryChangedToMinimizedSectionWillRebindViews() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), mParamsCaptor.capture(), any()); assertFalse(mParamsCaptor.getValue().isLowPriority()); Loading @@ -254,7 +254,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { public void testMinimizedEntryMovedIntoGroupWillRebindViews() { // GIVEN an inflated, minimized notification setSectionIsLowPriority(true); mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), mParamsCaptor.capture(), any()); assertTrue(mParamsCaptor.getValue().isLowPriority()); Loading @@ -275,7 +275,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testEntryRankChangeWillNotRebindViews() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), any(), any()); mNotifInflater.invokeInflateCallbackForEntry(mEntry); Loading @@ -294,7 +294,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test public void testDoesntFilterInflatedNotifs() { // GIVEN an inflated notification mCollectionListener.onEntryAdded(mEntry); mCollectionListener.onEntryInit(mEntry); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(mEntry)); verify(mNotifInflater).inflateViews(eq(mEntry), any(), any()); mNotifInflater.invokeInflateCallbackForEntry(mEntry); Loading Loading @@ -330,9 +330,9 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mCollectionListener.onEntryInit(entry); } mCollectionListener.onEntryAdded(summary); mCollectionListener.onEntryInit(summary); for (NotificationEntry entry : children) { mCollectionListener.onEntryAdded(entry); mCollectionListener.onEntryInit(entry); } mBeforeFilterListener.onBeforeFinalizeFilter(List.of(groupEntry)); Loading Loading @@ -392,6 +392,70 @@ public class PreparationCoordinatorTest extends SysuiTestCase { assertTrue(mUninflatedFilter.shouldFilterOut(child1, 401)); } @Test public void testNullGroupSummary() { // GIVEN a newly-posted group with a summary and two children final GroupEntry group = new GroupEntryBuilder() .setCreationTime(400) .setSummary(getNotificationEntryBuilder().setId(1).build()) .addChild(getNotificationEntryBuilder().setId(2).build()) .addChild(getNotificationEntryBuilder().setId(3).build()) .build(); fireAddEvents(List.of(group)); final NotificationEntry child0 = group.getChildren().get(0); final NotificationEntry child1 = group.getChildren().get(1); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(group)); // WHEN the summary is pruned new GroupEntryBuilder() .setCreationTime(400) .addChild(child0) .addChild(child1) .build(); // WHEN all of the children (but not the summary) finish inflating mNotifInflater.invokeInflateCallbackForEntry(child0); mNotifInflater.invokeInflateCallbackForEntry(child1); // THEN the entire group is not filtered out assertFalse(mUninflatedFilter.shouldFilterOut(child0, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child1, 401)); } @Test public void testPartiallyInflatedGroupsAreNotFilteredOutIfSummaryReinflate() { // GIVEN a newly-posted group with a summary and two children final String groupKey = "test_reinflate_group"; final int summaryId = 1; final GroupEntry group = new GroupEntryBuilder() .setKey(groupKey) .setCreationTime(400) .setSummary(getNotificationEntryBuilder().setId(summaryId).setImportance(1).build()) .addChild(getNotificationEntryBuilder().setId(2).build()) .addChild(getNotificationEntryBuilder().setId(3).build()) .build(); fireAddEvents(List.of(group)); final NotificationEntry summary = group.getSummary(); final NotificationEntry child0 = group.getChildren().get(0); final NotificationEntry child1 = group.getChildren().get(1); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(group)); // WHEN all of the children (but not the summary) finish inflating mNotifInflater.invokeInflateCallbackForEntry(child0); mNotifInflater.invokeInflateCallbackForEntry(child1); mNotifInflater.invokeInflateCallbackForEntry(summary); // WHEN the summary is updated and starts re-inflating summary.setRanking(new RankingBuilder(summary.getRanking()).setImportance(4).build()); fireUpdateEvents(summary); mBeforeFilterListener.onBeforeFinalizeFilter(List.of(group)); // THEN the entire group is still not filtered out assertFalse(mUninflatedFilter.shouldFilterOut(summary, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child0, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child1, 401)); } @Test public void testCompletedInflatedGroupsAreReleased() { // GIVEN a newly-posted group with a summary and two children Loading @@ -412,7 +476,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mNotifInflater.invokeInflateCallbackForEntry(child1); mNotifInflater.invokeInflateCallbackForEntry(summary); // THEN the entire group is still filtered out // THEN the entire group is no longer filtered out assertFalse(mUninflatedFilter.shouldFilterOut(summary, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child0, 401)); assertFalse(mUninflatedFilter.shouldFilterOut(child1, 401)); Loading Loading @@ -494,7 +558,11 @@ public class PreparationCoordinatorTest extends SysuiTestCase { private void fireAddEvents(NotificationEntry entry) { mCollectionListener.onEntryInit(entry); mCollectionListener.onEntryAdded(entry); mCollectionListener.onEntryInit(entry); } private void fireUpdateEvents(NotificationEntry entry) { mCollectionListener.onEntryUpdated(entry); } private static final String TEST_MESSAGE = "TEST_MESSAGE"; Loading