Loading quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml +1 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ android:id="@+id/drag_layer" android:layout_width="match_parent" android:layout_height="match_parent" android:clipChildren="false" android:fitsSystemWindows="true"> <com.android.quickstep.fallback.FallbackRecentsView Loading quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java +27 −42 Original line number Diff line number Diff line Loading @@ -49,64 +49,62 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_S import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_TRANSLATE; import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON; import static com.android.quickstep.SysUINavigationMode.removeShelfFromOverview; import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_OFFSET; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.view.View; import android.view.animation.Interpolator; import com.android.launcher3.CellLayout; import com.android.launcher3.Hotseat; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherState.ScaleAndTranslation; import com.android.launcher3.Workspace; import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.SpringAnimationBuilder; import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory; import com.android.launcher3.states.StateAnimationConfig; import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.util.RecentsAtomicAnimationFactory; import com.android.quickstep.views.RecentsView; /** * Animation factory for quickstep specific transitions */ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<LauncherState> { public class QuickstepAtomicAnimationFactory extends RecentsAtomicAnimationFactory<Launcher, LauncherState> { // Scale recents takes before animating in private static final float RECENTS_PREPARE_SCALE = 1.33f; public static final int INDEX_SHELF_ANIM = 0; public static final int INDEX_RECENTS_FADE_ANIM = 1; public static final int INDEX_RECENTS_TRANSLATE_X_ANIM = 2; public static final int INDEX_PAUSE_TO_OVERVIEW_ANIM = 3; private static final int ANIM_COUNT = 4; public static final int INDEX_SHELF_ANIM = RecentsAtomicAnimationFactory.NEXT_INDEX + 0; public static final int INDEX_PAUSE_TO_OVERVIEW_ANIM = RecentsAtomicAnimationFactory.NEXT_INDEX + 1; public static final long ATOMIC_DURATION_FROM_PAUSED_TO_OVERVIEW = 300; private static final int MY_ANIM_COUNT = 2; protected static final int NEXT_INDEX = RecentsAtomicAnimationFactory.NEXT_INDEX + MY_ANIM_COUNT; private final QuickstepLauncher mLauncher; public static final long ATOMIC_DURATION_FROM_PAUSED_TO_OVERVIEW = 300; public QuickstepAtomicAnimationFactory(QuickstepLauncher launcher) { super(ANIM_COUNT); mLauncher = launcher; public QuickstepAtomicAnimationFactory(QuickstepLauncher activity) { super(activity, MY_ANIM_COUNT); } @Override public Animator createStateElementAnimation(int index, float... values) { switch (index) { case INDEX_SHELF_ANIM: { AllAppsTransitionController aatc = mLauncher.getAllAppsController(); AllAppsTransitionController aatc = mActivity.getAllAppsController(); Animator springAnim = aatc.createSpringAnimation(values); if ((OVERVIEW.getVisibleElements(mLauncher) & HOTSEAT_ICONS) != 0) { if ((OVERVIEW.getVisibleElements(mActivity) & HOTSEAT_ICONS) != 0) { // Translate hotseat with the shelf until reaching overview. float overviewProgress = OVERVIEW.getVerticalProgress(mLauncher); ScaleAndTranslation sat = OVERVIEW.getHotseatScaleAndTranslation(mLauncher); float overviewProgress = OVERVIEW.getVerticalProgress(mActivity); ScaleAndTranslation sat = OVERVIEW.getHotseatScaleAndTranslation(mActivity); float shiftRange = aatc.getShiftRange(); if (values.length == 1) { values = new float[] {aatc.getProgress(), values[0]}; Loading @@ -114,9 +112,9 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun ValueAnimator hotseatAnim = ValueAnimator.ofFloat(values); hotseatAnim.addUpdateListener(anim -> { float progress = (Float) anim.getAnimatedValue(); if (progress >= overviewProgress || mLauncher.isInState(BACKGROUND_APP)) { if (progress >= overviewProgress || mActivity.isInState(BACKGROUND_APP)) { float hotseatShift = (progress - overviewProgress) * shiftRange; mLauncher.getHotseat().setTranslationY(hotseatShift + sat.translationY); mActivity.getHotseat().setTranslationY(hotseatShift + sat.translationY); } }); hotseatAnim.setInterpolator(LINEAR); Loading @@ -130,34 +128,21 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun return springAnim; } case INDEX_RECENTS_FADE_ANIM: return ObjectAnimator.ofFloat(mLauncher.getOverviewPanel(), RecentsView.CONTENT_ALPHA, values); case INDEX_RECENTS_TRANSLATE_X_ANIM: { RecentsView rv = mLauncher.getOverviewPanel(); return new SpringAnimationBuilder(mLauncher) .setMinimumVisibleChange(1f / rv.getPageOffsetScale()) .setDampingRatio(0.8f) .setStiffness(250) .setValues(values) .build(rv, ADJACENT_PAGE_OFFSET); } case INDEX_PAUSE_TO_OVERVIEW_ANIM: { StateAnimationConfig config = new StateAnimationConfig(); config.duration = ATOMIC_DURATION_FROM_PAUSED_TO_OVERVIEW; config.setInterpolator(ANIM_VERTICAL_PROGRESS, OVERSHOOT_1_2); config.setInterpolator(ANIM_ALL_APPS_FADE, DEACCEL_3); if ((OVERVIEW.getVisibleElements(mLauncher) & HOTSEAT_ICONS) != 0) { if ((OVERVIEW.getVisibleElements(mActivity) & HOTSEAT_ICONS) != 0) { config.setInterpolator(ANIM_HOTSEAT_SCALE, OVERSHOOT_1_2); config.setInterpolator(ANIM_HOTSEAT_TRANSLATE, OVERSHOOT_1_2); } StateManager<LauncherState> stateManager = mLauncher.getStateManager(); StateManager<LauncherState> stateManager = mActivity.getStateManager(); return stateManager.createAtomicAnimation( stateManager.getCurrentStableState(), OVERVIEW, config); } default: return super.createStateElementAnimation(index, values); } Loading @@ -172,7 +157,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun config.setInterpolator(ANIM_OVERVIEW_SCALE, clampToProgress(ACCEL, 0, 0.9f)); config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, ACCEL); config.setInterpolator(ANIM_OVERVIEW_FADE, DEACCEL_1_7); Workspace workspace = mLauncher.getWorkspace(); Workspace workspace = mActivity.getWorkspace(); // Start from a higher workspace scale, but only if we're invisible so we don't jump. boolean isWorkspaceVisible = workspace.getVisibility() == VISIBLE; Loading @@ -186,13 +171,13 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun workspace.setScaleX(0.92f); workspace.setScaleY(0.92f); } Hotseat hotseat = mLauncher.getHotseat(); Hotseat hotseat = mActivity.getHotseat(); boolean isHotseatVisible = hotseat.getVisibility() == VISIBLE && hotseat.getAlpha() > 0; if (!isHotseatVisible) { hotseat.setScaleX(0.92f); hotseat.setScaleY(0.92f); if (ENABLE_OVERVIEW_ACTIONS.get()) { AllAppsContainerView qsbContainer = mLauncher.getAppsView(); AllAppsContainerView qsbContainer = mActivity.getAppsView(); View qsb = qsbContainer.getSearchView(); boolean qsbVisible = qsb.getVisibility() == VISIBLE && qsb.getAlpha() > 0; if (!qsbVisible) { Loading @@ -209,7 +194,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, OVERSHOOT_1_7); config.setInterpolator(ANIM_OVERVIEW_SCRIM_FADE, FAST_OUT_SLOW_IN); } else if ((fromState == NORMAL || fromState == HINT_STATE) && toState == OVERVIEW) { if (SysUINavigationMode.getMode(mLauncher) == NO_BUTTON) { if (SysUINavigationMode.getMode(mActivity) == NO_BUTTON) { config.setInterpolator(ANIM_WORKSPACE_SCALE, fromState == NORMAL ? ACCEL : OVERSHOOT_1_2); config.setInterpolator(ANIM_WORKSPACE_TRANSLATE, ACCEL); Loading @@ -217,7 +202,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun config.setInterpolator(ANIM_WORKSPACE_SCALE, OVERSHOOT_1_2); // Scale up the recents, if it is not coming from the side RecentsView overview = mLauncher.getOverviewPanel(); RecentsView overview = mActivity.getOverviewPanel(); if (overview.getVisibility() != VISIBLE || overview.getContentAlpha() == 0) { SCALE_PROPERTY.set(overview, RECENTS_PREPARE_SCALE); } Loading @@ -225,7 +210,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun config.setInterpolator(ANIM_WORKSPACE_FADE, OVERSHOOT_1_2); config.setInterpolator(ANIM_OVERVIEW_SCALE, OVERSHOOT_1_2); Interpolator translationInterpolator = ENABLE_OVERVIEW_ACTIONS.get() && removeShelfFromOverview(mLauncher) && removeShelfFromOverview(mActivity) ? OVERSHOOT_1_2 : OVERSHOOT_1_7; config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, translationInterpolator); Loading quickstep/recents_ui_overrides/src/com/android/quickstep/AppToOverviewAnimationProvider.java +0 −1 Original line number Diff line number Diff line Loading @@ -77,7 +77,6 @@ final class AppToOverviewAnimationProvider<T extends StatefulActivity<?>> extend controller.dispatchOnStart(); controller.getAnimationPlayer().end(); }); factory.onRemoteAnimationReceived(null); factory.createActivityInterface(RECENTS_LAUNCH_DURATION); factory.setRecentsAttachedToAppWindow(true, false); mActivity = activity; Loading quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java +2 −3 Original line number Diff line number Diff line Loading @@ -55,7 +55,6 @@ import com.android.launcher3.views.FloatingIconView; import com.android.quickstep.RecentsAnimationCallbacks.RecentsAnimationListener; import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.ActivityInitListener; import com.android.quickstep.util.AppWindowAnimationHelper; import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.TaskViewSimulator; import com.android.quickstep.util.TransformParams; Loading Loading @@ -511,8 +510,8 @@ public abstract class BaseSwipeUpHandler<T extends StatefulActivity<?>, Q extend public interface Factory { BaseSwipeUpHandler newHandler(GestureState gestureState, long touchTimeMs, boolean continuingLastGesture, boolean isLikelyToStartNewTask); BaseSwipeUpHandler newHandler( GestureState gestureState, long touchTimeMs, boolean continuingLastGesture); } protected interface RunningWindowAnim { Loading quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java→quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandlerV2.java +27 −92 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.quickstep; import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER; import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.anim.Interpolators.DEACCEL; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2; Loading @@ -38,29 +37,24 @@ import static com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState.PEEK; import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.graphics.PointF; import android.graphics.RectF; import android.os.Build; import android.os.SystemClock; import android.os.UserHandle; import android.view.View; import android.view.View.OnApplyWindowInsetsListener; import android.view.ViewTreeObserver.OnDrawListener; import android.view.WindowInsets; import android.view.animation.Interpolator; import androidx.annotation.NonNull; import androidx.annotation.UiThread; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; Loading @@ -72,7 +66,6 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.views.FloatingIconView; import com.android.quickstep.BaseActivityInterface.AnimationFactory; import com.android.quickstep.GestureState.GestureEndTarget; import com.android.quickstep.inputconsumers.OverviewInputConsumer; Loading @@ -80,7 +73,6 @@ import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.ShelfPeekAnim; import com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState; import com.android.quickstep.util.StaggeredWorkspaceAnim; import com.android.quickstep.util.TransformParams.TargetAlphaProvider; import com.android.quickstep.views.LiveTileOverlay; import com.android.quickstep.views.RecentsView; Loading @@ -92,11 +84,12 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat; /** * Handles the navigation gestures when Launcher is the default home activity. * TODO: Merge this with BaseSwipeUpHandler */ @TargetApi(Build.VERSION_CODES.O) public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsView> implements OnApplyWindowInsetsListener { private static final String TAG = LauncherSwipeHandler.class.getSimpleName(); public abstract class BaseSwipeUpHandlerV2<T extends StatefulActivity<?>, Q extends RecentsView> extends BaseSwipeUpHandler<T, Q> implements OnApplyWindowInsetsListener { private static final String TAG = BaseSwipeUpHandlerV2.class.getSimpleName(); private static final String[] STATE_NAMES = DEBUG_STATES ? new String[16] : null; Loading @@ -108,9 +101,11 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi } // Launcher UI related states private static final int STATE_LAUNCHER_PRESENT = getFlagForIndex(0, "STATE_LAUNCHER_PRESENT"); private static final int STATE_LAUNCHER_STARTED = getFlagForIndex(1, "STATE_LAUNCHER_STARTED"); private static final int STATE_LAUNCHER_DRAWN = getFlagForIndex(2, "STATE_LAUNCHER_DRAWN"); protected static final int STATE_LAUNCHER_PRESENT = getFlagForIndex(0, "STATE_LAUNCHER_PRESENT"); protected static final int STATE_LAUNCHER_STARTED = getFlagForIndex(1, "STATE_LAUNCHER_STARTED"); protected static final int STATE_LAUNCHER_DRAWN = getFlagForIndex(2, "STATE_LAUNCHER_DRAWN"); // Internal initialization states private static final int STATE_APP_CONTROLLER_RECEIVED = Loading @@ -122,7 +117,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi private static final int STATE_SCALED_CONTROLLER_RECENTS = getFlagForIndex(5, "STATE_SCALED_CONTROLLER_RECENTS"); private static final int STATE_HANDLER_INVALIDATED = protected static final int STATE_HANDLER_INVALIDATED = getFlagForIndex(6, "STATE_HANDLER_INVALIDATED"); private static final int STATE_GESTURE_STARTED = getFlagForIndex(7, "STATE_GESTURE_STARTED"); Loading Loading @@ -163,7 +158,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi */ private static final int LOG_NO_OP_PAGE_INDEX = -1; private final TaskAnimationManager mTaskAnimationManager; protected final TaskAnimationManager mTaskAnimationManager; // Either RectFSpringAnim (if animating home) or ObjectAnimator (from mCurrentShift) otherwise private RunningWindowAnim mRunningWindowAnim; Loading Loading @@ -193,7 +188,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi private final Runnable mOnDeferredActivityLaunch = this::onDeferredActivityLaunch; public LauncherSwipeHandler(Context context, RecentsAnimationDeviceState deviceState, public BaseSwipeUpHandlerV2(Context context, RecentsAnimationDeviceState deviceState, TaskAnimationManager taskAnimationManager, GestureState gestureState, long touchTimeMs, boolean continuingLastGesture, InputConsumerController inputConsumer) { Loading Loading @@ -222,9 +217,6 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi | STATE_GESTURE_CANCELLED, this::resetStateForAnimationCancel); mStateCallback.runOnceAtState(STATE_LAUNCHER_STARTED | STATE_APP_CONTROLLER_RECEIVED, this::sendRemoteAnimationsToAnimationFactory); mStateCallback.runOnceAtState(STATE_RESUME_LAST_TASK | STATE_APP_CONTROLLER_RECEIVED, this::resumeLastTask); mStateCallback.runOnceAtState(STATE_START_NEW_TASK | STATE_SCREENSHOT_CAPTURED, Loading Loading @@ -272,7 +264,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi @Override protected boolean onActivityInit(Boolean alreadyOnHome) { super.onActivityInit(alreadyOnHome); final Launcher activity = mActivityInterface.getCreatedActivity(); final T activity = mActivityInterface.getCreatedActivity(); if (mActivity == activity) { return true; } Loading Loading @@ -323,7 +315,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi } private void onLauncherStart() { final Launcher activity = mActivityInterface.getCreatedActivity(); final T activity = mActivityInterface.getCreatedActivity(); if (mActivity != activity) { return; } Loading Loading @@ -411,6 +403,10 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi updateSysUiFlags(mCurrentShift.value); return; } notifyGestureAnimationStartToRecents(); } protected void notifyGestureAnimationStartToRecents() { mRecentsView.onGestureAnimationStart(mGestureState.getRunningTaskId()); } Loading @@ -418,10 +414,6 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi mLauncherFrameDrawnTime = SystemClock.uptimeMillis(); } private void sendRemoteAnimationsToAnimationFactory() { mAnimationFactory.onRemoteAnimationReceived(mRecentsAnimationTargets); } private void initializeLauncherAnimationController() { buildAnimationController(); Loading Loading @@ -633,7 +625,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi */ @UiThread private void notifyGestureStartedAsync() { final Launcher curActivity = mActivity; final T curActivity = mActivity; if (curActivity != null) { // Once the gesture starts, we can no longer transition home through the button, so // reset the force override of the activity visibility Loading Loading @@ -681,7 +673,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi endLauncherTransitionController(); if (!ENABLE_QUICKSTEP_LIVE_TILE.get()) { // Hide the task view, if not already hidden setTargetAlphaProvider(LauncherSwipeHandler::getHiddenTargetAlpha); setTargetAlphaProvider(BaseSwipeUpHandlerV2::getHiddenTargetAlpha); } StatefulActivity activity = mActivityInterface.getCreatedActivity(); Loading Loading @@ -911,6 +903,8 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi interpolator, target, velocityPxPerMs)); } protected abstract HomeAnimationFactory createHomeAnimationFactory(long duration); @UiThread private void animateToProgressInternal(float start, float end, long duration, Interpolator interpolator, GestureEndTarget target, PointF velocityPxPerMs) { Loading @@ -919,67 +913,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi maybeUpdateRecentsAttachedState(); if (mGestureState.getEndTarget() == HOME) { HomeAnimationFactory homeAnimFactory; if (mActivity != null) { final TaskView runningTaskView = mRecentsView.getRunningTaskView(); final View workspaceView; if (runningTaskView != null && runningTaskView.getTask().key.getComponent() != null) { workspaceView = mActivity.getWorkspace().getFirstMatchForAppClose( runningTaskView.getTask().key.getComponent().getPackageName(), UserHandle.of(runningTaskView.getTask().key.userId)); } else { workspaceView = null; } final RectF iconLocation = new RectF(); boolean canUseWorkspaceView = workspaceView != null && workspaceView.isAttachedToWindow(); FloatingIconView floatingIconView = canUseWorkspaceView ? FloatingIconView.getFloatingIconView(mActivity, workspaceView, true /* hideOriginal */, iconLocation, false /* isOpening */) : null; mActivity.getRootView().setForceHideBackArrow(true); mActivityInterface.setHintUserWillBeActive(); homeAnimFactory = new HomeAnimationFactory(floatingIconView) { @Override public RectF getWindowTargetRect() { if (canUseWorkspaceView) { return iconLocation; } else { return super.getWindowTargetRect(); } } @NonNull @Override public AnimatorPlaybackController createActivityAnimationToHome() { // Return an empty APC here since we have an non-user controlled animation // to home. long accuracy = 2 * Math.max(mDp.widthPx, mDp.heightPx); return mActivity.getStateManager().createAnimationToNewWorkspace( NORMAL, accuracy, 0 /* animComponents */); } @Override public void playAtomicAnimation(float velocity) { new StaggeredWorkspaceAnim(mActivity, velocity, true /* animateOverviewScrim */).start(); } }; } else { homeAnimFactory = new HomeAnimationFactory(null) { @Override public AnimatorPlaybackController createActivityAnimationToHome() { return AnimatorPlaybackController.wrap(new AnimatorSet(), duration); } }; mStateCallback.addChangeListener(STATE_LAUNCHER_PRESENT | STATE_HANDLER_INVALIDATED, isPresent -> mRecentsView.startHome()); } HomeAnimationFactory homeAnimFactory = createHomeAnimationFactory(duration); RectFSpringAnim windowAnim = createWindowAnimationToHome(start, homeAnimFactory); windowAnim.addAnimatorListener(new AnimationSuccessListener() { @Override Loading Loading @@ -1303,14 +1237,15 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi // If there are no targets or the animation not started, then there is nothing to finish mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED); } else { mRecentsAnimationController.finish(true /* toRecents */, () -> mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED), true /* sendUserLeaveHint */); finishRecentsControllerToHome( () -> mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED)); } ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation", true); doLogGesture(HOME); } protected abstract void finishRecentsControllerToHome(Runnable callback); private void setupLauncherUiAfterSwipeUpToRecentsAnimation() { endLauncherTransitionController(); mActivityInterface.onSwipeUpToRecentsComplete(); Loading Loading
quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml +1 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ android:id="@+id/drag_layer" android:layout_width="match_parent" android:layout_height="match_parent" android:clipChildren="false" android:fitsSystemWindows="true"> <com.android.quickstep.fallback.FallbackRecentsView Loading
quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java +27 −42 Original line number Diff line number Diff line Loading @@ -49,64 +49,62 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_S import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_TRANSLATE; import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON; import static com.android.quickstep.SysUINavigationMode.removeShelfFromOverview; import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_OFFSET; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.view.View; import android.view.animation.Interpolator; import com.android.launcher3.CellLayout; import com.android.launcher3.Hotseat; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherState.ScaleAndTranslation; import com.android.launcher3.Workspace; import com.android.launcher3.allapps.AllAppsContainerView; import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.SpringAnimationBuilder; import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory; import com.android.launcher3.states.StateAnimationConfig; import com.android.launcher3.uioverrides.QuickstepLauncher; import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.util.RecentsAtomicAnimationFactory; import com.android.quickstep.views.RecentsView; /** * Animation factory for quickstep specific transitions */ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<LauncherState> { public class QuickstepAtomicAnimationFactory extends RecentsAtomicAnimationFactory<Launcher, LauncherState> { // Scale recents takes before animating in private static final float RECENTS_PREPARE_SCALE = 1.33f; public static final int INDEX_SHELF_ANIM = 0; public static final int INDEX_RECENTS_FADE_ANIM = 1; public static final int INDEX_RECENTS_TRANSLATE_X_ANIM = 2; public static final int INDEX_PAUSE_TO_OVERVIEW_ANIM = 3; private static final int ANIM_COUNT = 4; public static final int INDEX_SHELF_ANIM = RecentsAtomicAnimationFactory.NEXT_INDEX + 0; public static final int INDEX_PAUSE_TO_OVERVIEW_ANIM = RecentsAtomicAnimationFactory.NEXT_INDEX + 1; public static final long ATOMIC_DURATION_FROM_PAUSED_TO_OVERVIEW = 300; private static final int MY_ANIM_COUNT = 2; protected static final int NEXT_INDEX = RecentsAtomicAnimationFactory.NEXT_INDEX + MY_ANIM_COUNT; private final QuickstepLauncher mLauncher; public static final long ATOMIC_DURATION_FROM_PAUSED_TO_OVERVIEW = 300; public QuickstepAtomicAnimationFactory(QuickstepLauncher launcher) { super(ANIM_COUNT); mLauncher = launcher; public QuickstepAtomicAnimationFactory(QuickstepLauncher activity) { super(activity, MY_ANIM_COUNT); } @Override public Animator createStateElementAnimation(int index, float... values) { switch (index) { case INDEX_SHELF_ANIM: { AllAppsTransitionController aatc = mLauncher.getAllAppsController(); AllAppsTransitionController aatc = mActivity.getAllAppsController(); Animator springAnim = aatc.createSpringAnimation(values); if ((OVERVIEW.getVisibleElements(mLauncher) & HOTSEAT_ICONS) != 0) { if ((OVERVIEW.getVisibleElements(mActivity) & HOTSEAT_ICONS) != 0) { // Translate hotseat with the shelf until reaching overview. float overviewProgress = OVERVIEW.getVerticalProgress(mLauncher); ScaleAndTranslation sat = OVERVIEW.getHotseatScaleAndTranslation(mLauncher); float overviewProgress = OVERVIEW.getVerticalProgress(mActivity); ScaleAndTranslation sat = OVERVIEW.getHotseatScaleAndTranslation(mActivity); float shiftRange = aatc.getShiftRange(); if (values.length == 1) { values = new float[] {aatc.getProgress(), values[0]}; Loading @@ -114,9 +112,9 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun ValueAnimator hotseatAnim = ValueAnimator.ofFloat(values); hotseatAnim.addUpdateListener(anim -> { float progress = (Float) anim.getAnimatedValue(); if (progress >= overviewProgress || mLauncher.isInState(BACKGROUND_APP)) { if (progress >= overviewProgress || mActivity.isInState(BACKGROUND_APP)) { float hotseatShift = (progress - overviewProgress) * shiftRange; mLauncher.getHotseat().setTranslationY(hotseatShift + sat.translationY); mActivity.getHotseat().setTranslationY(hotseatShift + sat.translationY); } }); hotseatAnim.setInterpolator(LINEAR); Loading @@ -130,34 +128,21 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun return springAnim; } case INDEX_RECENTS_FADE_ANIM: return ObjectAnimator.ofFloat(mLauncher.getOverviewPanel(), RecentsView.CONTENT_ALPHA, values); case INDEX_RECENTS_TRANSLATE_X_ANIM: { RecentsView rv = mLauncher.getOverviewPanel(); return new SpringAnimationBuilder(mLauncher) .setMinimumVisibleChange(1f / rv.getPageOffsetScale()) .setDampingRatio(0.8f) .setStiffness(250) .setValues(values) .build(rv, ADJACENT_PAGE_OFFSET); } case INDEX_PAUSE_TO_OVERVIEW_ANIM: { StateAnimationConfig config = new StateAnimationConfig(); config.duration = ATOMIC_DURATION_FROM_PAUSED_TO_OVERVIEW; config.setInterpolator(ANIM_VERTICAL_PROGRESS, OVERSHOOT_1_2); config.setInterpolator(ANIM_ALL_APPS_FADE, DEACCEL_3); if ((OVERVIEW.getVisibleElements(mLauncher) & HOTSEAT_ICONS) != 0) { if ((OVERVIEW.getVisibleElements(mActivity) & HOTSEAT_ICONS) != 0) { config.setInterpolator(ANIM_HOTSEAT_SCALE, OVERSHOOT_1_2); config.setInterpolator(ANIM_HOTSEAT_TRANSLATE, OVERSHOOT_1_2); } StateManager<LauncherState> stateManager = mLauncher.getStateManager(); StateManager<LauncherState> stateManager = mActivity.getStateManager(); return stateManager.createAtomicAnimation( stateManager.getCurrentStableState(), OVERVIEW, config); } default: return super.createStateElementAnimation(index, values); } Loading @@ -172,7 +157,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun config.setInterpolator(ANIM_OVERVIEW_SCALE, clampToProgress(ACCEL, 0, 0.9f)); config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, ACCEL); config.setInterpolator(ANIM_OVERVIEW_FADE, DEACCEL_1_7); Workspace workspace = mLauncher.getWorkspace(); Workspace workspace = mActivity.getWorkspace(); // Start from a higher workspace scale, but only if we're invisible so we don't jump. boolean isWorkspaceVisible = workspace.getVisibility() == VISIBLE; Loading @@ -186,13 +171,13 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun workspace.setScaleX(0.92f); workspace.setScaleY(0.92f); } Hotseat hotseat = mLauncher.getHotseat(); Hotseat hotseat = mActivity.getHotseat(); boolean isHotseatVisible = hotseat.getVisibility() == VISIBLE && hotseat.getAlpha() > 0; if (!isHotseatVisible) { hotseat.setScaleX(0.92f); hotseat.setScaleY(0.92f); if (ENABLE_OVERVIEW_ACTIONS.get()) { AllAppsContainerView qsbContainer = mLauncher.getAppsView(); AllAppsContainerView qsbContainer = mActivity.getAppsView(); View qsb = qsbContainer.getSearchView(); boolean qsbVisible = qsb.getVisibility() == VISIBLE && qsb.getAlpha() > 0; if (!qsbVisible) { Loading @@ -209,7 +194,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, OVERSHOOT_1_7); config.setInterpolator(ANIM_OVERVIEW_SCRIM_FADE, FAST_OUT_SLOW_IN); } else if ((fromState == NORMAL || fromState == HINT_STATE) && toState == OVERVIEW) { if (SysUINavigationMode.getMode(mLauncher) == NO_BUTTON) { if (SysUINavigationMode.getMode(mActivity) == NO_BUTTON) { config.setInterpolator(ANIM_WORKSPACE_SCALE, fromState == NORMAL ? ACCEL : OVERSHOOT_1_2); config.setInterpolator(ANIM_WORKSPACE_TRANSLATE, ACCEL); Loading @@ -217,7 +202,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun config.setInterpolator(ANIM_WORKSPACE_SCALE, OVERSHOOT_1_2); // Scale up the recents, if it is not coming from the side RecentsView overview = mLauncher.getOverviewPanel(); RecentsView overview = mActivity.getOverviewPanel(); if (overview.getVisibility() != VISIBLE || overview.getContentAlpha() == 0) { SCALE_PROPERTY.set(overview, RECENTS_PREPARE_SCALE); } Loading @@ -225,7 +210,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory<Laun config.setInterpolator(ANIM_WORKSPACE_FADE, OVERSHOOT_1_2); config.setInterpolator(ANIM_OVERVIEW_SCALE, OVERSHOOT_1_2); Interpolator translationInterpolator = ENABLE_OVERVIEW_ACTIONS.get() && removeShelfFromOverview(mLauncher) && removeShelfFromOverview(mActivity) ? OVERSHOOT_1_2 : OVERSHOOT_1_7; config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, translationInterpolator); Loading
quickstep/recents_ui_overrides/src/com/android/quickstep/AppToOverviewAnimationProvider.java +0 −1 Original line number Diff line number Diff line Loading @@ -77,7 +77,6 @@ final class AppToOverviewAnimationProvider<T extends StatefulActivity<?>> extend controller.dispatchOnStart(); controller.getAnimationPlayer().end(); }); factory.onRemoteAnimationReceived(null); factory.createActivityInterface(RECENTS_LAUNCH_DURATION); factory.setRecentsAttachedToAppWindow(true, false); mActivity = activity; Loading
quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java +2 −3 Original line number Diff line number Diff line Loading @@ -55,7 +55,6 @@ import com.android.launcher3.views.FloatingIconView; import com.android.quickstep.RecentsAnimationCallbacks.RecentsAnimationListener; import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.ActivityInitListener; import com.android.quickstep.util.AppWindowAnimationHelper; import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.TaskViewSimulator; import com.android.quickstep.util.TransformParams; Loading Loading @@ -511,8 +510,8 @@ public abstract class BaseSwipeUpHandler<T extends StatefulActivity<?>, Q extend public interface Factory { BaseSwipeUpHandler newHandler(GestureState gestureState, long touchTimeMs, boolean continuingLastGesture, boolean isLikelyToStartNewTask); BaseSwipeUpHandler newHandler( GestureState gestureState, long touchTimeMs, boolean continuingLastGesture); } protected interface RunningWindowAnim { Loading
quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java→quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandlerV2.java +27 −92 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.quickstep; import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER; import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.anim.Interpolators.DEACCEL; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2; Loading @@ -38,29 +37,24 @@ import static com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState.PEEK; import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.graphics.PointF; import android.graphics.RectF; import android.os.Build; import android.os.SystemClock; import android.os.UserHandle; import android.view.View; import android.view.View.OnApplyWindowInsetsListener; import android.view.ViewTreeObserver.OnDrawListener; import android.view.WindowInsets; import android.view.animation.Interpolator; import androidx.annotation.NonNull; import androidx.annotation.UiThread; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; Loading @@ -72,7 +66,6 @@ import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.views.FloatingIconView; import com.android.quickstep.BaseActivityInterface.AnimationFactory; import com.android.quickstep.GestureState.GestureEndTarget; import com.android.quickstep.inputconsumers.OverviewInputConsumer; Loading @@ -80,7 +73,6 @@ import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.RectFSpringAnim; import com.android.quickstep.util.ShelfPeekAnim; import com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState; import com.android.quickstep.util.StaggeredWorkspaceAnim; import com.android.quickstep.util.TransformParams.TargetAlphaProvider; import com.android.quickstep.views.LiveTileOverlay; import com.android.quickstep.views.RecentsView; Loading @@ -92,11 +84,12 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat; /** * Handles the navigation gestures when Launcher is the default home activity. * TODO: Merge this with BaseSwipeUpHandler */ @TargetApi(Build.VERSION_CODES.O) public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsView> implements OnApplyWindowInsetsListener { private static final String TAG = LauncherSwipeHandler.class.getSimpleName(); public abstract class BaseSwipeUpHandlerV2<T extends StatefulActivity<?>, Q extends RecentsView> extends BaseSwipeUpHandler<T, Q> implements OnApplyWindowInsetsListener { private static final String TAG = BaseSwipeUpHandlerV2.class.getSimpleName(); private static final String[] STATE_NAMES = DEBUG_STATES ? new String[16] : null; Loading @@ -108,9 +101,11 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi } // Launcher UI related states private static final int STATE_LAUNCHER_PRESENT = getFlagForIndex(0, "STATE_LAUNCHER_PRESENT"); private static final int STATE_LAUNCHER_STARTED = getFlagForIndex(1, "STATE_LAUNCHER_STARTED"); private static final int STATE_LAUNCHER_DRAWN = getFlagForIndex(2, "STATE_LAUNCHER_DRAWN"); protected static final int STATE_LAUNCHER_PRESENT = getFlagForIndex(0, "STATE_LAUNCHER_PRESENT"); protected static final int STATE_LAUNCHER_STARTED = getFlagForIndex(1, "STATE_LAUNCHER_STARTED"); protected static final int STATE_LAUNCHER_DRAWN = getFlagForIndex(2, "STATE_LAUNCHER_DRAWN"); // Internal initialization states private static final int STATE_APP_CONTROLLER_RECEIVED = Loading @@ -122,7 +117,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi private static final int STATE_SCALED_CONTROLLER_RECENTS = getFlagForIndex(5, "STATE_SCALED_CONTROLLER_RECENTS"); private static final int STATE_HANDLER_INVALIDATED = protected static final int STATE_HANDLER_INVALIDATED = getFlagForIndex(6, "STATE_HANDLER_INVALIDATED"); private static final int STATE_GESTURE_STARTED = getFlagForIndex(7, "STATE_GESTURE_STARTED"); Loading Loading @@ -163,7 +158,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi */ private static final int LOG_NO_OP_PAGE_INDEX = -1; private final TaskAnimationManager mTaskAnimationManager; protected final TaskAnimationManager mTaskAnimationManager; // Either RectFSpringAnim (if animating home) or ObjectAnimator (from mCurrentShift) otherwise private RunningWindowAnim mRunningWindowAnim; Loading Loading @@ -193,7 +188,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi private final Runnable mOnDeferredActivityLaunch = this::onDeferredActivityLaunch; public LauncherSwipeHandler(Context context, RecentsAnimationDeviceState deviceState, public BaseSwipeUpHandlerV2(Context context, RecentsAnimationDeviceState deviceState, TaskAnimationManager taskAnimationManager, GestureState gestureState, long touchTimeMs, boolean continuingLastGesture, InputConsumerController inputConsumer) { Loading Loading @@ -222,9 +217,6 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi | STATE_GESTURE_CANCELLED, this::resetStateForAnimationCancel); mStateCallback.runOnceAtState(STATE_LAUNCHER_STARTED | STATE_APP_CONTROLLER_RECEIVED, this::sendRemoteAnimationsToAnimationFactory); mStateCallback.runOnceAtState(STATE_RESUME_LAST_TASK | STATE_APP_CONTROLLER_RECEIVED, this::resumeLastTask); mStateCallback.runOnceAtState(STATE_START_NEW_TASK | STATE_SCREENSHOT_CAPTURED, Loading Loading @@ -272,7 +264,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi @Override protected boolean onActivityInit(Boolean alreadyOnHome) { super.onActivityInit(alreadyOnHome); final Launcher activity = mActivityInterface.getCreatedActivity(); final T activity = mActivityInterface.getCreatedActivity(); if (mActivity == activity) { return true; } Loading Loading @@ -323,7 +315,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi } private void onLauncherStart() { final Launcher activity = mActivityInterface.getCreatedActivity(); final T activity = mActivityInterface.getCreatedActivity(); if (mActivity != activity) { return; } Loading Loading @@ -411,6 +403,10 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi updateSysUiFlags(mCurrentShift.value); return; } notifyGestureAnimationStartToRecents(); } protected void notifyGestureAnimationStartToRecents() { mRecentsView.onGestureAnimationStart(mGestureState.getRunningTaskId()); } Loading @@ -418,10 +414,6 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi mLauncherFrameDrawnTime = SystemClock.uptimeMillis(); } private void sendRemoteAnimationsToAnimationFactory() { mAnimationFactory.onRemoteAnimationReceived(mRecentsAnimationTargets); } private void initializeLauncherAnimationController() { buildAnimationController(); Loading Loading @@ -633,7 +625,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi */ @UiThread private void notifyGestureStartedAsync() { final Launcher curActivity = mActivity; final T curActivity = mActivity; if (curActivity != null) { // Once the gesture starts, we can no longer transition home through the button, so // reset the force override of the activity visibility Loading Loading @@ -681,7 +673,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi endLauncherTransitionController(); if (!ENABLE_QUICKSTEP_LIVE_TILE.get()) { // Hide the task view, if not already hidden setTargetAlphaProvider(LauncherSwipeHandler::getHiddenTargetAlpha); setTargetAlphaProvider(BaseSwipeUpHandlerV2::getHiddenTargetAlpha); } StatefulActivity activity = mActivityInterface.getCreatedActivity(); Loading Loading @@ -911,6 +903,8 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi interpolator, target, velocityPxPerMs)); } protected abstract HomeAnimationFactory createHomeAnimationFactory(long duration); @UiThread private void animateToProgressInternal(float start, float end, long duration, Interpolator interpolator, GestureEndTarget target, PointF velocityPxPerMs) { Loading @@ -919,67 +913,7 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi maybeUpdateRecentsAttachedState(); if (mGestureState.getEndTarget() == HOME) { HomeAnimationFactory homeAnimFactory; if (mActivity != null) { final TaskView runningTaskView = mRecentsView.getRunningTaskView(); final View workspaceView; if (runningTaskView != null && runningTaskView.getTask().key.getComponent() != null) { workspaceView = mActivity.getWorkspace().getFirstMatchForAppClose( runningTaskView.getTask().key.getComponent().getPackageName(), UserHandle.of(runningTaskView.getTask().key.userId)); } else { workspaceView = null; } final RectF iconLocation = new RectF(); boolean canUseWorkspaceView = workspaceView != null && workspaceView.isAttachedToWindow(); FloatingIconView floatingIconView = canUseWorkspaceView ? FloatingIconView.getFloatingIconView(mActivity, workspaceView, true /* hideOriginal */, iconLocation, false /* isOpening */) : null; mActivity.getRootView().setForceHideBackArrow(true); mActivityInterface.setHintUserWillBeActive(); homeAnimFactory = new HomeAnimationFactory(floatingIconView) { @Override public RectF getWindowTargetRect() { if (canUseWorkspaceView) { return iconLocation; } else { return super.getWindowTargetRect(); } } @NonNull @Override public AnimatorPlaybackController createActivityAnimationToHome() { // Return an empty APC here since we have an non-user controlled animation // to home. long accuracy = 2 * Math.max(mDp.widthPx, mDp.heightPx); return mActivity.getStateManager().createAnimationToNewWorkspace( NORMAL, accuracy, 0 /* animComponents */); } @Override public void playAtomicAnimation(float velocity) { new StaggeredWorkspaceAnim(mActivity, velocity, true /* animateOverviewScrim */).start(); } }; } else { homeAnimFactory = new HomeAnimationFactory(null) { @Override public AnimatorPlaybackController createActivityAnimationToHome() { return AnimatorPlaybackController.wrap(new AnimatorSet(), duration); } }; mStateCallback.addChangeListener(STATE_LAUNCHER_PRESENT | STATE_HANDLER_INVALIDATED, isPresent -> mRecentsView.startHome()); } HomeAnimationFactory homeAnimFactory = createHomeAnimationFactory(duration); RectFSpringAnim windowAnim = createWindowAnimationToHome(start, homeAnimFactory); windowAnim.addAnimatorListener(new AnimationSuccessListener() { @Override Loading Loading @@ -1303,14 +1237,15 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler<Launcher, RecentsVi // If there are no targets or the animation not started, then there is nothing to finish mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED); } else { mRecentsAnimationController.finish(true /* toRecents */, () -> mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED), true /* sendUserLeaveHint */); finishRecentsControllerToHome( () -> mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED)); } ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation", true); doLogGesture(HOME); } protected abstract void finishRecentsControllerToHome(Runnable callback); private void setupLauncherUiAfterSwipeUpToRecentsAnimation() { endLauncherTransitionController(); mActivityInterface.onSwipeUpToRecentsComplete(); Loading