From ea948c2b33522091c83a0805de215e4da7fb3841 Mon Sep 17 00:00:00 2001 From: Luca Zuccarini Date: Fri, 6 May 2022 14:19:52 +0000 Subject: [PATCH] Update the NORMAL<->ALL_APPS swipe transitions on phones. Bug: 144877924 Test: manual Change-Id: I47d4cdedea69b921711c33e2905bc429e7d1db35 --- .../uioverrides/states/AllAppsState.java | 6 +- .../PortraitStatesTouchController.java | 88 +++++++++++++++---- .../android/launcher3/anim/Interpolators.java | 10 +++ .../touch/AllAppsSwipeController.java | 3 + .../uioverrides/states/AllAppsState.java | 5 +- 5 files changed, 90 insertions(+), 22 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java b/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java index 3b1f119ac2..a74774c62b 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java @@ -31,6 +31,8 @@ import com.android.launcher3.util.Themes; */ public class AllAppsState extends LauncherState { + private static final float WORKSPACE_SCALE_FACTOR = 0.97f; + private static final int STATE_FLAGS = FLAG_WORKSPACE_INACCESSIBLE | FLAG_CLOSE_POPUPS | FLAG_HOTSEAT_INACCESSIBLE; @@ -58,7 +60,7 @@ public class AllAppsState extends LauncherState { @Override public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) { - return new ScaleAndTranslation(0.97f, NO_OFFSET, NO_OFFSET); + return new ScaleAndTranslation(WORKSPACE_SCALE_FACTOR, NO_OFFSET, NO_OFFSET); } @Override @@ -69,7 +71,7 @@ public class AllAppsState extends LauncherState { ScaleAndTranslation overviewScaleAndTranslation = LauncherState.OVERVIEW .getWorkspaceScaleAndTranslation(launcher); return new ScaleAndTranslation( - NO_SCALE, + WORKSPACE_SCALE_FACTOR, overviewScaleAndTranslation.translationX, overviewScaleAndTranslation.translationY); } diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java index dbee9c1ac7..e874bf0904 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java @@ -25,9 +25,17 @@ import static com.android.launcher3.anim.Interpolators.FINAL_FRAME; import static com.android.launcher3.anim.Interpolators.INSTANT; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.states.StateAnimationConfig.ANIM_ALL_APPS_FADE; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_DEPTH; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_HOTSEAT_FADE; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_HOTSEAT_SCALE; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_HOTSEAT_TRANSLATE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_SCRIM_FADE; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_VERTICAL_PROGRESS; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_FADE; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_SCALE; import android.view.MotionEvent; +import android.view.animation.Interpolator; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; @@ -70,6 +78,28 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr */ public static final float ALL_APPS_SCRIM_OPAQUE_THRESHOLD = .5f; + // Custom timing for NORMAL -> ALL_APPS on phones only. + private static final float ALL_APPS_STATE_TRANSITION = 0.4f; + + // Custom interpolators for NORMAL -> ALL_APPS on phones only. + private static final Interpolator LINEAR_EARLY = + Interpolators.clampToProgress(LINEAR, 0f, ALL_APPS_STATE_TRANSITION); + private static final Interpolator STEP_TRANSITION = + Interpolators.clampToProgress(FINAL_FRAME, 0f, ALL_APPS_STATE_TRANSITION); + public static final Interpolator BLUR = LINEAR_EARLY; + public static final Interpolator WORKSPACE_FADE = STEP_TRANSITION; + public static final Interpolator WORKSPACE_SCALE = LINEAR_EARLY; + public static final Interpolator HOTSEAT_FADE = STEP_TRANSITION; + public static final Interpolator HOTSEAT_SCALE = LINEAR_EARLY; + public static final Interpolator HOTSEAT_TRANSLATE = STEP_TRANSITION; + public static final Interpolator SCRIM_FADE = LINEAR_EARLY; + public static final Interpolator ALL_APPS_FADE = + Interpolators.clampToProgress(LINEAR, ALL_APPS_STATE_TRANSITION, 1f); + public static final Interpolator ALL_APPS_VERTICAL_PROGRESS = + Interpolators.clampToProgress( + Interpolators.mapToProgress(LINEAR, ALL_APPS_STATE_TRANSITION, 1.0f), + ALL_APPS_STATE_TRANSITION, 1.0f); + private final PortraitOverviewStateTouchHelper mOverviewPortraitStateTouchHelper; public PortraitStatesTouchController(Launcher l) { @@ -127,29 +157,51 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr private StateAnimationConfig getNormalToAllAppsAnimation() { StateAnimationConfig builder = new StateAnimationConfig(); - boolean isTablet = mLauncher.getDeviceProfile().isTablet; - builder.setInterpolator(ANIM_ALL_APPS_FADE, isTablet - ? INSTANT - : Interpolators.clampToProgress(LINEAR, - ALL_APPS_CONTENT_FADE_MIN_CLAMPING_THRESHOLD, - ALL_APPS_CONTENT_FADE_MAX_CLAMPING_THRESHOLD)); - builder.setInterpolator(ANIM_SCRIM_FADE, Interpolators.clampToProgress(LINEAR, - ALL_APPS_SCRIM_VISIBLE_THRESHOLD, - ALL_APPS_SCRIM_OPAQUE_THRESHOLD)); + if (mLauncher.getDeviceProfile().isTablet) { + builder.setInterpolator(ANIM_ALL_APPS_FADE, INSTANT); + builder.setInterpolator(ANIM_SCRIM_FADE, + Interpolators.clampToProgress(LINEAR, + ALL_APPS_SCRIM_VISIBLE_THRESHOLD, + ALL_APPS_SCRIM_OPAQUE_THRESHOLD)); + } else { + // TODO(b/231682175): centralize this setup in AllAppsSwipeController. + builder.setInterpolator(ANIM_DEPTH, BLUR); + builder.setInterpolator(ANIM_WORKSPACE_FADE, WORKSPACE_FADE); + builder.setInterpolator(ANIM_WORKSPACE_SCALE, WORKSPACE_SCALE); + builder.setInterpolator(ANIM_HOTSEAT_FADE, HOTSEAT_FADE); + builder.setInterpolator(ANIM_HOTSEAT_SCALE, HOTSEAT_SCALE); + builder.setInterpolator(ANIM_HOTSEAT_TRANSLATE, HOTSEAT_TRANSLATE); + builder.setInterpolator(ANIM_SCRIM_FADE, SCRIM_FADE); + builder.setInterpolator(ANIM_ALL_APPS_FADE, ALL_APPS_FADE); + builder.setInterpolator(ANIM_VERTICAL_PROGRESS, ALL_APPS_VERTICAL_PROGRESS); + } return builder; } private StateAnimationConfig getAllAppsToNormalAnimation() { StateAnimationConfig builder = new StateAnimationConfig(); - boolean isTablet = mLauncher.getDeviceProfile().isTablet; - builder.setInterpolator(ANIM_ALL_APPS_FADE, isTablet - ? FINAL_FRAME - : Interpolators.clampToProgress(LINEAR, - 1 - ALL_APPS_CONTENT_FADE_MAX_CLAMPING_THRESHOLD, - 1 - ALL_APPS_CONTENT_FADE_MIN_CLAMPING_THRESHOLD)); - builder.setInterpolator(ANIM_SCRIM_FADE, Interpolators.clampToProgress(LINEAR, - 1 - ALL_APPS_SCRIM_OPAQUE_THRESHOLD, - 1 - ALL_APPS_SCRIM_VISIBLE_THRESHOLD)); + if (mLauncher.getDeviceProfile().isTablet) { + builder.setInterpolator(ANIM_ALL_APPS_FADE, FINAL_FRAME); + builder.setInterpolator(ANIM_SCRIM_FADE, + Interpolators.clampToProgress(LINEAR, + 1 - ALL_APPS_SCRIM_OPAQUE_THRESHOLD, + 1 - ALL_APPS_SCRIM_VISIBLE_THRESHOLD)); + } else { + // These interpolators are the reverse of the ones used above, so swiping out of All + // Apps feels the same as swiping into it. + // TODO(b/231682175): centralize this setup in AllAppsSwipeController. + builder.setInterpolator(ANIM_DEPTH, Interpolators.reverse(BLUR)); + builder.setInterpolator(ANIM_WORKSPACE_FADE, Interpolators.reverse(WORKSPACE_FADE)); + builder.setInterpolator(ANIM_WORKSPACE_SCALE, Interpolators.reverse(WORKSPACE_SCALE)); + builder.setInterpolator(ANIM_HOTSEAT_FADE, Interpolators.reverse(HOTSEAT_FADE)); + builder.setInterpolator(ANIM_HOTSEAT_SCALE, Interpolators.reverse(HOTSEAT_SCALE)); + builder.setInterpolator(ANIM_HOTSEAT_TRANSLATE, + Interpolators.reverse(HOTSEAT_TRANSLATE)); + builder.setInterpolator(ANIM_SCRIM_FADE, Interpolators.reverse(SCRIM_FADE)); + builder.setInterpolator(ANIM_ALL_APPS_FADE, Interpolators.reverse(ALL_APPS_FADE)); + builder.setInterpolator(ANIM_VERTICAL_PROGRESS, + Interpolators.reverse(ALL_APPS_VERTICAL_PROGRESS)); + } return builder; } diff --git a/src/com/android/launcher3/anim/Interpolators.java b/src/com/android/launcher3/anim/Interpolators.java index c38cf9ad70..0a77aa7bcf 100644 --- a/src/com/android/launcher3/anim/Interpolators.java +++ b/src/com/android/launcher3/anim/Interpolators.java @@ -208,4 +208,14 @@ public class Interpolators { float upperBound) { return t -> Utilities.mapRange(interpolator.getInterpolation(t), lowerBound, upperBound); } + + /** + * Returns the reverse of the provided interpolator, following the formula: g(x) = 1 - f(1 - x). + * In practice, this means that if f is an interpolator used to model a value animating between + * m and n, g is the interpolator to use to obtain the specular behavior when animating from n + * to m. + */ + public static Interpolator reverse(Interpolator interpolator) { + return t -> 1 - interpolator.getInterpolation(1 - t); + } } diff --git a/src/com/android/launcher3/touch/AllAppsSwipeController.java b/src/com/android/launcher3/touch/AllAppsSwipeController.java index 9d7fd9ab0f..fb916287c6 100644 --- a/src/com/android/launcher3/touch/AllAppsSwipeController.java +++ b/src/com/android/launcher3/touch/AllAppsSwipeController.java @@ -26,6 +26,7 @@ import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.states.StateAnimationConfig.ANIM_ALL_APPS_FADE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_DEPTH; import static com.android.launcher3.states.StateAnimationConfig.ANIM_HOTSEAT_FADE; +import static com.android.launcher3.states.StateAnimationConfig.ANIM_HOTSEAT_SCALE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_HOTSEAT_TRANSLATE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_SCRIM_FADE; import static com.android.launcher3.states.StateAnimationConfig.ANIM_VERTICAL_PROGRESS; @@ -66,6 +67,7 @@ public class AllAppsSwipeController extends AbstractStateChangeTouchController { EMPHASIZED_DECELERATE, WORKSPACE_MOTION_START, ALL_APPS_STATE_TRANSITION); public static final Interpolator HOTSEAT_FADE = Interpolators.clampToProgress(FINAL_FRAME, 0f, ALL_APPS_STATE_TRANSITION); + public static final Interpolator HOTSEAT_SCALE = HOTSEAT_FADE; public static final Interpolator HOTSEAT_TRANSLATE = Interpolators.clampToProgress( EMPHASIZED_ACCELERATE, WORKSPACE_MOTION_START, ALL_APPS_STATE_TRANSITION); @@ -163,6 +165,7 @@ public class AllAppsSwipeController extends AbstractStateChangeTouchController { config.setInterpolator(ANIM_DEPTH, BLUR); config.setInterpolator(ANIM_WORKSPACE_SCALE, WORKSPACE_SCALE); config.setInterpolator(ANIM_HOTSEAT_FADE, HOTSEAT_FADE); + config.setInterpolator(ANIM_HOTSEAT_SCALE, HOTSEAT_SCALE); config.setInterpolator(ANIM_HOTSEAT_TRANSLATE, HOTSEAT_TRANSLATE); config.setInterpolator(ANIM_SCRIM_FADE, SCRIM_FADE); config.setInterpolator(ANIM_ALL_APPS_FADE, ALL_APPS_FADE); diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/states/AllAppsState.java b/src_ui_overrides/com/android/launcher3/uioverrides/states/AllAppsState.java index ec921e8f56..bf35dd8d08 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/states/AllAppsState.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/states/AllAppsState.java @@ -32,6 +32,7 @@ import com.android.launcher3.util.Themes; public class AllAppsState extends LauncherState { private static final float PARALLAX_COEFFICIENT = .125f; + private static final float WORKSPACE_SCALE_FACTOR = 0.97f; private static final int STATE_FLAGS = FLAG_WORKSPACE_INACCESSIBLE; @@ -59,7 +60,7 @@ public class AllAppsState extends LauncherState { @Override public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) { - return new ScaleAndTranslation(0.97f, NO_OFFSET, NO_OFFSET); + return new ScaleAndTranslation(WORKSPACE_SCALE_FACTOR, NO_OFFSET, NO_OFFSET); } @Override @@ -70,7 +71,7 @@ public class AllAppsState extends LauncherState { ScaleAndTranslation overviewScaleAndTranslation = LauncherState.OVERVIEW .getWorkspaceScaleAndTranslation(launcher); return new ScaleAndTranslation( - NO_SCALE, + WORKSPACE_SCALE_FACTOR, overviewScaleAndTranslation.translationX, overviewScaleAndTranslation.translationY); }