From 672d02cd394781c076ae70f64c2169f148da9e7a Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 13 May 2020 09:28:25 -0700 Subject: [PATCH] Unifying swipe handling for fallback launcher Previosuly we had a different swipe handler for 3P Launcher which started either recents or Launcher based on the initial interaction (horizontal or vertical). This was primarily because we had to wait for recents transition to finish before starting another activity which could delay going to home. Now we always start recents transition to recentsActivity. This allows us to use the same swipe handling logic as QuickstepLauncher. Home activity can be started while recents transition is running and can be controlled using onTaskAppeared callback. Bug: 156924169 Bug: 156398988 Bug: 156295255 Change-Id: Ib9f02e0281e8d674bde2f4a81eca5fc8a5962144 --- .../res/layout/fallback_recents_activity.xml | 1 + .../QuickstepAtomicAnimationFactory.java | 69 +-- .../AppToOverviewAnimationProvider.java | 1 - .../android/quickstep/BaseSwipeUpHandler.java | 5 +- ...Handler.java => BaseSwipeUpHandlerV2.java} | 119 +--- .../quickstep/FallbackActivityInterface.java | 78 +-- .../quickstep/FallbackSwipeHandler.java | 582 +++--------------- .../quickstep/LauncherActivityInterface.java | 237 ++----- .../quickstep/LauncherSwipeHandlerV2.java | 121 ++++ .../android/quickstep/RecentsActivity.java | 7 + .../quickstep/TouchInteractionService.java | 15 +- .../fallback/FallbackRecentsView.java | 51 +- .../DeviceLockedInputConsumer.java | 2 +- .../OtherActivityInputConsumer.java | 10 +- .../util/RecentsAtomicAnimationFactory.java | 67 ++ .../quickstep/views/ClearAllButton.java | 15 +- .../android/quickstep/views/RecentsView.java | 12 +- .../quickstep/BaseActivityInterface.java | 128 +++- .../launcher3/statemanager/StateManager.java | 2 + 19 files changed, 603 insertions(+), 919 deletions(-) rename quickstep/recents_ui_overrides/src/com/android/quickstep/{LauncherSwipeHandler.java => BaseSwipeUpHandlerV2.java} (92%) create mode 100644 quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandlerV2.java create mode 100644 quickstep/recents_ui_overrides/src/com/android/quickstep/util/RecentsAtomicAnimationFactory.java diff --git a/quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml b/quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml index ffe906c179..7b3e37835f 100644 --- a/quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml +++ b/quickstep/recents_ui_overrides/res/layout/fallback_recents_activity.xml @@ -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"> { +public class QuickstepAtomicAnimationFactory extends + RecentsAtomicAnimationFactory { // 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; + + private static final int MY_ANIM_COUNT = 2; + protected static final int NEXT_INDEX = RecentsAtomicAnimationFactory.NEXT_INDEX + + MY_ANIM_COUNT; public static final long ATOMIC_DURATION_FROM_PAUSED_TO_OVERVIEW = 300; - private final QuickstepLauncher mLauncher; - - 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]}; @@ -114,9 +112,9 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory { 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); @@ -130,34 +128,21 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory stateManager = mLauncher.getStateManager(); + StateManager stateManager = mActivity.getStateManager(); return stateManager.createAtomicAnimation( stateManager.getCurrentStableState(), OVERVIEW, config); } - default: return super.createStateElementAnimation(index, values); } @@ -172,7 +157,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory 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) { @@ -209,7 +194,7 @@ public class QuickstepAtomicAnimationFactory extends AtomicAnimationFactory> extend controller.dispatchOnStart(); controller.getAnimationPlayer().end(); }); - factory.onRemoteAnimationReceived(null); factory.createActivityInterface(RECENTS_LAUNCH_DURATION); factory.setRecentsAttachedToAppWindow(true, false); mActivity = activity; diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java index 66fefbe5ef..d9574184f7 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java @@ -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; @@ -511,8 +510,8 @@ public abstract class BaseSwipeUpHandler, 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 { diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandlerV2.java similarity index 92% rename from quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java rename to quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandlerV2.java index a8fa630b7b..343f28ac3d 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandlerV2.java @@ -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; @@ -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; @@ -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; @@ -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; @@ -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 - implements OnApplyWindowInsetsListener { - private static final String TAG = LauncherSwipeHandler.class.getSimpleName(); +public abstract class BaseSwipeUpHandlerV2, Q extends RecentsView> + extends BaseSwipeUpHandler implements OnApplyWindowInsetsListener { + private static final String TAG = BaseSwipeUpHandlerV2.class.getSimpleName(); private static final String[] STATE_NAMES = DEBUG_STATES ? new String[16] : null; @@ -108,9 +101,11 @@ public class LauncherSwipeHandler extends BaseSwipeUpHandler