Allow quick switch from 3P launcher home in 2 button mode

Only the FallbackSwipeHandler supports quickswitch mode on the
home screen, but we only used that handler for fully gestural
mode. Now we also use that handler for 2-button mode if both
of these conditions are met:
- User is on the home screen
- User swipes right on the nav region (instead of up)

Also fix issues with continuous quick switch gestures by setting
the appropriate end target NEW_TASK instead of HOME.

Bug: 140467002
Change-Id: I8f327638b48cf4c0acb1ebe265b7846afac6759b
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/FallbackSwipeHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/FallbackSwipeHandler.java
index c939de8..714de28 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/FallbackSwipeHandler.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/FallbackSwipeHandler.java
@@ -266,7 +266,7 @@
     @Override
     public void onConsumerAboutToBeSwitched() {
         if (mInQuickSwitchMode && mGestureState.getEndTarget() != null) {
-            mGestureState.setEndTarget(HOME);
+            mGestureState.setEndTarget(NEW_TASK);
 
             mCanceled = true;
             mCurrentShift.cancelAnimation();
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
index 07537ed..bafb2ef 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
@@ -559,10 +559,13 @@
         final boolean shouldDefer;
         final BaseSwipeUpHandler.Factory factory;
 
-        if (mDeviceState.isFullyGesturalNavMode()
-                && !mOverviewComponentObserver.isHomeAndOverviewSame()) {
+        if (!mOverviewComponentObserver.isHomeAndOverviewSame()) {
             shouldDefer = previousGestureState.getFinishingRecentsAnimationTaskId() < 0;
-            factory = mFallbackSwipeHandlerFactory;
+            if (mDeviceState.isFullyGesturalNavMode()) {
+                factory = mFallbackSwipeHandlerFactory;
+            } else {
+                factory = this::determineFallbackTwoButtonSwipeHandler;
+            }
         } else {
             shouldDefer = gestureState.getActivityInterface().deferStartingActivity(mDeviceState,
                     event);
@@ -575,6 +578,23 @@
                 mInputMonitorCompat, disableHorizontalSwipe, factory);
     }
 
+    /**
+     * Determines whether to use the LauncherSwipeHandler or FallbackSwipeHandler at runtime.
+     * We need to use the FallbackSwipeHandler to handle quick switch from home, otherwise the
+     * normal LauncherSwipeHandler works.
+     */
+    private BaseSwipeUpHandler determineFallbackTwoButtonSwipeHandler(GestureState gestureState,
+            long touchTimeMs, boolean continuingLastGesture, boolean isLikelyToStartNewTask) {
+        boolean runningOverHome = gestureState.getRunningTask() == null
+                || ActivityManagerWrapper.isHomeTask(gestureState.getRunningTask());
+        boolean isQuickSwitchMode = isLikelyToStartNewTask || continuingLastGesture;
+        BaseSwipeUpHandler.Factory factory = runningOverHome && isQuickSwitchMode
+                ? mFallbackSwipeHandlerFactory
+                : mLauncherSwipeHandlerFactory;
+        return factory.newHandler(gestureState, touchTimeMs, continuingLastGesture,
+                isLikelyToStartNewTask);
+    }
+
     private InputConsumer createDeviceLockedInputConsumer(GestureState gestureState) {
         if (mDeviceState.isFullyGesturalNavMode() && gestureState.getRunningTask() != null) {
             return new DeviceLockedInputConsumer(this, mDeviceState, mTaskAnimationManager,