From 091126fc7aa7c2936ccdd9c9c15549a73ee84884 Mon Sep 17 00:00:00 2001 From: Ats Jenk Date: Thu, 1 Dec 2022 10:03:34 -0800 Subject: [PATCH] Only collapse stack on shade state change Fixes an issue with bubble not being expanded when notification was set to be expanded from lock screen. Setting a notification to bubble from the notification action will add it as a new entry in BubbleData. And that bubble will be set to auto-expand. When a device is locked, BubbleController receives a status bar state change with isShade=false. When a device is unlocked, BubbleController can receive duplicate status bar state changes with isShade=false and will finally receive an update with isShade=true. The isShade=true indicates device is unlocked. Ensure that multiple duplicate status bar state changes to false do not try to re-collapse the stack. As this would clear the expanded state for bubbles that were updated while device was locked. Bug: 260652751 Test: atest BubblesTest Test: manual: 1. have a notification that is not a bubble 2. have pattern lock set and lock device 3. mark notification to be a bubble from lock screen 4. unlock device 5. observe bubble is added and expanded 6. lock device and unlock device again 7. observe stack is now collapsed Change-Id: Ie0fdbbb3cb95c0720a00e7e25deaeb438cc51df3 --- .../wm/shell/bubbles/BubbleController.java | 7 +++- .../row/NotificationTestHelper.java | 22 ++++++++++--- .../android/systemui/wmshell/BubblesTest.java | 32 ++++++++++++++++++- 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index bec6844ae8631..dd8afff0df2cf 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -475,8 +475,13 @@ public class BubbleController implements ConfigurationChangeListener { @VisibleForTesting public void onStatusBarStateChanged(boolean isShade) { + boolean didChange = mIsStatusBarShade != isShade; + if (DEBUG_BUBBLE_CONTROLLER) { + Log.d(TAG, "onStatusBarStateChanged isShade=" + isShade + " didChange=" + didChange); + } mIsStatusBarShade = isShade; - if (!mIsStatusBarShade) { + if (!mIsStatusBarShade && didChange) { + // Only collapse stack on change collapseStack(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java index 5fd9448b129d0..fb31bef909e06 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java @@ -301,7 +301,8 @@ public class NotificationTestHelper { public ExpandableNotificationRow createBubble() throws Exception { Notification n = createNotification(false /* isGroupSummary */, - null /* groupKey */, makeBubbleMetadata(null)); + null /* groupKey */, + makeBubbleMetadata(null /* deleteIntent */, false /* autoExpand */)); n.flags |= FLAG_BUBBLE; ExpandableNotificationRow row = generateRow(n, PKG, UID, USER_HANDLE, mDefaultInflationFlags, IMPORTANCE_HIGH); @@ -334,7 +335,8 @@ public class NotificationTestHelper { public ExpandableNotificationRow createBubbleInGroup() throws Exception { Notification n = createNotification(false /* isGroupSummary */, - GROUP_KEY /* groupKey */, makeBubbleMetadata(null)); + GROUP_KEY /* groupKey */, + makeBubbleMetadata(null /* deleteIntent */, false /* autoExpand */)); n.flags |= FLAG_BUBBLE; ExpandableNotificationRow row = generateRow(n, PKG, UID, USER_HANDLE, mDefaultInflationFlags, IMPORTANCE_HIGH); @@ -350,7 +352,7 @@ public class NotificationTestHelper { * @param deleteIntent the intent to assign to {@link BubbleMetadata#deleteIntent} */ public NotificationEntry createBubble(@Nullable PendingIntent deleteIntent) { - return createBubble(makeBubbleMetadata(deleteIntent), USER_HANDLE); + return createBubble(makeBubbleMetadata(deleteIntent, false /* autoExpand */), USER_HANDLE); } /** @@ -359,7 +361,16 @@ public class NotificationTestHelper { * @param handle the user to associate with this bubble. */ public NotificationEntry createBubble(UserHandle handle) { - return createBubble(makeBubbleMetadata(null), handle); + return createBubble(makeBubbleMetadata(null /* deleteIntent */, false /* autoExpand */), + handle); + } + + /** + * Returns an {@link NotificationEntry} that should be shown as a auto-expanded bubble. + */ + public NotificationEntry createAutoExpandedBubble() { + return createBubble(makeBubbleMetadata(null /* deleteIntent */, true /* autoExpand */), + USER_HANDLE); } /** @@ -567,7 +578,7 @@ public class NotificationTestHelper { assertTrue(countDownLatch.await(500, TimeUnit.MILLISECONDS)); } - private BubbleMetadata makeBubbleMetadata(PendingIntent deleteIntent) { + private BubbleMetadata makeBubbleMetadata(PendingIntent deleteIntent, boolean autoExpand) { Intent target = new Intent(mContext, BubblesTestActivity.class); PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, PendingIntent.FLAG_MUTABLE); @@ -576,6 +587,7 @@ public class NotificationTestHelper { Icon.createWithResource(mContext, R.drawable.android)) .setDeleteIntent(deleteIntent) .setDesiredHeight(314) + .setAutoExpandBubble(autoExpand) .build(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index d42f757e16bdb..b9dfc27483b83 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -1423,13 +1423,43 @@ public class BubblesTest extends SysuiTestCase { assertStackCollapsed(); // Post status bar state change update with the same value mBubbleController.onStatusBarStateChanged(false); - // Stack should remain collapsedb + // Stack should remain collapsed assertStackCollapsed(); // Post status bar state change which should trigger bubble to expand mBubbleController.onStatusBarStateChanged(true); assertStackExpanded(); } + /** + * Test to verify behavior for the following scenario: + *
    + *
  1. device is locked with keyguard on, status bar shade state updates to + * false
  2. + *
  3. notification entry is marked to be a bubble and it is set to auto-expand
  4. + *
  5. device unlock starts, status bar shade state receives another update to + * false
  6. + *
  7. device is unlocked and status bar shade state is set to true
  8. + *
  9. bubble should be expanded
  10. + *
+ */ + @Test + public void testOnStatusBarStateChanged_newAutoExpandedBubbleRemainsExpanded() { + // Set device as locked + mBubbleController.onStatusBarStateChanged(false); + + // Create a auto-expanded bubble + NotificationEntry entry = mNotificationTestHelper.createAutoExpandedBubble(); + mEntryListener.onEntryAdded(entry); + + // When unlocking, we may receive duplicate updates with shade=false, ensure they don't + // clear the expanded state + mBubbleController.onStatusBarStateChanged(false); + mBubbleController.onStatusBarStateChanged(true); + + // After unlocking, stack should be expanded + assertStackExpanded(); + } + @Test public void testSetShouldAutoExpand_notifiesFlagChanged() { mBubbleController.updateBubble(mBubbleEntry);