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
This commit is contained in:
Ats Jenk
2022-12-01 10:03:34 -08:00
parent d7f99f6c63
commit 091126fc7a
3 changed files with 54 additions and 7 deletions

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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:
* <ol>
* <li>device is locked with keyguard on, status bar shade state updates to
* <code>false</code></li>
* <li>notification entry is marked to be a bubble and it is set to auto-expand</li>
* <li>device unlock starts, status bar shade state receives another update to
* <code>false</code></li>
* <li>device is unlocked and status bar shade state is set to <code>true</code></li>
* <li>bubble should be expanded</li>
* </ol>
*/
@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);