diff --git a/packages/SystemUI/res/drawable/bubble_dismiss_circle.xml b/packages/SystemUI/res/drawable/bubble_dismiss_circle.xml index 1661bb22d148e..8c7e82f821869 100644 --- a/packages/SystemUI/res/drawable/bubble_dismiss_circle.xml +++ b/packages/SystemUI/res/drawable/bubble_dismiss_circle.xml @@ -24,4 +24,5 @@ android:width="1dp" android:color="#66FFFFFF" /> + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/bubble_dismiss_target.xml b/packages/SystemUI/res/layout/bubble_dismiss_target.xml index 245177c8461b6..ca085b69c35da 100644 --- a/packages/SystemUI/res/layout/bubble_dismiss_target.xml +++ b/packages/SystemUI/res/layout/bubble_dismiss_target.xml @@ -20,6 +20,13 @@ android:layout_height="@dimen/pip_dismiss_gradient_height" android:layout_gravity="bottom|center_horizontal"> + + - - - - - \ No newline at end of file diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 2a845e0962467..cc31676a0d095 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1114,7 +1114,7 @@ 52dp - 56dp + 52dp 16dp diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDismissView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDismissView.java index 4db1e276f431d..3ae2b74179adc 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDismissView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDismissView.java @@ -16,18 +16,13 @@ package com.android.systemui.bubbles; -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; - import android.content.Context; -import android.graphics.drawable.Drawable; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.TextView; import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.dynamicanimation.animation.SpringAnimation; @@ -37,14 +32,13 @@ import com.android.systemui.R; /** Dismiss view that contains a scrim gradient, as well as a dismiss icon, text, and circle. */ public class BubbleDismissView extends FrameLayout { - /** Duration for animations involving the dismiss target text/icon/gradient. */ + /** Duration for animations involving the dismiss target text/icon. */ private static final int DISMISS_TARGET_ANIMATION_BASE_DURATION = 150; - - private View mDismissGradient; + private static final float SCALE_FOR_POP = 1.2f; + private static final float SCALE_FOR_DISMISS = 0.9f; private LinearLayout mDismissTarget; private ImageView mDismissIcon; - private TextView mDismissText; private View mDismissCircle; private SpringAnimation mDismissTargetAlphaSpring; @@ -54,36 +48,15 @@ public class BubbleDismissView extends FrameLayout { super(context); setVisibility(GONE); - mDismissGradient = new FrameLayout(mContext); - - FrameLayout.LayoutParams gradientParams = - new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT); - gradientParams.gravity = Gravity.BOTTOM; - mDismissGradient.setLayoutParams(gradientParams); - - Drawable gradient = mContext.getResources().getDrawable(R.drawable.pip_dismiss_scrim); - gradient.setAlpha((int) (255 * 0.85f)); - mDismissGradient.setBackground(gradient); - - mDismissGradient.setVisibility(GONE); - addView(mDismissGradient); - LayoutInflater.from(context).inflate(R.layout.bubble_dismiss_target, this, true); mDismissTarget = findViewById(R.id.bubble_dismiss_icon_container); mDismissIcon = findViewById(R.id.bubble_dismiss_close_icon); - mDismissText = findViewById(R.id.bubble_dismiss_text); mDismissCircle = findViewById(R.id.bubble_dismiss_circle); // Set up the basic target area animations. These are very simple animations that don't need // fancy interpolators. final AccelerateDecelerateInterpolator interpolator = new AccelerateDecelerateInterpolator(); - mDismissGradient.animate() - .setDuration(DISMISS_TARGET_ANIMATION_BASE_DURATION) - .setInterpolator(interpolator); - mDismissText.animate() - .setDuration(DISMISS_TARGET_ANIMATION_BASE_DURATION) - .setInterpolator(interpolator); mDismissIcon.animate() .setDuration(DISMISS_TARGET_ANIMATION_BASE_DURATION) .setInterpolator(interpolator); @@ -113,105 +86,53 @@ public class BubbleDismissView extends FrameLayout { }); } - /** Springs in the dismiss target and fades in the gradient. */ + /** Springs in the dismiss target. */ void springIn() { setVisibility(View.VISIBLE); - // Fade in the dismiss target (icon + text). + // Fade in the dismiss target icon. + mDismissIcon.animate() + .setDuration(50) + .scaleX(1f) + .scaleY(1f) + .alpha(1f); mDismissTarget.setAlpha(0f); mDismissTargetAlphaSpring.animateToFinalPosition(1f); - // Spring up the dismiss target (icon + text). + // Spring up the dismiss target. mDismissTarget.setTranslationY(mDismissTarget.getHeight() / 2f); mDismissTargetVerticalSpring.animateToFinalPosition(0); - // Fade in the gradient. - mDismissGradient.setVisibility(VISIBLE); - mDismissGradient.animate().alpha(1f); + mDismissCircle.setAlpha(0f); + mDismissCircle.setScaleX(SCALE_FOR_POP); + mDismissCircle.setScaleY(SCALE_FOR_POP); - // Make sure the dismiss elements are in the separated position (in case we hid the target - // while they were condensed to cover the bubbles being in the target). - mDismissIcon.setAlpha(1f); - mDismissIcon.setScaleX(1f); - mDismissIcon.setScaleY(1f); - mDismissIcon.setTranslationX(0f); - mDismissText.setAlpha(1f); - mDismissText.setTranslationX(0f); + // Fade in circle and reduce size. + mDismissCircle.animate() + .alpha(1f) + .scaleX(1f) + .scaleY(1f); } - /** Springs out the dismiss target and fades out the gradient. */ + /** Springs out the dismiss target. */ void springOut() { + // Fade out the target icon. + mDismissIcon.animate() + .setDuration(50) + .scaleX(SCALE_FOR_DISMISS) + .scaleY(SCALE_FOR_DISMISS) + .alpha(0f); + // Fade out the target. mDismissTargetAlphaSpring.animateToFinalPosition(0f); // Spring the target down a bit. mDismissTargetVerticalSpring.animateToFinalPosition(mDismissTarget.getHeight() / 2f); - // Fade out the gradient and then set it to GONE so it's not in the SBV hierarchy. - mDismissGradient.animate().alpha(0f).withEndAction( - () -> mDismissGradient.setVisibility(GONE)); - - // Pop out the dismiss circle. - mDismissCircle.animate().alpha(0f).scaleX(1.2f).scaleY(1.2f); - } - - /** - * Encircles the center of the dismiss target, pulling the X towards the center and hiding the - * text. - */ - void animateEncircleCenterWithX(boolean encircle) { - // Pull the text towards the center if we're encircling (it'll be faded out, leaving only - // the X icon over the bubbles), or back to normal if we're un-encircling. - final float textTranslation = encircle - ? -mDismissIcon.getWidth() / 4f - : 0f; - - // Center the icon if we're encircling, or put it back to normal if not. - final float iconTranslation = encircle - ? mDismissTarget.getWidth() / 2f - - mDismissIcon.getWidth() / 2f - - mDismissIcon.getLeft() - : 0f; - - // Fade in/out the text and translate it. - mDismissText.animate() - .alpha(encircle ? 0f : 1f) - .translationX(textTranslation); - - mDismissIcon.animate() - .setDuration(150) - .translationX(iconTranslation); - - // Fade out the gradient if we're encircling (the bubbles will 'absorb' it by darkening - // themselves). - mDismissGradient.animate() - .alpha(encircle ? 0f : 1f); - - // Prepare the circle to be 'dropped in'. - if (encircle) { - mDismissCircle.setAlpha(0f); - mDismissCircle.setScaleX(1.2f); - mDismissCircle.setScaleY(1.2f); - } - - // Drop in the circle, or pull it back up. + // Pop out the circle. mDismissCircle.animate() - .alpha(encircle ? 1f : 0f) - .scaleX(encircle ? 1f : 0f) - .scaleY(encircle ? 1f : 0f); - } - - /** Animates the circle and the centered icon out. */ - void animateEncirclingCircleDisappearance() { - // Pop out the dismiss icon and circle. - mDismissIcon.animate() - .setDuration(50) - .scaleX(0.9f) - .scaleY(0.9f) - .alpha(0f); - mDismissCircle.animate() - .scaleX(0.9f) - .scaleY(0.9f) + .scaleX(SCALE_FOR_DISMISS) + .scaleY(SCALE_FOR_DISMISS) .alpha(0f); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 38d7d8cd2f7a1..44e84b9da2f3c 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -367,13 +367,6 @@ public class BubbleStackView extends FrameLayout { Gravity.BOTTOM)); addView(mDismissContainer); - mDismissContainer = new BubbleDismissView(mContext); - mDismissContainer.setLayoutParams(new FrameLayout.LayoutParams( - MATCH_PARENT, - getResources().getDimensionPixelSize(R.dimen.pip_dismiss_gradient_height), - Gravity.BOTTOM)); - addView(mDismissContainer); - mExpandedViewXAnim = new SpringAnimation(mExpandedViewContainer, DynamicAnimation.TRANSLATION_X); mExpandedViewXAnim.setSpring( @@ -1003,7 +996,7 @@ public class BubbleStackView extends FrameLayout { } mExpandedAnimationController.snapBubbleBack(bubble, velX, velY); - springOutDismissTargetAndHideCircle(); + hideDismissTarget(); } void onDragStart() { @@ -1045,7 +1038,7 @@ public class BubbleStackView extends FrameLayout { mStackOnLeftOrWillBe = newStackX <= 0; updateBubbleShadowsAndDotPosition(true /* animate */); - springOutDismissTargetAndHideCircle(); + hideDismissTarget(); } void onFlyoutDragStart() { @@ -1179,9 +1172,6 @@ public class BubbleStackView extends FrameLayout { animateDesaturateAndDarken(magnetView, true); } - - mDismissContainer.animateEncircleCenterWithX(true); - } else { mAnimatingMagnet = false; @@ -1192,8 +1182,6 @@ public class BubbleStackView extends FrameLayout { mExpandedAnimationController.demagnetizeBubbleTo(x, y, velX, velY); animateDesaturateAndDarken(magnetView, false); } - - mDismissContainer.animateEncircleCenterWithX(false); } mVibrator.vibrate(VibrationEffect.get(toTarget @@ -1212,7 +1200,7 @@ public class BubbleStackView extends FrameLayout { mAfterMagnet = null; mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_CLICK)); - mDismissContainer.animateEncirclingCircleDisappearance(); + mDismissContainer.springOut(); // 'Implode' the stack and then hide the dismiss target. if (touchedView == this) { @@ -1250,7 +1238,7 @@ public class BubbleStackView extends FrameLayout { } } - /** Animates in the dismiss target, including the gradient behind it. */ + /** Animates in the dismiss target. */ private void springInDismissTarget() { if (mShowingDismiss) { return; @@ -1268,7 +1256,7 @@ public class BubbleStackView extends FrameLayout { * Animates the dismiss target out, as well as the circle that encircles the bubbles, if they * were dragged into the target and encircled. */ - private void springOutDismissTargetAndHideCircle() { + private void hideDismissTarget() { if (!mShowingDismiss) { return; }