diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java b/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java index 7b016706cb..3b1f119ac2 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java @@ -58,17 +58,21 @@ public class AllAppsState extends LauncherState { @Override public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) { - ScaleAndTranslation scaleAndTranslation = - new ScaleAndTranslation(NO_SCALE, NO_OFFSET, NO_OFFSET); + return new ScaleAndTranslation(0.97f, NO_OFFSET, NO_OFFSET); + } + + @Override + public ScaleAndTranslation getHotseatScaleAndTranslation(Launcher launcher) { if (launcher.getDeviceProfile().isTablet) { - scaleAndTranslation.scale = 0.97f; + return getWorkspaceScaleAndTranslation(launcher); } else { ScaleAndTranslation overviewScaleAndTranslation = LauncherState.OVERVIEW .getWorkspaceScaleAndTranslation(launcher); - scaleAndTranslation.translationX = overviewScaleAndTranslation.translationX; - scaleAndTranslation.translationY = overviewScaleAndTranslation.translationY; + return new ScaleAndTranslation( + NO_SCALE, + overviewScaleAndTranslation.translationX, + overviewScaleAndTranslation.translationY); } - return scaleAndTranslation; } @Override diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java index b5b03a1ec6..f2162b03af 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java @@ -192,7 +192,10 @@ public class QuickstepAtomicAnimationFactory extends 1 - ALL_APPS_SCRIM_VISIBLE_THRESHOLD)); config.setInterpolator(ANIM_VERTICAL_PROGRESS, EMPHASIZED_ACCELERATE); } else if (fromState == NORMAL && toState == ALL_APPS) { - config.setInterpolator(ANIM_VERTICAL_PROGRESS, EMPHASIZED_DECELERATE); + if (mActivity.getDeviceProfile().isTablet) { + config.setInterpolator(ANIM_VERTICAL_PROGRESS, EMPHASIZED_DECELERATE); + } + // TODO(b/231682175): centralize this setup in AllAppsSwipeController } } } diff --git a/res/values/dimens.xml b/res/values/dimens.xml index a8ee72101a..098c69465d 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -100,7 +100,7 @@ -26dp - 320dp + 300dp 48dp 24dp diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java index bf56ac0443..a991c2f959 100644 --- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java +++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java @@ -36,6 +36,7 @@ import static com.android.launcher3.anim.Interpolators.ZOOM_OUT; import static com.android.launcher3.anim.PropertySetter.NO_ANIM_PROPERTY_SETTER; import static com.android.launcher3.graphics.Scrim.SCRIM_PROGRESS; import static com.android.launcher3.graphics.SysUiScrim.SYSUI_PROGRESS; +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; @@ -117,8 +118,6 @@ public class WorkspaceStateTransitionAnimation { } int elements = state.getVisibleElements(mLauncher); - Interpolator fadeInterpolator = config.getInterpolator(ANIM_WORKSPACE_FADE, - pageAlphaProvider.interpolator); Hotseat hotseat = mWorkspace.getHotseat(); Interpolator scaleInterpolator = config.getInterpolator(ANIM_WORKSPACE_SCALE, ZOOM_OUT); LauncherState fromState = mLauncher.getStateManager().getState(); @@ -146,11 +145,15 @@ public class WorkspaceStateTransitionAnimation { hotseatScaleInterpolator); } - float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0; - propertySetter.setViewAlpha(hotseat, hotseatIconsAlpha, fadeInterpolator); + Interpolator workspaceFadeInterpolator = config.getInterpolator(ANIM_WORKSPACE_FADE, + pageAlphaProvider.interpolator); float workspacePageIndicatorAlpha = (elements & WORKSPACE_PAGE_INDICATOR) != 0 ? 1 : 0; propertySetter.setViewAlpha(mLauncher.getWorkspace().getPageIndicator(), - workspacePageIndicatorAlpha, fadeInterpolator); + workspacePageIndicatorAlpha, workspaceFadeInterpolator); + Interpolator hotseatFadeInterpolator = config.getInterpolator(ANIM_HOTSEAT_FADE, + workspaceFadeInterpolator); + float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0; + propertySetter.setViewAlpha(hotseat, hotseatIconsAlpha, hotseatFadeInterpolator); // Update the accessibility flags for hotseat based on launcher state. hotseat.setImportantForAccessibility( diff --git a/src/com/android/launcher3/anim/Interpolators.java b/src/com/android/launcher3/anim/Interpolators.java index f8a2c79ab1..c38cf9ad70 100644 --- a/src/com/android/launcher3/anim/Interpolators.java +++ b/src/com/android/launcher3/anim/Interpolators.java @@ -57,6 +57,11 @@ public class Interpolators { public static final Interpolator DECELERATED_EASE = new PathInterpolator(0, 0, .2f, 1f); public static final Interpolator ACCELERATED_EASE = new PathInterpolator(0.4f, 0, 1f, 1f); + public static final Interpolator EMPHASIZED_ACCELERATE = new PathInterpolator( + 0.3f, 0f, 0.8f, 0.15f); + public static final Interpolator EMPHASIZED_DECELERATE = new PathInterpolator( + 0.05f, 0.7f, 0.1f, 1f); + public static final Interpolator EXAGGERATED_EASE; public static final Interpolator INSTANT = t -> 1; diff --git a/src/com/android/launcher3/states/StateAnimationConfig.java b/src/com/android/launcher3/states/StateAnimationConfig.java index f04e685c0a..f99519d6e9 100644 --- a/src/com/android/launcher3/states/StateAnimationConfig.java +++ b/src/com/android/launcher3/states/StateAnimationConfig.java @@ -53,6 +53,7 @@ public class StateAnimationConfig { ANIM_WORKSPACE_FADE, ANIM_HOTSEAT_SCALE, ANIM_HOTSEAT_TRANSLATE, + ANIM_HOTSEAT_FADE, ANIM_OVERVIEW_SCALE, ANIM_OVERVIEW_TRANSLATE_X, ANIM_OVERVIEW_TRANSLATE_Y, @@ -72,6 +73,7 @@ public class StateAnimationConfig { public static final int ANIM_WORKSPACE_FADE = 3; public static final int ANIM_HOTSEAT_SCALE = 4; public static final int ANIM_HOTSEAT_TRANSLATE = 5; + public static final int ANIM_HOTSEAT_FADE = 16; public static final int ANIM_OVERVIEW_SCALE = 6; public static final int ANIM_OVERVIEW_TRANSLATE_X = 7; public static final int ANIM_OVERVIEW_TRANSLATE_Y = 8; @@ -83,7 +85,7 @@ public class StateAnimationConfig { public static final int ANIM_OVERVIEW_ACTIONS_FADE = 14; public static final int ANIM_WORKSPACE_PAGE_TRANSLATE_X = 15; - private static final int ANIM_TYPES_COUNT = 16; + private static final int ANIM_TYPES_COUNT = 17; protected final Interpolator[] mInterpolators = new Interpolator[ANIM_TYPES_COUNT]; diff --git a/src/com/android/launcher3/touch/AllAppsSwipeController.java b/src/com/android/launcher3/touch/AllAppsSwipeController.java index 5aac3f3a82..9d7fd9ab0f 100644 --- a/src/com/android/launcher3/touch/AllAppsSwipeController.java +++ b/src/com/android/launcher3/touch/AllAppsSwipeController.java @@ -17,11 +17,19 @@ package com.android.launcher3.touch; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; +import static com.android.launcher3.anim.Interpolators.DECELERATED_EASE; +import static com.android.launcher3.anim.Interpolators.EMPHASIZED_ACCELERATE; +import static com.android.launcher3.anim.Interpolators.EMPHASIZED_DECELERATE; 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_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_SCALE; import android.view.MotionEvent; import android.view.animation.Interpolator; @@ -39,11 +47,41 @@ public class AllAppsSwipeController extends AbstractStateChangeTouchController { private static final float ALLAPPS_STAGGERED_FADE_THRESHOLD = 0.5f; + // Custom timing for NORMAL -> ALL_APPS on phones only. + private static final float WORKSPACE_MOTION_START = 0.1667f; + private static final float ALL_APPS_STATE_TRANSITION = 0.305f; + private static final float ALL_APPS_FADE_END = 0.4717f; + public static final Interpolator ALLAPPS_STAGGERED_FADE_EARLY_RESPONDER = Interpolators.clampToProgress(LINEAR, 0, ALLAPPS_STAGGERED_FADE_THRESHOLD); public static final Interpolator ALLAPPS_STAGGERED_FADE_LATE_RESPONDER = Interpolators.clampToProgress(LINEAR, ALLAPPS_STAGGERED_FADE_THRESHOLD, 1f); + // Custom interpolators for NORMAL -> ALL_APPS on phones only. + public static final Interpolator BLUR = + Interpolators.clampToProgress( + EMPHASIZED_DECELERATE, WORKSPACE_MOTION_START, ALL_APPS_STATE_TRANSITION); + public static final Interpolator WORKSPACE_SCALE = + Interpolators.clampToProgress( + 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_TRANSLATE = + Interpolators.clampToProgress( + EMPHASIZED_ACCELERATE, WORKSPACE_MOTION_START, ALL_APPS_STATE_TRANSITION); + public static final Interpolator SCRIM_FADE = + Interpolators.clampToProgress( + Interpolators.mapToProgress(LINEAR, 0f, 0.8f), + WORKSPACE_MOTION_START, ALL_APPS_STATE_TRANSITION); + public static final Interpolator ALL_APPS_FADE = + Interpolators.clampToProgress( + Interpolators.mapToProgress(DECELERATED_EASE, 0.2f, 1.0f), + ALL_APPS_STATE_TRANSITION, ALL_APPS_FADE_END); + public static final Interpolator ALL_APPS_VERTICAL_PROGRESS = + Interpolators.clampToProgress( + Interpolators.mapToProgress(EMPHASIZED_DECELERATE, 0.4f, 1.0f), + ALL_APPS_STATE_TRANSITION, 1.0f); + public AllAppsSwipeController(Launcher l) { super(l, SingleAxisSwipeDetector.VERTICAL); } @@ -118,11 +156,17 @@ public class AllAppsSwipeController extends AbstractStateChangeTouchController { */ public static void applyNormalToAllAppsAnimConfig(Launcher launcher, StateAnimationConfig config) { - boolean isTablet = launcher.getDeviceProfile().isTablet; - config.setInterpolator(ANIM_SCRIM_FADE, ALLAPPS_STAGGERED_FADE_EARLY_RESPONDER); - config.setInterpolator(ANIM_ALL_APPS_FADE, isTablet - ? INSTANT : ALLAPPS_STAGGERED_FADE_LATE_RESPONDER); + if (launcher.getDeviceProfile().isTablet) { + config.setInterpolator(ANIM_SCRIM_FADE, ALLAPPS_STAGGERED_FADE_EARLY_RESPONDER); + config.setInterpolator(ANIM_ALL_APPS_FADE, INSTANT); + } else { + config.setInterpolator(ANIM_DEPTH, BLUR); + config.setInterpolator(ANIM_WORKSPACE_SCALE, WORKSPACE_SCALE); + config.setInterpolator(ANIM_HOTSEAT_FADE, HOTSEAT_FADE); + config.setInterpolator(ANIM_HOTSEAT_TRANSLATE, HOTSEAT_TRANSLATE); + config.setInterpolator(ANIM_SCRIM_FADE, SCRIM_FADE); + config.setInterpolator(ANIM_ALL_APPS_FADE, ALL_APPS_FADE); + config.setInterpolator(ANIM_VERTICAL_PROGRESS, ALL_APPS_VERTICAL_PROGRESS); + } } - - } 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 52a67593ca..ec921e8f56 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/states/AllAppsState.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/states/AllAppsState.java @@ -59,15 +59,21 @@ public class AllAppsState extends LauncherState { @Override public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) { - ScaleAndTranslation scaleAndTranslation = - new ScaleAndTranslation(NO_SCALE, NO_OFFSET, NO_OFFSET); + return new ScaleAndTranslation(0.97f, NO_OFFSET, NO_OFFSET); + } + + @Override + public ScaleAndTranslation getHotseatScaleAndTranslation(Launcher launcher) { if (launcher.getDeviceProfile().isTablet) { - scaleAndTranslation.scale = 0.97f; + return getWorkspaceScaleAndTranslation(launcher); } else { - scaleAndTranslation.translationY = - -launcher.getAllAppsController().getShiftRange() * PARALLAX_COEFFICIENT; + ScaleAndTranslation overviewScaleAndTranslation = LauncherState.OVERVIEW + .getWorkspaceScaleAndTranslation(launcher); + return new ScaleAndTranslation( + NO_SCALE, + overviewScaleAndTranslation.translationX, + overviewScaleAndTranslation.translationY); } - return scaleAndTranslation; } @Override