Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 091126fc authored by Ats Jenk's avatar Ats Jenk
Browse files

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
parent d7f99f6c
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -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();
        }

+17 −5
Original line number Diff line number Diff line
@@ -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();
    }

+31 −1
Original line number Diff line number Diff line
@@ -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);