diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java index 4c149ddd3939a..a1393cddc9f63 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleData.java @@ -120,6 +120,7 @@ public class BubbleData { /** Bubbles that are being loaded but haven't been added to the stack just yet. */ private final List mPendingBubbles; private Bubble mSelectedBubble; + private boolean mShowingOverflow; private boolean mExpanded; private final int mMaxBubbles; private final int mMaxOverflowBubbles; @@ -215,6 +216,10 @@ public class BubbleData { dispatchPendingChanges(); } + void setShowingOverflow(boolean showingOverflow) { + mShowingOverflow = showingOverflow; + } + private void moveOverflowBubbleToPending(Bubble b) { // Preserve new order for next repack, which sorts by last updated time. b.markUpdatedAt(mTimeSource.currentTimeMillis()); @@ -513,9 +518,11 @@ public class BubbleData { if (DEBUG_BUBBLE_DATA) { Log.d(TAG, "setSelectedBubbleInternal: " + bubble); } - if (Objects.equals(bubble, mSelectedBubble)) { + if (!mShowingOverflow && Objects.equals(bubble, mSelectedBubble)) { return; } + // Otherwise, if we are showing the overflow menu, return to the previously selected bubble. + if (bubble != null && !mBubbles.contains(bubble) && !mOverflowBubbles.contains(bubble)) { Log.e(TAG, "Cannot select bubble which doesn't exist!" + " (" + bubble + ") bubbles=" + mBubbles); @@ -559,6 +566,10 @@ public class BubbleData { mStateChange.orderChanged |= repackAll(); // Save the state which should be returned to when expanded (with no other changes) + if (mShowingOverflow) { + // Show previously selected bubble instead of overflow menu on next expansion. + setSelectedBubbleInternal(mSelectedBubble); + } if (mBubbles.indexOf(mSelectedBubble) > 0) { // Move the selected bubble to the top while collapsed. if (!mSelectedBubble.isOngoing() && mBubbles.get(0).isOngoing()) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 644e54fb82aea..6e6613976a62d 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -439,8 +439,8 @@ public class BubbleStackView extends FrameLayout { // that means overflow was previously expanded. Set the selected bubble // internally without going through BubbleData (which would ignore it since it's // already selected). + mBubbleData.setShowingOverflow(true); setSelectedBubble(clickedBubble); - } } else { // Otherwise, we either tapped the stack (which means we're collapsed @@ -1227,8 +1227,12 @@ public class BubbleStackView extends FrameLayout { if (mExpandedBubble != null && mExpandedBubble.equals(bubbleToSelect)) { return; } + if (bubbleToSelect == null || bubbleToSelect.getKey() != BubbleOverflow.KEY) { + mBubbleData.setShowingOverflow(false); + } final BubbleViewProvider previouslySelected = mExpandedBubble; mExpandedBubble = bubbleToSelect; + updatePointerPosition(); if (mIsExpanded) { // Make the container of the expanded view transparent before removing the expanded view @@ -1238,7 +1242,6 @@ public class BubbleStackView extends FrameLayout { mSurfaceSynchronizer.syncSurfaceAndRun(() -> { previouslySelected.setContentVisibility(false); updateExpandedBubble(); - updatePointerPosition(); requestUpdate(); logBubbleEvent(previouslySelected,