diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java index 5993f1dee3a7d..c29905bc70089 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java @@ -384,9 +384,9 @@ public class NotificationGroupManagerLegacy implements // * Only necessary when all notifications in the group use GROUP_ALERT_SUMMARY // * Only necessary when at least one notification in the group is on a priority channel if (group.summary.getSbn().getNotification().getGroupAlertBehavior() - != Notification.GROUP_ALERT_SUMMARY) { + == Notification.GROUP_ALERT_CHILDREN) { if (SPEW) { - Log.d(TAG, "getPriorityConversationAlertOverride: summary != GROUP_ALERT_SUMMARY"); + Log.d(TAG, "getPriorityConversationAlertOverride: summary == GROUP_ALERT_CHILDREN"); } return null; } @@ -529,8 +529,10 @@ public class NotificationGroupManagerLegacy implements mIsolatedEntries.put(entry.getKey(), entry.getSbn()); if (groupKeysChanged) { updateSuppression(mGroupMap.get(oldGroupKey)); - updateSuppression(mGroupMap.get(newGroupKey)); } + // Always update the suppression of the group from which you're isolated, in case + // this entry was or now is the alertOverride for that group. + updateSuppression(mGroupMap.get(newGroupKey)); } else if (!wasGroupChild && isGroupChild) { onEntryBecomingChild(entry); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 73a48c3b5cb06..c14e2f96320cd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -130,6 +130,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable public static final float BACKGROUND_ALPHA_DIMMED = 0.7f; private static final String TAG = "StackScroller"; + private static final boolean SPEW = Log.isLoggable(TAG, Log.VERBOSE); // Usage: // adb shell setprop persist.debug.nssl true && adb reboot @@ -3156,6 +3157,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable AnimationEvent event = new AnimationEvent(row, type); event.headsUpFromBottom = onBottom; mAnimationEvents.add(event); + if (SPEW) { + Log.v(TAG, "Generating HUN animation event: " + + " isHeadsUp=" + isHeadsUp + + " type=" + type + + " onBottom=" + onBottom + + " row=" + row.getEntry().getKey()); + } } mHeadsUpChangeAnimations.clear(); mAddedHeadsUpChildren.clear(); @@ -4679,7 +4687,22 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) public void generateHeadsUpAnimation(ExpandableNotificationRow row, boolean isHeadsUp) { - if (mAnimationsEnabled && (isHeadsUp || mHeadsUpGoingAwayAnimationsAllowed)) { + final boolean add = mAnimationsEnabled && (isHeadsUp || mHeadsUpGoingAwayAnimationsAllowed); + if (SPEW) { + Log.v(TAG, "generateHeadsUpAnimation:" + + " willAdd=" + add + + " isHeadsUp=" + isHeadsUp + + " row=" + row.getEntry().getKey()); + } + if (add) { + // If we're hiding a HUN we just started showing THIS FRAME, then remove that event, + // and do not add the disappear event either. + if (!isHeadsUp && mHeadsUpChangeAnimations.remove(new Pair<>(row, true))) { + if (SPEW) { + Log.v(TAG, "generateHeadsUpAnimation: previous hun appear animation cancelled"); + } + return; + } mHeadsUpChangeAnimations.add(new Pair<>(row, isHeadsUp)); mNeedsAnimation = true; if (!mIsExpanded && !mWillExpand && !isHeadsUp) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerLegacyTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerLegacyTest.java index 1be27da27d258..6d170b673cc3d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerLegacyTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerLegacyTest.java @@ -177,21 +177,69 @@ public class NotificationGroupManagerLegacyTest extends SysuiTestCase { helpTestAlertOverrideWithSiblings(2); } + /** + * Helper for testing various sibling counts + */ + private void helpTestAlertOverrideWithSiblings(int numSiblings) { + helpTestAlertOverride( + /* numSiblings */ numSiblings, + /* summaryAlert */ Notification.GROUP_ALERT_SUMMARY, + /* childAlert */ Notification.GROUP_ALERT_SUMMARY, + /* siblingAlert */ Notification.GROUP_ALERT_SUMMARY, + /* expectAlertOverride */ true); + } + + @Test + public void testAlertOverrideWithParentAlertAll() { + // tests that summary can have GROUP_ALERT_ALL and this still works + helpTestAlertOverride( + /* numSiblings */ 1, + /* summaryAlert */ Notification.GROUP_ALERT_ALL, + /* childAlert */ Notification.GROUP_ALERT_SUMMARY, + /* siblingAlert */ Notification.GROUP_ALERT_SUMMARY, + /* expectAlertOverride */ true); + } + + @Test + public void testAlertOverrideWithParentAlertChild() { + // Tests that if the summary alerts CHILDREN, there's no alertOverride + helpTestAlertOverride( + /* numSiblings */ 1, + /* summaryAlert */ Notification.GROUP_ALERT_CHILDREN, + /* childAlert */ Notification.GROUP_ALERT_SUMMARY, + /* siblingAlert */ Notification.GROUP_ALERT_SUMMARY, + /* expectAlertOverride */ false); + } + + @Test + public void testAlertOverrideWithChildrenAlertAll() { + // Tests that if the children alert ALL, there's no alertOverride + helpTestAlertOverride( + /* numSiblings */ 1, + /* summaryAlert */ Notification.GROUP_ALERT_SUMMARY, + /* childAlert */ Notification.GROUP_ALERT_ALL, + /* siblingAlert */ Notification.GROUP_ALERT_ALL, + /* expectAlertOverride */ false); + } + /** * This tests, for a group with a priority entry and the given number of siblings, that: * 1) the priority entry is identified as the alertOverride for the group * 2) the onAlertOverrideChanged method is called at that time * 3) when the priority entry is removed, these are reversed */ - private void helpTestAlertOverrideWithSiblings(int numSiblings) { - int groupAlert = Notification.GROUP_ALERT_SUMMARY; + private void helpTestAlertOverride(int numSiblings, + @Notification.GroupAlertBehavior int summaryAlert, + @Notification.GroupAlertBehavior int childAlert, + @Notification.GroupAlertBehavior int siblingAlert, + boolean expectAlertOverride) { // Create entries in an order so that the priority entry can be deemed the newest child. NotificationEntry[] siblings = new NotificationEntry[numSiblings]; for (int i = 0; i < numSiblings; i++) { - siblings[i] = mGroupTestHelper.createChildNotification(groupAlert); + siblings[i] = mGroupTestHelper.createChildNotification(siblingAlert); } - NotificationEntry priorityEntry = mGroupTestHelper.createChildNotification(groupAlert); - NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification(groupAlert); + NotificationEntry priorityEntry = mGroupTestHelper.createChildNotification(childAlert); + NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification(summaryAlert); // The priority entry is an important conversation. when(mPeopleNotificationIdentifier.getPeopleNotificationType(eq(priorityEntry))) @@ -208,6 +256,14 @@ public class NotificationGroupManagerLegacyTest extends SysuiTestCase { } mGroupManager.onEntryAdded(priorityEntry); + if (!expectAlertOverride) { + // Test expectation is that there will NOT be an alert, so verify that! + NotificationGroup summaryGroup = + mGroupManager.getGroupForSummary(summaryEntry.getSbn()); + assertNull(summaryGroup.alertOverride); + return; + } + // Verify that the summary group has the priority child as its alertOverride NotificationGroup summaryGroup = mGroupManager.getGroupForSummary(summaryEntry.getSbn()); assertEquals(priorityEntry, summaryGroup.alertOverride);