diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index c985b083f9a9e..c2e5f311f0d77 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -1554,6 +1554,14 @@ public class BubbleStackView extends FrameLayout mBubbleData.setShowingOverflow(true); } + if (mIsExpanded && mIsExpansionAnimating) { + // If the bubble selection changed during the expansion animation, the expanding bubble + // probably crashed or immediately removed itself (or, we just got unlucky with a new + // auto-expanding bubble showing up at just the right time). Cancel the animations so we + // can start fresh. + cancelAllExpandCollapseSwitchAnimations(); + } + // If we're expanded, screenshot the currently expanded bubble (before expanding the newly // selected bubble) so we can animate it out. if (mIsExpanded && mExpandedBubble != null && mExpandedBubble.getExpandedView() != null) { @@ -1879,35 +1887,37 @@ public class BubbleStackView extends FrameLayout mExpandedBubble.getExpandedView().setSurfaceZOrderedOnTop(false); } - mDelayedAnimationHandler.postDelayed(() -> - PhysicsAnimator.getInstance(mExpandedViewContainerMatrix) - .spring(AnimatableScaleMatrix.SCALE_X, - AnimatableScaleMatrix.getAnimatableValueForScaleFactor(1f), - mScaleInSpringConfig) - .spring(AnimatableScaleMatrix.SCALE_Y, - AnimatableScaleMatrix.getAnimatableValueForScaleFactor(1f), - mScaleInSpringConfig) - .addUpdateListener((target, values) -> { - if (mExpandedBubble.getIconView() == null) { - return; - } - mExpandedViewContainerMatrix.postTranslate( - mExpandedBubble.getIconView().getTranslationX() - - bubbleWillBeAtX, - 0); - mExpandedViewContainer.setAnimationMatrix( - mExpandedViewContainerMatrix); - }) - .withEndActions(() -> { - if (mExpandedBubble != null - && mExpandedBubble.getExpandedView() != null) { - mExpandedBubble.getExpandedView() - .setContentVisibility(true); - mExpandedBubble.getExpandedView() - .setSurfaceZOrderedOnTop(false); - } - }) - .start(), startDelay); + mDelayedAnimationHandler.postDelayed(() -> { + PhysicsAnimator.getInstance(mExpandedViewContainerMatrix).cancel(); + PhysicsAnimator.getInstance(mExpandedViewContainerMatrix) + .spring(AnimatableScaleMatrix.SCALE_X, + AnimatableScaleMatrix.getAnimatableValueForScaleFactor(1f), + mScaleInSpringConfig) + .spring(AnimatableScaleMatrix.SCALE_Y, + AnimatableScaleMatrix.getAnimatableValueForScaleFactor(1f), + mScaleInSpringConfig) + .addUpdateListener((target, values) -> { + if (mExpandedBubble.getIconView() == null) { + return; + } + mExpandedViewContainerMatrix.postTranslate( + mExpandedBubble.getIconView().getTranslationX() + - bubbleWillBeAtX, + 0); + mExpandedViewContainer.setAnimationMatrix( + mExpandedViewContainerMatrix); + }) + .withEndActions(() -> { + if (mExpandedBubble != null + && mExpandedBubble.getExpandedView() != null) { + mExpandedBubble.getExpandedView() + .setContentVisibility(true); + mExpandedBubble.getExpandedView() + .setSurfaceZOrderedOnTop(false); + } + }) + .start(); + }, startDelay); } private void animateCollapse() { @@ -2035,6 +2045,7 @@ public class BubbleStackView extends FrameLayout return; } + PhysicsAnimator.getInstance(mExpandedViewContainerMatrix).cancel(); PhysicsAnimator.getInstance(mExpandedViewContainerMatrix) .spring(AnimatableScaleMatrix.SCALE_X, AnimatableScaleMatrix.getAnimatableValueForScaleFactor(1f), @@ -2068,6 +2079,15 @@ public class BubbleStackView extends FrameLayout mIsBubbleSwitchAnimating = false; } + private void cancelAllExpandCollapseSwitchAnimations() { + cancelDelayedExpandCollapseSwitchAnimations(); + + PhysicsAnimator.getInstance(mAnimatingOutSurfaceView).cancel(); + PhysicsAnimator.getInstance(mExpandedViewContainerMatrix).cancel(); + + mExpandedViewContainer.setAnimationMatrix(null); + } + private void notifyExpansionChanged(BubbleViewProvider bubble, boolean expanded) { if (mExpandListener != null && bubble != null) { mExpandListener.onBubbleExpandChanged(expanded, bubble.getKey()); @@ -2587,6 +2607,7 @@ public class BubbleStackView extends FrameLayout bev.setContentVisibility(false); mExpandedViewContainerMatrix.setScaleX(0f); mExpandedViewContainerMatrix.setScaleY(0f); + mExpandedViewContainerMatrix.setTranslate(0f, 0f); mExpandedViewContainer.setVisibility(View.INVISIBLE); mExpandedViewContainer.setAlpha(0f); mExpandedViewContainer.addView(bev); diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java b/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java index 8e232520a1969..f2a4f159f9595 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java @@ -237,6 +237,10 @@ public class ExpandedAnimationController } mAfterExpand = null; + + // Update bubble positions in case any bubbles were added or removed during the + // expansion animation. + updateBubblePositions(); }; } else { after = () -> {