From 69943c0ea95ac26d7e3344b02e7cc20081ed19a0 Mon Sep 17 00:00:00 2001 From: Lyn Han Date: Fri, 26 Feb 2021 23:25:08 -0600 Subject: [PATCH] Update bubble dot math for consecutive flyout Bug: 170267642 Test: flyout-to-dot transformation okay for left/right stack in portrait/landscape Change-Id: I83f41984dd8bb6ec1cbbfcf9e0a1671555ebab32 --- .../wm/shell/bubbles/BubbleFlyoutView.java | 67 ++++++++++--------- .../wm/shell/bubbles/BubbleStackView.java | 2 +- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java index 7d5c9f07f86c5..57a2b6c7b9db2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java @@ -227,29 +227,30 @@ public class BubbleFlyoutView extends FrameLayout { /* * Fade animation for consecutive flyouts. */ - void animateUpdate(Bubble.FlyoutMessage flyoutMessage, float parentWidth, PointF stackPos) { + void animateUpdate(Bubble.FlyoutMessage flyoutMessage, float parentWidth, PointF stackPos, + boolean hideDot) { final Runnable afterFadeOut = () -> { updateFlyoutMessage(flyoutMessage, parentWidth); // Wait for TextViews to layout with updated height. post(() -> { - fade(true /* in */, stackPos, () -> {} /* after */); + fade(true /* in */, stackPos, hideDot, () -> {} /* after */); } /* after */ ); }; - fade(false /* in */, stackPos, afterFadeOut); + fade(false /* in */, stackPos, hideDot, afterFadeOut); } /* * Fade-out above or fade-in from below. */ - private void fade(boolean in, PointF stackPos, Runnable afterFade) { + private void fade(boolean in, PointF stackPos, boolean hideDot, Runnable afterFade) { mFlyoutY = stackPos.y + (mBubbleSize - mFlyoutTextContainer.getHeight()) / 2f; setAlpha(in ? 0f : 1f); setTranslationY(in ? mFlyoutY + FLYOUT_FADE_Y : mFlyoutY); - mRestingTranslationX = mArrowPointingLeft - ? stackPos.x + mBubbleSize + mFlyoutSpaceFromBubble - : stackPos.x - getWidth() - mFlyoutSpaceFromBubble; + updateFlyoutX(stackPos.x); setTranslationX(mRestingTranslationX); + updateDot(stackPos, hideDot); + animate() .alpha(in ? 1f : 0f) .setDuration(in ? FLYOUT_FADE_IN_DURATION : FLYOUT_FADE_OUT_DURATION) @@ -292,6 +293,33 @@ public class BubbleFlyoutView extends FrameLayout { mMessageText.setText(flyoutMessage.message); } + void updateFlyoutX(float stackX) { + // Calculate the translation required to position the flyout next to the bubble stack, + // with the desired padding. + mRestingTranslationX = mArrowPointingLeft + ? stackX + mBubbleSize + mFlyoutSpaceFromBubble + : stackX - getWidth() - mFlyoutSpaceFromBubble; + } + + void updateDot(PointF stackPos, boolean hideDot) { + // Calculate the difference in size between the flyout and the 'dot' so that we can + // transform into the dot later. + final float newDotSize = hideDot ? 0f : mNewDotSize; + mFlyoutToDotWidthDelta = getWidth() - newDotSize; + mFlyoutToDotHeightDelta = getHeight() - newDotSize; + + // Calculate the translation values needed to be in the correct 'new dot' position. + final float adjustmentForScaleAway = hideDot ? 0f : (mOriginalDotSize / 2f); + final float dotPositionX = stackPos.x + mDotCenter[0] - adjustmentForScaleAway; + final float dotPositionY = stackPos.y + mDotCenter[1] - adjustmentForScaleAway; + + final float distanceFromFlyoutLeftToDotCenterX = mRestingTranslationX - dotPositionX; + final float distanceFromLayoutTopToDotCenterY = mFlyoutY - dotPositionY; + + mTranslationXWhenDot = -distanceFromFlyoutLeftToDotCenterX; + mTranslationYWhenDot = -distanceFromLayoutTopToDotCenterY; + } + /** Configures the flyout, collapsed into dot form. */ void setupFlyoutStartingAsDot( Bubble.FlyoutMessage flyoutMessage, @@ -327,29 +355,8 @@ public class BubbleFlyoutView extends FrameLayout { mFlyoutY = stackPos.y + (mBubbleSize - mFlyoutTextContainer.getHeight()) / 2f; setTranslationY(mFlyoutY); - - // Calculate the translation required to position the flyout next to the bubble stack, - // with the desired padding. - mRestingTranslationX = mArrowPointingLeft - ? stackPos.x + mBubbleSize + mFlyoutSpaceFromBubble - : stackPos.x - getWidth() - mFlyoutSpaceFromBubble; - - // Calculate the difference in size between the flyout and the 'dot' so that we can - // transform into the dot later. - final float newDotSize = hideDot ? 0f : mNewDotSize; - mFlyoutToDotWidthDelta = getWidth() - newDotSize; - mFlyoutToDotHeightDelta = getHeight() - newDotSize; - - // Calculate the translation values needed to be in the correct 'new dot' position. - final float adjustmentForScaleAway = hideDot ? 0f : (mOriginalDotSize / 2f); - final float dotPositionX = stackPos.x + mDotCenter[0] - adjustmentForScaleAway; - final float dotPositionY = stackPos.y + mDotCenter[1] - adjustmentForScaleAway; - - final float distanceFromFlyoutLeftToDotCenterX = mRestingTranslationX - dotPositionX; - final float distanceFromLayoutTopToDotCenterY = mFlyoutY - dotPositionY; - - mTranslationXWhenDot = -distanceFromFlyoutLeftToDotCenterX; - mTranslationYWhenDot = -distanceFromLayoutTopToDotCenterY; + updateFlyoutX(stackPos.x); + updateDot(stackPos, hideDot); if (onLayoutComplete != null) { onLayoutComplete.run(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java index e99669f5b5e08..78820a8fa870b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java @@ -2431,7 +2431,7 @@ public class BubbleStackView extends FrameLayout if (mFlyout.getVisibility() == View.VISIBLE) { mFlyout.animateUpdate(bubble.getFlyoutMessage(), getWidth(), - mStackAnimationController.getStackPosition()); + mStackAnimationController.getStackPosition(), !bubble.showDot()); } else { mFlyout.setVisibility(INVISIBLE); mFlyout.setupFlyoutStartingAsDot(bubble.getFlyoutMessage(),