From 0f6668d01190d56d3d3a7b6e1aca71dec0b836c2 Mon Sep 17 00:00:00 2001 From: Luca Zuccarini Date: Thu, 30 May 2024 12:16:27 +0000 Subject: [PATCH] Miscellaneous polish for new home animation. 1. Update the starting window velocity when coming from 3-button nav or predictive back Before we used an arbitrary fixed velocity which goes down to basically 0 with the old implementation, but caused a noticeable jump up in the new one when using predictive back. Now we just pass 0, since the predictive back framework doesn't give us the actual velocity. 2. Add the scaling home reveal to the targetless (not going back to a specific app icon or widget) animation and 3-button nav Bug: 298089923 Fix: 343143876 Flag: com.android.launcher3.enable_scaling_reveal_home_animation Test: manually tested with flag on and off Change-Id: Ied3630a51862731fad044b68f76a45dc87f2e17b --- .../launcher3/QuickstepTransitionManager.java | 26 ++++++++++---- .../quickstep/LauncherSwipeHandlerV2.java | 34 +++++++++++++------ .../quickstep/util/RectFSpringAnim.java | 4 +++ .../util/ScalingWorkspaceRevealAnim.kt | 7 +++- 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 0c499b8bc6..fae281a70a 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -151,6 +151,7 @@ import com.android.quickstep.util.MultiValueUpdateListener; import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.RectFSpringAnim.DefaultSpringConfig; import com.android.quickstep.util.RectFSpringAnim.TaskbarHotseatSpringConfig; +import com.android.quickstep.util.ScalingWorkspaceRevealAnim; import com.android.quickstep.util.StaggeredWorkspaceAnim; import com.android.quickstep.util.SurfaceTransaction; import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties; @@ -174,7 +175,6 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map.Entry; /** * Manages the opening and closing app transitions from Launcher @@ -1630,10 +1630,15 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener anim.play(getUnlockWindowAnimator(appTargets, wallpaperTargets)); } else if (ENABLE_BACK_SWIPE_HOME_ANIMATION.get() && !playFallBackAnimation) { - // Use a fixed velocity to start the animation. - float velocityPxPerS = DynamicResource.provider(mLauncher) - .getDimension(R.dimen.unlock_staggered_velocity_dp_per_s); - PointF velocity = new PointF(0, -velocityPxPerS); + PointF velocity; + if (enableScalingRevealHomeAnimation()) { + velocity = new PointF(); + } else { + // Use a fixed velocity to start the animation. + float velocityPxPerS = DynamicResource.provider(mLauncher) + .getDimension(R.dimen.unlock_staggered_velocity_dp_per_s); + velocity = new PointF(0, -velocityPxPerS); + } rectFSpringAnim = getClosingWindowAnimators( anim, appTargets, launcherView, velocity, startRect, startWindowCornerRadius); @@ -1642,8 +1647,15 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener // layout bounds. skipAllAppsScale = true; } else if (!fromPredictiveBack) { - anim.play(new StaggeredWorkspaceAnim(mLauncher, velocity.y, - true /* animateOverviewScrim */, launcherView).getAnimators()); + if (enableScalingRevealHomeAnimation()) { + anim.play( + new ScalingWorkspaceRevealAnim( + mLauncher, rectFSpringAnim, + rectFSpringAnim.getTargetRect()).getAnimators()); + } else { + anim.play(new StaggeredWorkspaceAnim(mLauncher, velocity.y, + true /* animateOverviewScrim */, launcherView).getAnimators()); + } if (!areAllTargetsTranslucent(appTargets)) { anim.play(ObjectAnimator.ofFloat(mLauncher.getDepthController().stateDepth, diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java index 080e03acc2..3c665906b5 100644 --- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java +++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java @@ -173,14 +173,10 @@ public class LauncherSwipeHandlerV2 extends } @Override - public void playAtomicAnimation(float velocity) { - if (enableScalingRevealHomeAnimation()) { - if (mContainer != null) { - new ScalingWorkspaceRevealAnim( - mContainer, mSiblingAnimation, getWindowTargetRect()).start(); - } - } else { - super.playAtomicAnimation(velocity); + protected void playScalingRevealAnimation() { + if (mContainer != null) { + new ScalingWorkspaceRevealAnim(mContainer, mSiblingAnimation, + getWindowTargetRect()).start(); } } @@ -370,9 +366,25 @@ public class LauncherSwipeHandlerV2 extends @Override public void playAtomicAnimation(float velocity) { - new StaggeredWorkspaceAnim(mContainer, velocity, true /* animateOverviewScrim */, - getViewIgnoredInWorkspaceRevealAnimation()) - .start(); + if (enableScalingRevealHomeAnimation()) { + playScalingRevealAnimation(); + } else { + new StaggeredWorkspaceAnim(mContainer, velocity, true /* animateOverviewScrim */, + getViewIgnoredInWorkspaceRevealAnimation()) + .start(); + } + } + + /** + * Extracted in a different method so subclasses that have a custom window animation with a + * target (icons, widgets) can pass the optional parameters. + */ + protected void playScalingRevealAnimation() { + if (mContainer != null) { + new ScalingWorkspaceRevealAnim( + mContainer, null /* siblingAnimation */, + null /* windowTargetRect */).start(); + } } } } diff --git a/quickstep/src/com/android/quickstep/util/RectFSpringAnim.java b/quickstep/src/com/android/quickstep/util/RectFSpringAnim.java index 769ccc092b..00b40116f7 100644 --- a/quickstep/src/com/android/quickstep/util/RectFSpringAnim.java +++ b/quickstep/src/com/android/quickstep/util/RectFSpringAnim.java @@ -157,6 +157,10 @@ public class RectFSpringAnim extends ReleaseCheck { mCurrentY = getTrackedYFromRect(mStartRect); } + public RectF getTargetRect() { + return mTargetRect; + } + private float getTrackedYFromRect(RectF rect) { switch (mTracking) { case TRACKING_TOP: diff --git a/quickstep/src/com/android/quickstep/util/ScalingWorkspaceRevealAnim.kt b/quickstep/src/com/android/quickstep/util/ScalingWorkspaceRevealAnim.kt index 4513fa295d..f547a7fba1 100644 --- a/quickstep/src/com/android/quickstep/util/ScalingWorkspaceRevealAnim.kt +++ b/quickstep/src/com/android/quickstep/util/ScalingWorkspaceRevealAnim.kt @@ -16,6 +16,7 @@ package com.android.quickstep.util +import android.animation.AnimatorSet import android.graphics.Matrix import android.graphics.Path import android.graphics.RectF @@ -187,7 +188,11 @@ class ScalingWorkspaceRevealAnim( ) } + fun getAnimators(): AnimatorSet { + return animation.buildAnim() + } + fun start() { - animation.buildAnim().start() + getAnimators().start() } }