Deleting Quickscrub related logic

Bug: 124255113
Change-Id: Ic5f2338f1e3ae0a0cfb08f822dee0e01ae54a7b0
diff --git a/go/quickstep/src/com/android/launcher3/GoLauncherAppTransitionManagerImpl.java b/go/quickstep/src/com/android/launcher3/GoLauncherAppTransitionManagerImpl.java
index 95d8c4e..96b4ae5 100644
--- a/go/quickstep/src/com/android/launcher3/GoLauncherAppTransitionManagerImpl.java
+++ b/go/quickstep/src/com/android/launcher3/GoLauncherAppTransitionManagerImpl.java
@@ -29,18 +29,6 @@
     }
 
     @Override
-    protected boolean isQuickSwitchInProgress() {
-        // Go does not support quick scrub.
-        return false;
-    }
-
-    @Override
-    protected ActivityOptions getQuickSwitchActivityOptions() {
-        // Go does not support quick scrub.
-        return null;
-    }
-
-    @Override
     protected void composeRecentsLaunchAnimator(AnimatorSet anim, View v,
             RemoteAnimationTargetCompat[] targets, boolean launcherClosing) {
         //TODO: Implement this based off IconRecentsView
diff --git a/go/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java b/go/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java
deleted file mode 100644
index 90360ce..0000000
--- a/go/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.uioverrides;
-
-/**
- * Extension of overview state used for QuickScrub. Same as {@link OverviewState} for Go as we do
- * not support quickscrub.
- */
-public final class FastOverviewState extends OverviewState {
-    public FastOverviewState(int id) {
-        super(id);
-    }
-}
diff --git a/go/quickstep/src/com/android/quickstep/LauncherActivityControllerHelper.java b/go/quickstep/src/com/android/quickstep/LauncherActivityControllerHelper.java
index e1df3ba..35ea9c7 100644
--- a/go/quickstep/src/com/android/quickstep/LauncherActivityControllerHelper.java
+++ b/go/quickstep/src/com/android/quickstep/LauncherActivityControllerHelper.java
@@ -18,7 +18,6 @@
 
 import static com.android.launcher3.LauncherState.OVERVIEW;
 
-import android.app.ActivityManager;
 import android.content.Context;
 import android.graphics.Rect;
 
@@ -31,7 +30,6 @@
 import com.android.launcher3.dragndrop.DragLayer;
 import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.launcher3.util.MultiValueAlpha.AlphaProperty;
-import com.android.quickstep.util.TransformedRect;
 import com.android.quickstep.views.IconRecentsView;
 import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
 
@@ -51,18 +49,6 @@
         return null;
     }
 
-    @Override
-    public void onQuickInteractionStart(Launcher activity, ActivityManager.RunningTaskInfo taskInfo,
-            boolean activityVisible, TouchInteractionLog touchInteractionLog) {
-        // Go does not have quick interactions.
-    }
-
-    @Override
-    public float getTranslationYForQuickScrub(TransformedRect targetRect, DeviceProfile dp,
-            Context context) {
-        // Go does not have quick scrub.
-        return 0;
-    }
 
     @Override
     public void executeOnWindowAvailable(Launcher activity, Runnable action) {
@@ -77,7 +63,7 @@
 
     @Override
     public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
-            int interactionType, TransformedRect outRect) {
+            Rect outRect) {
         // TODO Implement outRect depending on where the task should animate to.
         // Go does not support swipe up gesture.
         return 0;
@@ -101,8 +87,7 @@
         //TODO: Implement this based off where the recents view needs to be for app => recents anim.
         return new AnimationFactory() {
             @Override
-            public void createActivityController(long transitionLength,
-                    @TouchConsumer.InteractionType int interactionType) {}
+            public void createActivityController(long transitionLength) {}
 
             @Override
             public void onTransitionCancelled() {}
@@ -164,12 +149,6 @@
     }
 
     @Override
-    public boolean deferStartingActivity(int downHitTarget) {
-        // Go only supports back to overview so we always defer starting activity.
-        return true;
-    }
-
-    @Override
     public boolean supportsLongSwipe(Launcher activity) {
         // Go does not support long swipe from the app.
         return false;
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java
index 9921455..9cb4daf 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java
@@ -61,33 +61,16 @@
     }
 
     @Override
-    protected boolean isQuickSwitchInProgress() {
-        return mRecentsView.getQuickScrubController().isQuickSwitch();
-    }
-
-    @Override
-    protected ActivityOptions getQuickSwitchActivityOptions() {
-        return ActivityOptions.makeCustomAnimation(mLauncher, R.anim.no_anim,
-                R.anim.no_anim);
-    }
-
-    @Override
     protected void composeRecentsLaunchAnimator(@NonNull AnimatorSet anim, @NonNull View v,
             @NonNull RemoteAnimationTargetCompat[] targets, boolean launcherClosing) {
         RecentsView recentsView = mLauncher.getOverviewPanel();
         boolean skipLauncherChanges = !launcherClosing;
-        boolean isLaunchingFromQuickscrub =
-                recentsView.getQuickScrubController().isWaitingForTaskLaunch();
 
         TaskView taskView = findTaskViewToLaunch(mLauncher, v, targets);
 
-        int duration = isLaunchingFromQuickscrub
-                ? RECENTS_QUICKSCRUB_LAUNCH_DURATION
-                : RECENTS_LAUNCH_DURATION;
-
         ClipAnimationHelper helper = new ClipAnimationHelper(mLauncher);
         anim.play(getRecentsWindowAnimator(taskView, skipLauncherChanges, targets, helper)
-                .setDuration(duration));
+                .setDuration(RECENTS_LAUNCH_DURATION));
 
         Animator childStateAnimation = null;
         // Found a visible recents task that matches the opening app, lets launch the app from there
@@ -96,7 +79,7 @@
         if (launcherClosing) {
             launcherAnim = recentsView.createAdjacentPageAnimForTaskLaunch(taskView, helper);
             launcherAnim.setInterpolator(Interpolators.TOUCH_RESPONSE_INTERPOLATOR);
-            launcherAnim.setDuration(duration);
+            launcherAnim.setDuration(RECENTS_LAUNCH_DURATION);
 
             // Make sure recents gets fixed up by resetting task alphas and scales, etc.
             windowAnimEndListener = new AnimatorListenerAdapter() {
@@ -108,10 +91,11 @@
             };
         } else {
             AnimatorPlaybackController controller =
-                    mLauncher.getStateManager().createAnimationToNewWorkspace(NORMAL, duration);
+                    mLauncher.getStateManager().createAnimationToNewWorkspace(NORMAL,
+                            RECENTS_LAUNCH_DURATION);
             controller.dispatchOnStart();
             childStateAnimation = controller.getTarget();
-            launcherAnim = controller.getAnimationPlayer().setDuration(duration);
+            launcherAnim = controller.getAnimationPlayer().setDuration(RECENTS_LAUNCH_DURATION);
             windowAnimEndListener = new AnimatorListenerAdapter() {
                 @Override
                 public void onAnimationEnd(Animator animation) {
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/BackgroundAppState.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/BackgroundAppState.java
index 8d28f33..963f1fa 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/BackgroundAppState.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/BackgroundAppState.java
@@ -15,10 +15,11 @@
  */
 package com.android.launcher3.uioverrides;
 
+import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS;
+
 import android.os.RemoteException;
 import com.android.launcher3.Launcher;
 import com.android.launcher3.allapps.AllAppsTransitionController;
-import com.android.quickstep.QuickScrubController;
 import com.android.quickstep.RecentsModel;
 import com.android.quickstep.util.LayoutUtils;
 import com.android.quickstep.views.RecentsView;
@@ -33,7 +34,7 @@
             FLAG_DISABLE_RESTORE | FLAG_OVERVIEW_UI | FLAG_DISABLE_ACCESSIBILITY;
 
     public BackgroundAppState(int id) {
-        super(id, QuickScrubController.QUICK_SCRUB_FROM_HOME_START_DURATION, STATE_FLAGS);
+        super(id, OVERVIEW_TRANSITION_MS, STATE_FLAGS);
     }
 
     @Override
@@ -51,7 +52,7 @@
 
     @Override
     public float[] getOverviewScaleAndTranslationYFactor(Launcher launcher) {
-        // Initialize the recents view scale to what it would be when starting swipe up/quickscrub
+        // Initialize the recents view scale to what it would be when starting swipe up
         RecentsView recentsView = launcher.getOverviewPanel();
         recentsView.getTaskSize(sTempRect);
         int appWidth = launcher.getDragLayer().getWidth();
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/FastOverviewState.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/FastOverviewState.java
deleted file mode 100644
index 1d65a54..0000000
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/FastOverviewState.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.uioverrides;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Rect;
-
-import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.Launcher;
-import com.android.launcher3.R;
-import com.android.quickstep.QuickScrubController;
-import com.android.quickstep.views.RecentsView;
-
-/**
- * Extension of overview state used for QuickScrub
- */
-public class FastOverviewState extends OverviewState {
-
-    private static final float MAX_PREVIEW_SCALE_UP = 1.3f;
-    /**
-     * Vertical transition of the task previews relative to the full container.
-     */
-    public static final float OVERVIEW_TRANSLATION_FACTOR = 0.4f;
-    public static final float OVERVIEW_CENTERED_TRANSLATION_FACTOR = 0.5f;
-
-    private static final int STATE_FLAGS = FLAG_DISABLE_RESTORE | FLAG_DISABLE_INTERACTION
-            | FLAG_OVERVIEW_UI | FLAG_HIDE_BACK_BUTTON | FLAG_DISABLE_ACCESSIBILITY;
-
-    public FastOverviewState(int id) {
-        super(id, QuickScrubController.QUICK_SCRUB_FROM_HOME_START_DURATION, STATE_FLAGS);
-    }
-
-    @Override
-    public void onStateTransitionEnd(Launcher launcher) {
-        super.onStateTransitionEnd(launcher);
-        RecentsView recentsView = launcher.getOverviewPanel();
-        recentsView.getQuickScrubController().onFinishedTransitionToQuickScrub();
-    }
-
-    @Override
-    public int getVisibleElements(Launcher launcher) {
-        return NONE;
-    }
-
-    @Override
-    public float[] getOverviewScaleAndTranslationYFactor(Launcher launcher) {
-        RecentsView recentsView = launcher.getOverviewPanel();
-        recentsView.getTaskSize(sTempRect);
-
-        boolean isQuickSwitch = recentsView.getQuickScrubController().isQuickSwitch();
-        float translationYFactor = isQuickSwitch
-                ? OVERVIEW_CENTERED_TRANSLATION_FACTOR
-                : OVERVIEW_TRANSLATION_FACTOR;
-        return new float[] {getOverviewScale(launcher.getDeviceProfile(), sTempRect, launcher,
-                isQuickSwitch), translationYFactor};
-    }
-
-    public static float getOverviewScale(DeviceProfile dp, Rect taskRect, Context context,
-            boolean isQuickSwitch) {
-        if (dp.isVerticalBarLayout() && !isQuickSwitch) {
-            return 1f;
-        }
-
-        Resources res = context.getResources();
-        float usedHeight = taskRect.height() + res.getDimension(R.dimen.task_thumbnail_top_margin);
-        float usedWidth = taskRect.width() + 2 * (res.getDimension(R.dimen.recents_page_spacing)
-                + res.getDimension(R.dimen.quickscrub_adjacent_visible_width));
-        if (isQuickSwitch) {
-            usedWidth = taskRect.width();
-            return Math.max(dp.availableHeightPx / usedHeight, dp.availableWidthPx / usedWidth);
-        }
-        return Math.min(Math.min(dp.availableHeightPx / usedHeight,
-                dp.availableWidthPx / usedWidth), MAX_PREVIEW_SCALE_UP);
-    }
-
-    @Override
-    public void onStateDisabled(Launcher launcher) {
-        super.onStateDisabled(launcher);
-        launcher.<RecentsView>getOverviewPanel().getQuickScrubController().cancelActiveQuickscrub();
-    }
-}
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsViewStateController.java
index 7d7946d..1a61be6 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsViewStateController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsViewStateController.java
@@ -15,10 +15,6 @@
  */
 package com.android.launcher3.uioverrides;
 
-import static com.android.launcher3.LauncherState.FAST_OVERVIEW;
-import static com.android.launcher3.LauncherState.OVERVIEW;
-import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_START_INTERPOLATOR;
-import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_TRANSLATION_Y_FACTOR;
 import static com.android.quickstep.views.LauncherRecentsView.TRANSLATION_Y_FACTOR;
 import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA;
 
@@ -26,18 +22,16 @@
 import android.annotation.TargetApi;
 import android.os.Build;
 import android.util.FloatProperty;
-import android.view.animation.Interpolator;
-
-import androidx.annotation.NonNull;
 
 import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherState;
 import com.android.launcher3.LauncherStateManager.AnimationConfig;
 import com.android.launcher3.anim.AnimatorSetBuilder;
-import com.android.launcher3.anim.Interpolators;
 import com.android.quickstep.views.LauncherRecentsView;
 import com.android.quickstep.views.RecentsView;
 
+import androidx.annotation.NonNull;
+
 /**
  * State handler for handling UI changes for {@link LauncherRecentsView}. In addition to managing
  * the basic view properties, this class also manages changes in the task visuals.
@@ -81,16 +75,6 @@
     }
 
     @Override
-    Interpolator getScaleAndTransYInterpolator(@NonNull LauncherState toState,
-            @NonNull AnimatorSetBuilder builder) {
-        if (mLauncher.getStateManager().getState() == OVERVIEW && toState == FAST_OVERVIEW) {
-            return Interpolators.clampToProgress(QUICK_SCRUB_START_INTERPOLATOR, 0,
-                    QUICK_SCRUB_TRANSLATION_Y_FACTOR);
-        }
-        return super.getScaleAndTransYInterpolator(toState, builder);
-    }
-
-    @Override
     FloatProperty<LauncherRecentsView> getTranslationYFactorProperty() {
         return TRANSLATION_Y_FACTOR;
     }
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
index a3c942e..fcd9a2b 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
@@ -19,23 +19,16 @@
 
 import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
 import static com.android.launcher3.LauncherState.BACKGROUND_APP;
-import static com.android.launcher3.LauncherState.FAST_OVERVIEW;
 import static com.android.launcher3.LauncherState.NORMAL;
 import static com.android.launcher3.LauncherState.OVERVIEW;
 import static com.android.launcher3.allapps.AllAppsTransitionController.SPRING_DAMPING_RATIO;
 import static com.android.launcher3.allapps.AllAppsTransitionController.SPRING_STIFFNESS;
 import static com.android.launcher3.anim.Interpolators.LINEAR;
-import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK;
-import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL;
-import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB;
-import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK;
-import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_ROTATION;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
-import android.app.ActivityManager.RunningTaskInfo;
 import android.content.Context;
 import android.graphics.Rect;
 import android.graphics.RectF;
@@ -44,16 +37,11 @@
 import android.view.View;
 import android.view.animation.Interpolator;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.UiThread;
-
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherAppState;
 import com.android.launcher3.LauncherInitListener;
 import com.android.launcher3.LauncherState;
-import com.android.launcher3.R;
 import com.android.launcher3.TestProtocol;
 import com.android.launcher3.allapps.DiscoveryBounce;
 import com.android.launcher3.anim.AnimatorPlaybackController;
@@ -61,13 +49,10 @@
 import com.android.launcher3.compat.AccessibilityManagerCompat;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.dragndrop.DragLayer;
-import com.android.launcher3.uioverrides.FastOverviewState;
 import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.launcher3.util.MultiValueAlpha.AlphaProperty;
-import com.android.quickstep.TouchConsumer.InteractionType;
 import com.android.quickstep.util.ClipAnimationHelper;
 import com.android.quickstep.util.LayoutUtils;
-import com.android.quickstep.util.TransformedRect;
 import com.android.quickstep.views.LauncherLayoutListener;
 import com.android.quickstep.views.RecentsView;
 import com.android.quickstep.views.TaskView;
@@ -76,6 +61,10 @@
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.UiThread;
+
 /**
  * {@link ActivityControlHelper} for the in-launcher recents.
  */
@@ -87,59 +76,13 @@
     }
 
     @Override
-    public void onQuickInteractionStart(Launcher activity, RunningTaskInfo taskInfo,
-            boolean activityVisible, TouchInteractionLog touchInteractionLog) {
-        LauncherState fromState = activity.getStateManager().getState();
-        QuickScrubController controller = activity.<RecentsView>getOverviewPanel()
-                .getQuickScrubController();
-        boolean isQuickSwitch = controller.isQuickSwitch();
-        boolean animate = activityVisible;
-        if (isQuickSwitch && fromState == FAST_OVERVIEW && !animate) {
-            // We can already be in FAST_OVERVIEW if createActivityController() was called
-            // before us. This could happen, for instance, when launcher is slow to load when
-            // starting quick switch, causing us to call onQuickScrubStart() on the background
-            // thread. In this case, we also hadn't set isQuickSwitch = true before setting
-            // FAST_OVERVIEW, so we need to reapply FAST_OVERVIEW to take that into account.
-            activity.getStateManager().reapplyState();
-        } else {
-            activity.getStateManager().goToState(FAST_OVERVIEW, animate);
-        }
-
-        controller.onQuickScrubStart(activityVisible && !fromState.overviewUi, this,
-                touchInteractionLog);
-
-        if (!activityVisible) {
-            // For the duration of the gesture, lock the screen orientation to ensure that we
-            // do not rotate mid-quickscrub
-            activity.getRotationHelper().setStateHandlerRequest(REQUEST_LOCK);
-        }
-    }
-
-    @Override
-    public float getTranslationYForQuickScrub(TransformedRect targetRect, DeviceProfile dp,
-            Context context) {
-        // The padding calculations are exactly same as that of RecentsView.setInsets
-        int topMargin = context.getResources()
-                .getDimensionPixelSize(R.dimen.task_thumbnail_top_margin);
-        int paddingTop = targetRect.rect.top - topMargin - dp.getInsets().top;
-        int paddingBottom = dp.heightPx - dp.getInsets().bottom - targetRect.rect.bottom;
-
-        return FastOverviewState.OVERVIEW_TRANSLATION_FACTOR * (paddingBottom - paddingTop);
-    }
-
-    @Override
     public void executeOnWindowAvailable(Launcher activity, Runnable action) {
         activity.getWorkspace().runOnOverlayHidden(action);
     }
 
     @Override
-    public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
-            @InteractionType int interactionType, TransformedRect outRect) {
-        LayoutUtils.calculateLauncherTaskSize(context, dp, outRect.rect);
-        if (interactionType == INTERACTION_QUICK_SCRUB) {
-            outRect.scale = FastOverviewState.getOverviewScale(dp, outRect.rect, context,
-                    FeatureFlags.QUICK_SWITCH.get());
-        }
+    public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) {
+        LayoutUtils.calculateLauncherTaskSize(context, dp, outRect);
         if (dp.isVerticalBarLayout()) {
             Rect targetInsets = dp.getInsets();
             int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right;
@@ -221,10 +164,9 @@
             private ShelfAnimState mShelfState;
 
             @Override
-            public void createActivityController(long transitionLength,
-                    @InteractionType int interactionType) {
+            public void createActivityController(long transitionLength) {
                 createActivityControllerInternal(activity, activityVisible, fromState,
-                        transitionLength, interactionType, callback);
+                        transitionLength, callback);
             }
 
             @Override
@@ -270,10 +212,8 @@
 
     private void createActivityControllerInternal(Launcher activity, boolean wasVisible,
             LauncherState fromState, long transitionLength,
-            @InteractionType int interactionType,
             Consumer<AnimatorPlaybackController> callback) {
-        LauncherState endState = interactionType == INTERACTION_QUICK_SCRUB
-                ? FAST_OVERVIEW : OVERVIEW;
+        LauncherState endState = OVERVIEW;
         if (wasVisible && fromState != BACKGROUND_APP) {
             // If a translucent app was launched fom launcher, animate launcher states.
             DeviceProfile dp = activity.getDeviceProfile();
@@ -295,10 +235,7 @@
                     endState.getVerticalProgress(activity));
             anim.play(shiftAnim);
         }
-
-        if (interactionType == INTERACTION_NORMAL) {
-            playScaleDownAnim(anim, activity, endState);
-        }
+        playScaleDownAnim(anim, activity, endState);
 
         anim.setDuration(transitionLength * 2);
         activity.getStateManager().setCurrentAnimation(anim);
@@ -408,11 +345,6 @@
     }
 
     @Override
-    public boolean deferStartingActivity(int downHitTarget) {
-        return downHitTarget == HIT_TARGET_BACK || downHitTarget == HIT_TARGET_ROTATION;
-    }
-
-    @Override
     public boolean deferStartingActivity(Region activeNavBarRegion, MotionEvent ev) {
         return activeNavBarRegion.contains((int) ev.getX(), (int) ev.getY());
     }
diff --git a/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java
index 0007b37..ed83ed6 100644
--- a/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java
+++ b/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java
@@ -112,7 +112,6 @@
     private static final int APP_LAUNCH_ALPHA_DURATION = 50;
 
     public static final int RECENTS_LAUNCH_DURATION = 336;
-    public static final int RECENTS_QUICKSCRUB_LAUNCH_DURATION = 300;
     private static final int LAUNCHER_RESUME_START_DELAY = 100;
     private static final int CLOSING_TRANSITION_DURATION_MS = 250;
 
@@ -181,10 +180,6 @@
     public ActivityOptions getActivityLaunchOptions(Launcher launcher, View v) {
         if (hasControlRemoteAppTransitionPermission()) {
             boolean fromRecents = isLaunchingFromRecents(v, null /* targets */);
-            if (fromRecents && isQuickSwitchInProgress()) {
-                return getQuickSwitchActivityOptions();
-            }
-
             RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mHandler,
                     true /* startAtFrontOfQueue */) {
 
@@ -238,20 +233,6 @@
             @Nullable RemoteAnimationTargetCompat[] targets);
 
     /**
-     * Whether a quick scrub is in progress.
-     *
-     * @return true if in progress
-     */
-    protected abstract boolean isQuickSwitchInProgress();
-
-    /**
-     * Get activity options for a quick switch launch that include the launch animation.
-     *
-     * @return the activity options for a quick switch recents launch
-     */
-    protected abstract ActivityOptions getQuickSwitchActivityOptions();
-
-    /**
      * Composes the animations for a launch from the recents list.
      *
      * @param anim the animator set to add to
diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
index 70aae13..25e1c89 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
@@ -125,8 +125,8 @@
 
     public static void onEnterAnimationComplete(Context context) {
         // After the transition to home, enable the high-res thumbnail loader if it wasn't enabled
-        // as a part of quickstep/scrub, so that high-res thumbnails can load the next time we
-        // enter overview
+        // as a part of quickstep, so that high-res thumbnails can load the next time we enter
+        // overview
         RecentsModel.INSTANCE.get(context).getThumbnailCache()
                 .getHighResLoadingState().setVisible(true);
     }
diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java
index fd60cb8..65e71a6 100644
--- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java
+++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java
@@ -17,7 +17,6 @@
 
 import android.animation.Animator;
 import android.annotation.TargetApi;
-import android.app.ActivityManager.RunningTaskInfo;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Rect;
@@ -29,24 +28,21 @@
 import android.view.View;
 import android.view.animation.Interpolator;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.UiThread;
-
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.anim.AnimatorPlaybackController;
 import com.android.launcher3.util.MultiValueAlpha.AlphaProperty;
-import com.android.quickstep.TouchConsumer.InteractionType;
 import com.android.quickstep.util.RemoteAnimationProvider;
 import com.android.quickstep.util.RemoteAnimationTargetSet;
-import com.android.quickstep.util.TransformedRect;
-import com.android.quickstep.views.RecentsView;
 import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
 
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.UiThread;
+
 /**
  * Utility class which abstracts out the logical differences between Launcher and RecentsActivity.
  */
@@ -55,21 +51,11 @@
 
     LayoutListener createLayoutListener(T activity);
 
-    /**
-     * Updates the UI to indicate quick interaction.
-     */
-    void onQuickInteractionStart(T activity, @Nullable RunningTaskInfo taskInfo,
-            boolean activityVisible, TouchInteractionLog touchInteractionLog);
-
-    float getTranslationYForQuickScrub(TransformedRect targetRect, DeviceProfile dp,
-            Context context);
-
     void executeOnWindowAvailable(T activity, Runnable action);
 
     void onTransitionCancelled(T activity, boolean activityVisible);
 
-    int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
-            @InteractionType int interactionType, TransformedRect outRect);
+    int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect);
 
     void onSwipeUpComplete(T activity);
 
@@ -99,12 +85,6 @@
 
     boolean shouldMinimizeSplitScreen();
 
-    /**
-     * @return {@code true} if recents activity should be started immediately on touchDown,
-     *         {@code false} if it should deferred until some threshold is crossed.
-     */
-    boolean deferStartingActivity(int downHitTarget);
-
     default boolean deferStartingActivity(Region activeNavBarRegion, MotionEvent ev) {
         return true;
     }
@@ -161,7 +141,7 @@
 
         default void onRemoteAnimationReceived(RemoteAnimationTargetSet targets) { }
 
-        void createActivityController(long transitionLength, @InteractionType int interactionType);
+        void createActivityController(long transitionLength);
 
         default void onTransitionCancelled() { }
 
diff --git a/quickstep/src/com/android/quickstep/AppToOverviewAnimationProvider.java b/quickstep/src/com/android/quickstep/AppToOverviewAnimationProvider.java
index e0eeda5..e5747dc 100644
--- a/quickstep/src/com/android/quickstep/AppToOverviewAnimationProvider.java
+++ b/quickstep/src/com/android/quickstep/AppToOverviewAnimationProvider.java
@@ -17,7 +17,6 @@
 
 import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN;
 import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR;
-import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL;
 import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING;
 import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING;
 
@@ -34,7 +33,6 @@
 import com.android.quickstep.util.ClipAnimationHelper;
 import com.android.quickstep.util.RemoteAnimationProvider;
 import com.android.quickstep.util.RemoteAnimationTargetSet;
-import com.android.quickstep.util.TransformedRect;
 import com.android.quickstep.views.RecentsView;
 import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
 import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
@@ -82,7 +80,7 @@
                     anim.start();
                 });
         factory.onRemoteAnimationReceived(null);
-        factory.createActivityController(RECENTS_LAUNCH_DURATION, INTERACTION_NORMAL);
+        factory.createActivityController(RECENTS_LAUNCH_DURATION);
         mActivity = activity;
         mRecentsView = mActivity.getOverviewPanel();
         return false;
@@ -136,9 +134,8 @@
                 loc[0] + rootView.getWidth(), loc[1] + rootView.getHeight());
         clipHelper.updateSource(homeBounds, runningTaskTarget);
 
-        TransformedRect targetRect = new TransformedRect();
-        mHelper.getSwipeUpDestinationAndLength(mActivity.getDeviceProfile(), mActivity,
-                INTERACTION_NORMAL, targetRect);
+        Rect targetRect = new Rect();
+        mHelper.getSwipeUpDestinationAndLength(mActivity.getDeviceProfile(), mActivity, targetRect);
         clipHelper.updateTargetRect(targetRect);
         clipHelper.prepareAnimation(false /* isOpening */);
 
diff --git a/quickstep/src/com/android/quickstep/FallbackActivityControllerHelper.java b/quickstep/src/com/android/quickstep/FallbackActivityControllerHelper.java
index aba6060..a914da9 100644
--- a/quickstep/src/com/android/quickstep/FallbackActivityControllerHelper.java
+++ b/quickstep/src/com/android/quickstep/FallbackActivityControllerHelper.java
@@ -15,41 +15,33 @@
  */
 package com.android.quickstep;
 
-import static com.android.launcher3.LauncherAnimUtils.OVERVIEW_TRANSITION_MS;
 import static com.android.launcher3.anim.Interpolators.LINEAR;
-import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL;
 import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA;
 
 import android.animation.Animator;
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
-import android.app.ActivityManager.RunningTaskInfo;
 import android.content.ComponentName;
 import android.content.Context;
 import android.graphics.Rect;
 import android.graphics.RectF;
-import android.os.Handler;
-import android.os.Looper;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.anim.AnimationSuccessListener;
 import com.android.launcher3.anim.AnimatorPlaybackController;
 import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.launcher3.util.MultiValueAlpha.AlphaProperty;
-import com.android.quickstep.TouchConsumer.InteractionType;
 import com.android.quickstep.util.LayoutUtils;
 import com.android.quickstep.util.RemoteAnimationTargetSet;
-import com.android.quickstep.util.TransformedRect;
 import com.android.quickstep.views.RecentsView;
 import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
 
-import java.util.Objects;
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 /**
  * {@link ActivityControlHelper} for recents when the default launcher is different than the
  * currently running one and apps should interact with the {@link RecentsActivity} as opposed
@@ -59,35 +51,12 @@
         ActivityControlHelper<RecentsActivity> {
 
     private final ComponentName mHomeComponent;
-    private final Handler mUiHandler = new Handler(Looper.getMainLooper());
 
     public FallbackActivityControllerHelper(ComponentName homeComponent) {
         mHomeComponent = homeComponent;
     }
 
     @Override
-    public void onQuickInteractionStart(RecentsActivity activity, RunningTaskInfo taskInfo,
-            boolean activityVisible, TouchInteractionLog touchInteractionLog) {
-        QuickScrubController controller = activity.<RecentsView>getOverviewPanel()
-                .getQuickScrubController();
-
-        // TODO: match user is as well
-        boolean startingFromHome = !activityVisible &&
-                (taskInfo == null || Objects.equals(taskInfo.topActivity, mHomeComponent));
-        controller.onQuickScrubStart(startingFromHome, this, touchInteractionLog);
-        if (activityVisible) {
-            mUiHandler.postDelayed(controller::onFinishedTransitionToQuickScrub,
-                    OVERVIEW_TRANSITION_MS);
-        }
-    }
-
-    @Override
-    public float getTranslationYForQuickScrub(TransformedRect targetRect, DeviceProfile dp,
-            Context context) {
-        return 0;
-    }
-
-    @Override
     public void executeOnWindowAvailable(RecentsActivity activity, Runnable action) {
         action.run();
     }
@@ -98,15 +67,14 @@
     }
 
     @Override
-    public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
-            @InteractionType int interactionType, TransformedRect outRect) {
-        LayoutUtils.calculateFallbackTaskSize(context, dp, outRect.rect);
+    public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) {
+        LayoutUtils.calculateFallbackTaskSize(context, dp, outRect);
         if (dp.isVerticalBarLayout()) {
             Rect targetInsets = dp.getInsets();
             int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right;
             return dp.hotseatBarSizePx + hotseatInset;
         } else {
-            return dp.heightPx - outRect.rect.bottom;
+            return dp.heightPx - outRect.bottom;
         }
     }
 
@@ -148,7 +116,7 @@
     public AnimationFactory prepareRecentsUI(RecentsActivity activity, boolean activityVisible,
             boolean animateActivity, Consumer<AnimatorPlaybackController> callback) {
         if (activityVisible) {
-            return (transitionLength, interactionType) -> { };
+            return (transitionLength) -> { };
         }
 
         RecentsView rv = activity.getOverviewPanel();
@@ -165,12 +133,11 @@
                     rv.setContentAlpha(1);
                 }
                 createActivityController(getSwipeUpDestinationAndLength(
-                        activity.getDeviceProfile(), activity, INTERACTION_NORMAL,
-                        new TransformedRect()), INTERACTION_NORMAL);
+                        activity.getDeviceProfile(), activity, new Rect()));
             }
 
             @Override
-            public void createActivityController(long transitionLength, int interactionType) {
+            public void createActivityController(long transitionLength) {
                 if (!isAnimatingToRecents) {
                     return;
                 }
@@ -232,12 +199,6 @@
     }
 
     @Override
-    public boolean deferStartingActivity(int downHitTarget) {
-        // Always defer starting the activity when using fallback
-        return true;
-    }
-
-    @Override
     public Rect getOverviewWindowBounds(Rect homeBounds, RemoteAnimationTargetCompat target) {
         // TODO: Remove this once b/77875376 is fixed
         return target.sourceContainerBounds;
diff --git a/quickstep/src/com/android/quickstep/MotionEventQueue.java b/quickstep/src/com/android/quickstep/MotionEventQueue.java
deleted file mode 100644
index 3e2e9a6..0000000
--- a/quickstep/src/com/android/quickstep/MotionEventQueue.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep;
-
-import static android.view.MotionEvent.ACTION_MASK;
-import static android.view.MotionEvent.ACTION_POINTER_INDEX_SHIFT;
-
-import android.annotation.TargetApi;
-import android.os.Build;
-import android.os.Looper;
-import android.util.Log;
-import android.util.Pair;
-import android.view.Choreographer;
-import android.view.InputEvent;
-import android.view.MotionEvent;
-
-import com.android.systemui.shared.system.InputChannelCompat;
-import com.android.systemui.shared.system.InputChannelCompat.InputEventDispatcher;
-import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver;
-import com.android.systemui.shared.system.NavigationBarCompat.HitTarget;
-
-/**
- * Helper class for batching input events
- */
-@TargetApi(Build.VERSION_CODES.O)
-public class MotionEventQueue {
-
-    private static final String TAG = "MotionEventQueue";
-
-    private static final int ACTION_VIRTUAL = ACTION_MASK - 1;
-
-    private static final int ACTION_QUICK_SCRUB_START =
-            ACTION_VIRTUAL | (1 << ACTION_POINTER_INDEX_SHIFT);
-    private static final int ACTION_QUICK_SCRUB_PROGRESS =
-            ACTION_VIRTUAL | (2 << ACTION_POINTER_INDEX_SHIFT);
-    private static final int ACTION_QUICK_SCRUB_END =
-            ACTION_VIRTUAL | (3 << ACTION_POINTER_INDEX_SHIFT);
-    private static final int ACTION_NEW_GESTURE =
-            ACTION_VIRTUAL | (4 << ACTION_POINTER_INDEX_SHIFT);
-    private static final int ACTION_SHOW_OVERVIEW_FROM_ALT_TAB =
-            ACTION_VIRTUAL | (5 << ACTION_POINTER_INDEX_SHIFT);
-
-    private final InputEventDispatcher mDispatcher;
-    private final InputEventReceiver mReceiver;
-    private final ConsumerFactory mConsumerFactory;
-
-    private TouchConsumer mConsumer;
-
-    public MotionEventQueue(Looper looper, Choreographer choreographer,
-            ConsumerFactory consumerFactory) {
-        Pair<InputEventDispatcher, InputEventReceiver> pair = InputChannelCompat.createPair(
-                "sysui-callbacks", looper, choreographer, this::onInputEvent);
-
-        mConsumerFactory = consumerFactory;
-        mConsumer = TouchConsumer.NO_OP;
-        mDispatcher = pair.first;
-        mReceiver = pair.second;
-    }
-
-    private void onInputEvent(InputEvent ev) {
-        if (!(ev instanceof MotionEvent)) {
-            throw new IllegalStateException("Unknown event " + ev);
-        }
-        MotionEvent event = (MotionEvent) ev;
-        if (event.getActionMasked() == ACTION_VIRTUAL) {
-            switch (event.getAction()) {
-                case ACTION_QUICK_SCRUB_START:
-                    mConsumer.onQuickScrubStart();
-                    break;
-                case ACTION_QUICK_SCRUB_PROGRESS:
-                    mConsumer.onQuickScrubProgress(event.getX());
-                    break;
-                case ACTION_QUICK_SCRUB_END:
-                    mConsumer.onQuickScrubEnd();
-                    break;
-                case ACTION_NEW_GESTURE: {
-                    boolean useSharedState = mConsumer.isActive();
-                    mConsumer.onConsumerAboutToBeSwitched();
-                    mConsumer = mConsumerFactory.newConsumer(event.getSource(), useSharedState);
-                    break;
-                }
-                case ACTION_SHOW_OVERVIEW_FROM_ALT_TAB:
-                    mConsumer.onShowOverviewFromAltTab();
-                    mConsumer.onQuickScrubStart();
-                    break;
-                default:
-                    Log.e(TAG, "Invalid virtual event: " + event.getAction());
-            }
-        } else {
-            mConsumer.accept(event);
-        }
-    }
-
-    public void queue(MotionEvent event) {
-        mDispatcher.dispatch(event);
-    }
-
-    private void queueVirtualAction(int action, float param) {
-        queue(MotionEvent.obtain(0, 0, action, param, 0, 0));
-    }
-
-    private void queueVirtualAction(int action, int param) {
-        MotionEvent ev = MotionEvent.obtain(0, 0, action, 0, 0, 0);
-        ev.setSource(param);
-        queue(ev);
-    }
-
-    public void onQuickScrubStart() {
-        queueVirtualAction(ACTION_QUICK_SCRUB_START, 0);
-    }
-
-    public void onOverviewShownFromAltTab() {
-        queueVirtualAction(ACTION_SHOW_OVERVIEW_FROM_ALT_TAB, 0);
-    }
-
-    public void onQuickScrubProgress(float progress) {
-        queueVirtualAction(ACTION_QUICK_SCRUB_PROGRESS, progress);
-    }
-
-    public void onQuickScrubEnd() {
-        queueVirtualAction(ACTION_QUICK_SCRUB_END, 0);
-    }
-
-    public void onNewGesture(@HitTarget int downHitTarget) {
-        queueVirtualAction(ACTION_NEW_GESTURE, downHitTarget);
-    }
-
-    /**
-     * To be called by the consumer when it's no longer active.
-     */
-    public void onConsumerInactive(TouchConsumer caller) {
-        if (mConsumer == caller) {
-            mConsumer = TouchConsumer.NO_OP;
-        }
-    }
-
-    public void dispose() {
-        mDispatcher.dispose();
-        mReceiver.dispose();
-    }
-
-    public interface ConsumerFactory {
-
-        TouchConsumer newConsumer(@HitTarget int downHitTarget, boolean useSharedState);
-    }
-}
diff --git a/quickstep/src/com/android/quickstep/MultiStateCallback.java b/quickstep/src/com/android/quickstep/MultiStateCallback.java
index a408f95..ba66293 100644
--- a/quickstep/src/com/android/quickstep/MultiStateCallback.java
+++ b/quickstep/src/com/android/quickstep/MultiStateCallback.java
@@ -15,8 +15,6 @@
  */
 package com.android.quickstep;
 
-import static com.android.quickstep.WindowTransformSwipeHandler.STATES;
-
 import android.util.Log;
 import android.util.SparseArray;
 
@@ -29,11 +27,17 @@
 public class MultiStateCallback {
 
     private static final String TAG = "MultiStateCallback";
-    private static final boolean DEBUG_STATES = false;
+    public static final boolean DEBUG_STATES = false;
 
     private final SparseArray<Runnable> mCallbacks = new SparseArray<>();
     private final SparseArray<Consumer<Boolean>> mStateChangeHandlers = new SparseArray<>();
 
+    private final String[] mStateNames;
+
+    public MultiStateCallback(String[] stateNames) {
+        mStateNames = DEBUG_STATES ? stateNames : null;
+    }
+
     private int mState = 0;
 
     /**
@@ -113,12 +117,12 @@
         int state = getState();
         StringJoiner currentStateStr = new StringJoiner(", ", "[", "]");
         String stateFlagStr = "Unknown-" + stateFlag;
-        for (int i = 0; i < STATES.length; i++) {
+        for (int i = 0; i < mStateNames.length; i++) {
             if ((state & (i << i)) != 0) {
-                currentStateStr.add(STATES[i]);
+                currentStateStr.add(mStateNames[i]);
             }
             if (stateFlag == (1 << i)) {
-                stateFlagStr = STATES[i] + " (" + stateFlag + ")";
+                stateFlagStr = mStateNames[i] + " (" + stateFlag + ")";
             }
         }
         Log.d(TAG, "[" + System.identityHashCode(this) + "] Adding " + stateFlagStr + " to "
diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
index 63349ed..a335827 100644
--- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
+++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java
@@ -24,6 +24,7 @@
 
 import static com.android.launcher3.util.RaceConditionTracker.ENTER;
 import static com.android.launcher3.util.RaceConditionTracker.EXIT;
+import static com.android.quickstep.TouchInteractionService.TOUCH_INTERACTION_LOG;
 import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
 
 import android.annotation.TargetApi;
@@ -35,7 +36,6 @@
 import android.graphics.Rect;
 import android.os.Build;
 import android.os.Bundle;
-import android.os.SystemClock;
 import android.view.Display;
 import android.view.MotionEvent;
 import android.view.Surface;
@@ -77,7 +77,6 @@
     private final ActivityControlHelper mActivityControlHelper;
     private final OverviewCallbacks mOverviewCallbacks;
     private final TaskOverlayFactory mTaskOverlayFactory;
-    private final TouchInteractionLog mTouchInteractionLog;
     private final InputConsumerController mInputConsumer;
     private final SwipeSharedState mSwipeSharedState;
 
@@ -110,7 +109,6 @@
             RecentsModel recentsModel, Intent homeIntent, ActivityControlHelper activityControl,
             boolean isDeferredDownTarget, OverviewCallbacks overviewCallbacks,
             TaskOverlayFactory taskOverlayFactory, InputConsumerController inputConsumer,
-            TouchInteractionLog touchInteractionLog,
             Consumer<OtherActivityTouchConsumer> onCompleteCallback,
             SwipeSharedState swipeSharedState) {
         super(base);
@@ -127,8 +125,6 @@
         mIsDeferredDownTarget = isDeferredDownTarget;
         mOverviewCallbacks = overviewCallbacks;
         mTaskOverlayFactory = taskOverlayFactory;
-        mTouchInteractionLog = touchInteractionLog;
-        mTouchInteractionLog.setTouchConsumer(this);
         mInputConsumer = inputConsumer;
         mSwipeSharedState = swipeSharedState;
 
@@ -143,11 +139,6 @@
     }
 
     @Override
-    public void onShowOverviewFromAltTab() {
-        startTouchTrackingForWindowAnimation(SystemClock.uptimeMillis());
-    }
-
-    @Override
     public void accept(MotionEvent ev) {
         if (mVelocityTracker == null) {
             return;
@@ -158,7 +149,6 @@
             mMotionPauseDetector.clear();
         }
 
-        mTouchInteractionLog.addMotionEvent(ev);
         switch (ev.getActionMasked()) {
             case ACTION_DOWN: {
                 RaceConditionTracker.onEvent(DOWN_EVT, ENTER);
@@ -213,7 +203,7 @@
                             mTouchSlop) {
                         mPassedTouchSlop = true;
 
-                        mTouchInteractionLog.startQuickStep();
+                        TOUCH_INTERACTION_LOG.startQuickStep();
                         if (mIsDeferredDownTarget) {
                             // Deferred gesture, start the animation and gesture tracking once
                             // we pass the actual touch slop
@@ -284,12 +274,12 @@
     }
 
     private void startTouchTrackingForWindowAnimation(long touchTimeMs) {
-        mTouchInteractionLog.startRecentsAnimation();
+        TOUCH_INTERACTION_LOG.startRecentsAnimation();
 
         RecentsAnimationListenerSet listenerSet = mSwipeSharedState.getActiveListener();
         final WindowTransformSwipeHandler handler = new WindowTransformSwipeHandler(
                 mRunningTask, this, touchTimeMs, mActivityControlHelper,
-                listenerSet != null, mInputConsumer, mTouchInteractionLog);
+                listenerSet != null, mInputConsumer);
 
         // Preload the plan
         mRecentsModel.getTasks(null);
@@ -393,38 +383,6 @@
         }
     }
 
-    @Override
-    public void onQuickScrubStart() {
-        if (!mPassedDragSlop && mIsDeferredDownTarget && mInteractionHandler == null) {
-            // If we deferred starting the window animation on touch down, then
-            // start tracking now
-            startTouchTrackingForWindowAnimation(SystemClock.uptimeMillis());
-            mPassedDragSlop = true;
-        }
-
-        mTouchInteractionLog.startQuickScrub();
-        if (mInteractionHandler != null) {
-            mInteractionHandler.onQuickScrubStart();
-        }
-        notifyGestureStarted();
-    }
-
-    @Override
-    public void onQuickScrubEnd() {
-        mTouchInteractionLog.endQuickScrub("onQuickScrubEnd");
-        if (mInteractionHandler != null) {
-            mInteractionHandler.onQuickScrubEnd();
-        }
-    }
-
-    @Override
-    public void onQuickScrubProgress(float progress) {
-        mTouchInteractionLog.setQuickScrubProgress(progress);
-        if (mInteractionHandler != null) {
-            mInteractionHandler.onQuickScrubProgress(progress);
-        }
-    }
-
     private float getDisplacement(MotionEvent ev) {
         float eventX = ev.getX();
         float eventY = ev.getY();
diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
index 5b4f673..6d2008e 100644
--- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
+++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
@@ -31,6 +31,7 @@
 import com.android.launcher3.userevent.nano.LauncherLogProto;
 import com.android.quickstep.ActivityControlHelper.ActivityInitListener;
 import com.android.quickstep.views.RecentsView;
+import com.android.quickstep.views.TaskView;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
 import com.android.systemui.shared.system.LatencyTrackerCompat;
 import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
@@ -71,6 +72,10 @@
         mMainThreadExecutor.execute(new ShowRecentsCommand());
     }
 
+    public void onOverviewHidden() {
+        mMainThreadExecutor.execute(new HideRecentsCommand());
+    }
+
     public void onTip(int actionType, int viewType) {
         mMainThreadExecutor.execute(() ->
                 UserEventDispatcher.newInstance(mContext).logActionTip(actionType, viewType));
@@ -80,10 +85,29 @@
 
         @Override
         protected boolean handleCommand(long elapsedTime) {
+            // TODO: Go to the next page if started from alt-tab.
             return mHelper.getVisibleRecentsView() != null;
         }
     }
 
+    private class HideRecentsCommand extends RecentsActivityCommand {
+
+        @Override
+        protected boolean handleCommand(long elapsedTime) {
+            RecentsView recents = (RecentsView) mHelper.getVisibleRecentsView();
+            if (recents == null) {
+                return false;
+            }
+            int currentPage = recents.getNextPage();
+            if (currentPage >= 0 && currentPage < recents.getTaskViewCount()) {
+                ((TaskView) recents.getPageAt(currentPage)).launchTask(true);
+            } else {
+                recents.startHome();
+            }
+            return true;
+        }
+    }
+
     private class RecentsActivityCommand<T extends BaseDraggingActivity> implements Runnable {
 
         protected final ActivityControlHelper<T> mHelper;
diff --git a/quickstep/src/com/android/quickstep/OverviewTouchConsumer.java b/quickstep/src/com/android/quickstep/OverviewTouchConsumer.java
index 2638f23..f9961d9 100644
--- a/quickstep/src/com/android/quickstep/OverviewTouchConsumer.java
+++ b/quickstep/src/com/android/quickstep/OverviewTouchConsumer.java
@@ -22,6 +22,7 @@
 import static android.view.MotionEvent.ACTION_POINTER_INDEX_SHIFT;
 import static android.view.MotionEvent.ACTION_UP;
 
+import static com.android.quickstep.TouchInteractionService.TOUCH_INTERACTION_LOG;
 import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
 
 import android.graphics.PointF;
@@ -30,7 +31,6 @@
 
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.launcher3.views.BaseDragLayer;
-import com.android.quickstep.views.RecentsView;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
 
 /**
@@ -39,42 +39,22 @@
 public class OverviewTouchConsumer<T extends BaseDraggingActivity>
         implements TouchConsumer {
 
-    private static final String TAG = "OverviewTouchConsumer";
-
-    private final ActivityControlHelper<T> mActivityHelper;
     private final T mActivity;
     private final BaseDragLayer mTarget;
     private final int[] mLocationOnScreen = new int[2];
     private final PointF mDownPos = new PointF();
     private final int mTouchSlop;
-    private final QuickScrubController mQuickScrubController;
-    private final TouchInteractionLog mTouchInteractionLog;
 
     private final boolean mStartingInActivityBounds;
 
     private boolean mTrackingStarted = false;
     private boolean mInvalidated = false;
 
-    private float mLastProgress = 0;
-    private boolean mStartPending = false;
-    private boolean mEndPending = false;
-    private boolean mWaitForWindowAvailable;
-
-    OverviewTouchConsumer(ActivityControlHelper<T> activityHelper, T activity,
-            boolean startingInActivityBounds, TouchInteractionLog touchInteractionLog,
-            boolean waitForWindowAvailable) {
-        mActivityHelper = activityHelper;
+    OverviewTouchConsumer(T activity, boolean startingInActivityBounds) {
         mActivity = activity;
         mTarget = activity.getDragLayer();
         mTouchSlop = ViewConfiguration.get(mActivity).getScaledTouchSlop();
         mStartingInActivityBounds = startingInActivityBounds;
-
-        mQuickScrubController = mActivity.<RecentsView>getOverviewPanel()
-                .getQuickScrubController();
-        mTouchInteractionLog = touchInteractionLog;
-        mTouchInteractionLog.setTouchConsumer(this);
-
-        mWaitForWindowAvailable = waitForWindowAvailable;
     }
 
     @Override
@@ -82,7 +62,6 @@
         if (mInvalidated) {
             return;
         }
-        mTouchInteractionLog.addMotionEvent(ev);
         int action = ev.getActionMasked();
         if (action == ACTION_DOWN) {
             if (mStartingInActivityBounds) {
@@ -145,7 +124,7 @@
             OverviewCallbacks.get(mActivity).closeAllWindows();
             ActivityManagerWrapper.getInstance()
                     .closeSystemWindows(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS);
-            mTouchInteractionLog.startQuickStep();
+            TOUCH_INTERACTION_LOG.startQuickStep();
         }
     }
 
@@ -165,83 +144,12 @@
         ev.setEdgeFlags(flags);
     }
 
-    @Override
-    public void onQuickScrubStart() {
-        if (mInvalidated) {
-            return;
-        }
-        mTouchInteractionLog.startQuickScrub();
-        if (!mQuickScrubController.prepareQuickScrub(TAG)) {
-            mInvalidated = true;
-            mTouchInteractionLog.endQuickScrub("onQuickScrubStart");
-            return;
-        }
-        OverviewCallbacks.get(mActivity).closeAllWindows();
-        ActivityManagerWrapper.getInstance()
-                .closeSystemWindows(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS);
-
-        mStartPending = true;
-        Runnable action = () -> {
-            if (!mQuickScrubController.prepareQuickScrub(TAG)) {
-                mInvalidated = true;
-                mTouchInteractionLog.endQuickScrub("onQuickScrubStart");
-                return;
-            }
-            mActivityHelper.onQuickInteractionStart(mActivity, null, true,
-                    mTouchInteractionLog);
-            mQuickScrubController.onQuickScrubProgress(mLastProgress);
-            mStartPending = false;
-
-            if (mEndPending) {
-                mQuickScrubController.onQuickScrubEnd();
-                mEndPending = false;
-            }
-        };
-
-        if (mWaitForWindowAvailable) {
-            mActivityHelper.executeOnWindowAvailable(mActivity, action);
-        } else {
-            action.run();
-        }
-    }
-
-    @Override
-    public void onQuickScrubEnd() {
-        mTouchInteractionLog.endQuickScrub("onQuickScrubEnd");
-        if (mInvalidated) {
-            return;
-        }
-        if (mStartPending) {
-            mEndPending = true;
-        } else {
-            mQuickScrubController.onQuickScrubEnd();
-        }
-    }
-
-    @Override
-    public void onQuickScrubProgress(float progress) {
-        mTouchInteractionLog.setQuickScrubProgress(progress);
-        mLastProgress = progress;
-        if (mInvalidated || mStartPending) {
-            return;
-        }
-        mQuickScrubController.onQuickScrubProgress(progress);
-    }
-
     public static TouchConsumer newInstance(ActivityControlHelper activityHelper,
-            boolean startingInActivityBounds, TouchInteractionLog touchInteractionLog) {
-        return newInstance(activityHelper, startingInActivityBounds, touchInteractionLog,
-                true /* waitForWindowAvailable */);
-    }
-
-    public static TouchConsumer newInstance(ActivityControlHelper activityHelper,
-            boolean startingInActivityBounds, TouchInteractionLog touchInteractionLog,
-            boolean waitForWindowAvailable) {
+            boolean startingInActivityBounds) {
         BaseDraggingActivity activity = activityHelper.getCreatedActivity();
         if (activity == null) {
             return TouchConsumer.NO_OP;
         }
-        return new OverviewTouchConsumer(activityHelper, activity, startingInActivityBounds,
-                touchInteractionLog, waitForWindowAvailable);
+        return new OverviewTouchConsumer(activity, startingInActivityBounds);
     }
 }
\ No newline at end of file
diff --git a/quickstep/src/com/android/quickstep/QuickScrubController.java b/quickstep/src/com/android/quickstep/QuickScrubController.java
deleted file mode 100644
index ab5fce1..0000000
--- a/quickstep/src/com/android/quickstep/QuickScrubController.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.quickstep;
-
-import static com.android.launcher3.Utilities.SINGLE_FRAME_MS;
-import static com.android.launcher3.anim.Interpolators.ACCEL;
-import static com.android.launcher3.anim.Interpolators.DEACCEL_3;
-import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN;
-import static com.android.launcher3.anim.Interpolators.LINEAR;
-import static com.android.launcher3.config.FeatureFlags.ENABLE_TASK_STABILIZER;
-import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.annotation.TargetApi;
-import android.os.Build;
-import android.util.FloatProperty;
-import android.util.Log;
-import android.view.HapticFeedbackConstants;
-import android.view.animation.Interpolator;
-
-import com.android.launcher3.Alarm;
-import com.android.launcher3.BaseActivity;
-import com.android.launcher3.OnAlarmListener;
-import com.android.launcher3.Utilities;
-import com.android.launcher3.userevent.nano.LauncherLogProto;
-import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch;
-import com.android.quickstep.views.RecentsView;
-import com.android.quickstep.views.TaskView;
-
-/**
- * Responds to quick scrub callbacks to page through and launch recent tasks.
- *
- * The behavior is to evenly divide the progress into sections, each of which scrolls one page.
- * The first and last section set an alarm to auto-advance backwards or forwards, respectively.
- */
-@TargetApi(Build.VERSION_CODES.P)
-public class QuickScrubController implements OnAlarmListener {
-
-    public static final int QUICK_SWITCH_FROM_APP_START_DURATION = 0;
-    public static final int QUICK_SCRUB_FROM_APP_START_DURATION = 240;
-    public static final int QUICK_SCRUB_FROM_HOME_START_DURATION = 200;
-    // We want the translation y to finish faster than the rest of the animation.
-    public static final float QUICK_SCRUB_TRANSLATION_Y_FACTOR = 5f / 6;
-    public static final Interpolator QUICK_SCRUB_START_INTERPOLATOR = FAST_OUT_SLOW_IN;
-
-    /**
-     * Snap to a new page when crossing these thresholds. The first and last auto-advance.
-     */
-    private static final float[] QUICK_SCRUB_THRESHOLDS = new float[] {
-            0.05f, 0.20f, 0.35f, 0.50f, 0.65f, 0.80f, 0.95f
-    };
-
-    private static final FloatProperty<QuickScrubController> PROGRESS
-            = new FloatProperty<QuickScrubController>("progress") {
-        @Override
-        public void setValue(QuickScrubController quickScrubController, float progress) {
-            quickScrubController.onQuickScrubProgress(progress);
-        }
-
-        @Override
-        public Float get(QuickScrubController quickScrubController) {
-            return quickScrubController.mEndProgress;
-        }
-    };
-
-    private static final String TAG = "QuickScrubController";
-    private static final boolean ENABLE_AUTO_ADVANCE = true;
-    private static final long AUTO_ADVANCE_DELAY = 500;
-    private static final int QUICKSCRUB_SNAP_DURATION_PER_PAGE = 325;
-    private static final int QUICKSCRUB_END_SNAP_DURATION_PER_PAGE = 60;
-
-    private final Alarm mAutoAdvanceAlarm;
-    private final RecentsView mRecentsView;
-    private final BaseActivity mActivity;
-
-    private boolean mInQuickScrub;
-    private boolean mWaitingForTaskLaunch;
-    private int mQuickScrubSection;
-    private boolean mStartedFromHome;
-    private boolean mFinishedTransitionToQuickScrub;
-    private int mLaunchingTaskId;
-    private Runnable mOnFinishedTransitionToQuickScrubRunnable;
-    private ActivityControlHelper mActivityControlHelper;
-    private TouchInteractionLog mTouchInteractionLog;
-
-    private boolean mIsQuickSwitch;
-    private float mStartProgress;
-    private float mEndProgress;
-    private float mPrevProgressDelta;
-    private float mPrevPrevProgressDelta;
-    private boolean mShouldSwitchToNext;
-
-    public QuickScrubController(BaseActivity activity, RecentsView recentsView) {
-        mActivity = activity;
-        mRecentsView = recentsView;
-        if (ENABLE_AUTO_ADVANCE) {
-            mAutoAdvanceAlarm = new Alarm();
-            mAutoAdvanceAlarm.setOnAlarmListener(this);
-        }
-    }
-
-    public void onQuickScrubStart(boolean startingFromHome, ActivityControlHelper controlHelper,
-            TouchInteractionLog touchInteractionLog) {
-        prepareQuickScrub(TAG);
-        mInQuickScrub = true;
-        mStartedFromHome = startingFromHome;
-        mQuickScrubSection = 0;
-        mFinishedTransitionToQuickScrub = false;
-        mActivityControlHelper = controlHelper;
-        mTouchInteractionLog = touchInteractionLog;
-
-        if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
-            if (mRecentsView.getRunningTaskView() != null) {
-                mRecentsView.getRunningTaskView().setShowScreenshot(false);
-            }
-        }
-
-        if (mIsQuickSwitch) {
-            mShouldSwitchToNext = true;
-            mPrevProgressDelta = 0;
-            TaskView runningTaskView = mRecentsView.getRunningTaskView();
-            TaskView nextTaskView = mRecentsView.getNextTaskView();
-            if (runningTaskView != null) {
-                runningTaskView.setFullscreenProgress(1);
-            }
-            if (nextTaskView != null) {
-                nextTaskView.setFullscreenProgress(1);
-            }
-        }
-
-        snapToNextTaskIfAvailable();
-        mActivity.getUserEventDispatcher().resetActionDurationMillis();
-    }
-
-    public void onQuickScrubEnd() {
-        mInQuickScrub = false;
-
-        Runnable launchTaskRunnable = () -> {
-            int page = mRecentsView.getPageNearestToCenterOfScreen();
-            TaskView taskView = mRecentsView.getTaskViewAt(page);
-            if (taskView != null) {
-                mWaitingForTaskLaunch = true;
-                mTouchInteractionLog.launchTaskStart();
-                mLaunchingTaskId = taskView.getTask().key.id;
-                taskView.launchTask(true, (result) -> {
-                    mTouchInteractionLog.launchTaskEnd(result);
-                    if (!result) {
-                        taskView.notifyTaskLaunchFailed(TAG);
-                        breakOutOfQuickScrub();
-                    } else {
-                        mActivity.getUserEventDispatcher().logTaskLaunchOrDismiss(Touch.DRAGDROP,
-                                LauncherLogProto.Action.Direction.NONE, page,
-                                TaskUtils.getLaunchComponentKeyForTask(taskView.getTask().key));
-                    }
-                    mWaitingForTaskLaunch = false;
-                    if (mIsQuickSwitch) {
-                        mIsQuickSwitch = false;
-                        TaskView runningTaskView = mRecentsView.getRunningTaskView();
-                        TaskView nextTaskView = mRecentsView.getNextTaskView();
-                        if (runningTaskView != null) {
-                            runningTaskView.setFullscreenProgress(0);
-                        }
-                        if (nextTaskView != null) {
-                            nextTaskView.setFullscreenProgress(0);
-                        }
-                    }
-
-                }, taskView.getHandler());
-            } else {
-                breakOutOfQuickScrub();
-            }
-            mActivityControlHelper = null;
-        };
-
-        if (mIsQuickSwitch) {
-            float progressVelocity = mPrevPrevProgressDelta / SINGLE_FRAME_MS;
-            // Move to the next frame immediately, then start the animation from the
-            // following frame since it starts a frame later.
-            float singleFrameProgress = progressVelocity * SINGLE_FRAME_MS;
-            float fromProgress = mEndProgress + singleFrameProgress;
-            onQuickScrubProgress(fromProgress);
-            fromProgress += singleFrameProgress;
-            float toProgress = mShouldSwitchToNext ? 1 : 0;
-            int duration = (int) Math.abs((toProgress - fromProgress) / progressVelocity);
-            duration = Utilities.boundToRange(duration, 80, 300);
-            Animator anim = ObjectAnimator.ofFloat(this, PROGRESS, fromProgress, toProgress);
-            anim.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    launchTaskRunnable.run();
-                }
-            });
-            anim.setDuration(duration).start();
-            return;
-        }
-
-        if (ENABLE_AUTO_ADVANCE) {
-            mAutoAdvanceAlarm.cancelAlarm();
-        }
-        int page = mRecentsView.getNextPage();
-        int snapDuration = Math.abs(page - mRecentsView.getPageNearestToCenterOfScreen())
-                * QUICKSCRUB_END_SNAP_DURATION_PER_PAGE;
-        if (mRecentsView.getChildCount() > 0 && mRecentsView.snapToPage(page, snapDuration)) {
-            // Settle on the page then launch it
-            mRecentsView.setNextPageSwitchRunnable(launchTaskRunnable);
-        } else {
-            // No page move needed, just launch it
-            if (mFinishedTransitionToQuickScrub) {
-                launchTaskRunnable.run();
-            } else {
-                mOnFinishedTransitionToQuickScrubRunnable = launchTaskRunnable;
-            }
-        }
-    }
-
-    public void cancelActiveQuickscrub() {
-        if (!mInQuickScrub) {
-            return;
-        }
-        Log.d(TAG, "Quickscrub was active, cancelling");
-        mInQuickScrub = false;
-        mActivityControlHelper = null;
-        mOnFinishedTransitionToQuickScrubRunnable = null;
-        mRecentsView.setNextPageSwitchRunnable(null);
-        mLaunchingTaskId = 0;
-    }
-
-    public boolean prepareQuickScrub(String tag) {
-        return prepareQuickScrub(tag, mIsQuickSwitch);
-    }
-
-    /**
-     * Initializes the UI for quick scrub, returns true if success.
-     */
-    public boolean prepareQuickScrub(String tag, boolean isQuickSwitch) {
-        if (mWaitingForTaskLaunch || mInQuickScrub) {
-            Log.d(tag, "Waiting for last scrub to finish, will skip this interaction");
-            return false;
-        }
-        mOnFinishedTransitionToQuickScrubRunnable = null;
-        mRecentsView.setNextPageSwitchRunnable(null);
-        mIsQuickSwitch = isQuickSwitch;
-        return true;
-    }
-
-    public boolean isQuickSwitch() {
-        return mIsQuickSwitch;
-    }
-
-    public boolean isWaitingForTaskLaunch() {
-        return mWaitingForTaskLaunch;
-    }
-
-    public boolean hasFinishedTransitionToQuickScrub() {
-        return mFinishedTransitionToQuickScrub;
-    }
-
-    /**
-     * Attempts to go to normal overview or back to home, so UI doesn't prevent user interaction.
-     */
-    private void breakOutOfQuickScrub() {
-        if (mRecentsView.getChildCount() == 0 || mActivityControlHelper == null
-                || !mActivityControlHelper.switchToRecentsIfVisible(false)) {
-            mActivity.onBackPressed();
-        }
-    }
-
-    public void onQuickScrubProgress(float progress) {
-        if (mIsQuickSwitch) {
-            TaskView currentPage = mRecentsView.getRunningTaskView();
-            TaskView nextPage = mRecentsView.getNextTaskView();
-            if (currentPage == null || nextPage == null) {
-                return;
-            }
-            if (!mFinishedTransitionToQuickScrub || mStartProgress <= 0) {
-                mStartProgress = mEndProgress = progress;
-            } else {
-                float progressDelta = progress - mEndProgress;
-                mEndProgress = progress;
-                progress = Utilities.boundToRange(progress, mStartProgress, 1);
-                progress = Utilities.mapToRange(progress, mStartProgress, 1, 0, 1, LINEAR);
-                if (mInQuickScrub) {
-                    mShouldSwitchToNext = mPrevProgressDelta > 0.007f || progressDelta > 0.007f
-                            || progress >= 0.5f;
-                }
-                mPrevPrevProgressDelta = mPrevProgressDelta;
-                mPrevProgressDelta = progressDelta;
-                int startScroll = mRecentsView.getScrollForPage(
-                        mRecentsView.indexOfChild(currentPage));
-                int scrollDiff = mRecentsView.getScrollForPage(mRecentsView.indexOfChild(nextPage))
-                        - startScroll;
-
-                int linearScrollDiff = (int) (progress * scrollDiff);
-                currentPage.setZoomScale(1 - DEACCEL_3.getInterpolation(progress)
-                        * TaskView.EDGE_SCALE_DOWN_FACTOR);
-                if (!ENABLE_TASK_STABILIZER.get()) {
-                    float accelScrollDiff = ACCEL.getInterpolation(progress) * scrollDiff;
-                    currentPage.setTranslationX(linearScrollDiff + accelScrollDiff);
-                }
-                nextPage.setTranslationZ(1);
-                nextPage.setTranslationY(currentPage.getTranslationY());
-                mRecentsView.setScrollX(startScroll + linearScrollDiff);
-            }
-            return;
-        }
-
-        int quickScrubSection = 0;
-        for (float threshold : QUICK_SCRUB_THRESHOLDS) {
-            if (progress < threshold) {
-                break;
-            }
-            quickScrubSection++;
-        }
-        if (quickScrubSection != mQuickScrubSection) {
-            boolean cameFromAutoAdvance = mQuickScrubSection == QUICK_SCRUB_THRESHOLDS.length
-                    || mQuickScrubSection == 0;
-            int pageToGoTo = mRecentsView.getNextPage() + quickScrubSection - mQuickScrubSection;
-            if (mFinishedTransitionToQuickScrub && !cameFromAutoAdvance) {
-                goToPageWithHaptic(pageToGoTo);
-            }
-            if (ENABLE_AUTO_ADVANCE) {
-                if (quickScrubSection == QUICK_SCRUB_THRESHOLDS.length || quickScrubSection == 0) {
-                    mAutoAdvanceAlarm.setAlarm(AUTO_ADVANCE_DELAY);
-                } else {
-                    mAutoAdvanceAlarm.cancelAlarm();
-                }
-            }
-            mQuickScrubSection = quickScrubSection;
-        }
-    }
-
-    public void onFinishedTransitionToQuickScrub() {
-        mFinishedTransitionToQuickScrub = true;
-        Runnable action = mOnFinishedTransitionToQuickScrubRunnable;
-        // Clear the runnable before executing it, to prevent potential recursion.
-        mOnFinishedTransitionToQuickScrubRunnable = null;
-        if (action != null) {
-            action.run();
-        }
-        mRecentsView.setEnableDrawingLiveTile(true);
-    }
-
-    public void onTaskRemoved(int taskId) {
-        if (mLaunchingTaskId == taskId) {
-            // The task has been removed mid-launch, break out of quickscrub and return the user
-            // to where they were before (and notify the launch failed)
-            TaskView taskView = mRecentsView.getTaskView(taskId);
-            if (taskView != null) {
-                taskView.notifyTaskLaunchFailed(TAG);
-            }
-            breakOutOfQuickScrub();
-        }
-    }
-
-    public void snapToNextTaskIfAvailable() {
-        if (mInQuickScrub && mRecentsView.getChildCount() > 0) {
-            int duration = mIsQuickSwitch
-                    ? QUICK_SWITCH_FROM_APP_START_DURATION
-                    : mStartedFromHome
-                        ? QUICK_SCRUB_FROM_HOME_START_DURATION
-                        : QUICK_SCRUB_FROM_APP_START_DURATION;
-            final int pageToGoTo;
-            if (mStartedFromHome) {
-                pageToGoTo = 0;
-            } else if (mIsQuickSwitch) {
-                TaskView tv = mRecentsView.getRunningTaskView();
-                pageToGoTo = tv != null ? mRecentsView.indexOfChild(tv)
-                        : mRecentsView.getNextPage();
-            } else {
-                pageToGoTo = mRecentsView.getNextPage() + 1;
-            }
-            goToPageWithHaptic(pageToGoTo, duration, true /* forceHaptic */,
-                    QUICK_SCRUB_START_INTERPOLATOR);
-        }
-    }
-
-    private void goToPageWithHaptic(int pageToGoTo) {
-        goToPageWithHaptic(pageToGoTo, -1 /* overrideDuration */, false /* forceHaptic */, null);
-    }
-
-    private void goToPageWithHaptic(int pageToGoTo, int overrideDuration, boolean forceHaptic,
-            Interpolator interpolator) {
-        pageToGoTo = Utilities.boundToRange(pageToGoTo, 0, mRecentsView.getTaskViewCount() - 1);
-        boolean snappingToPage = pageToGoTo != mRecentsView.getNextPage();
-        if (snappingToPage) {
-            int duration = overrideDuration > -1 ? overrideDuration
-                    : Math.abs(pageToGoTo - mRecentsView.getNextPage())
-                            * QUICKSCRUB_SNAP_DURATION_PER_PAGE;
-            mRecentsView.snapToPage(pageToGoTo, duration, interpolator);
-        }
-        if (snappingToPage || forceHaptic) {
-            mRecentsView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
-                    HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
-        }
-    }
-
-    @Override
-    public void onAlarm(Alarm alarm) {
-        int currPage = mRecentsView.getNextPage();
-        boolean recentsVisible = mActivityControlHelper != null
-                && mActivityControlHelper.getVisibleRecentsView() != null;
-        if (!recentsVisible) {
-            Log.w(TAG, "Failed to auto advance; recents not visible");
-            return;
-        }
-        if (mQuickScrubSection == QUICK_SCRUB_THRESHOLDS.length
-                && currPage < mRecentsView.getTaskViewCount() - 1) {
-            goToPageWithHaptic(currPage + 1);
-        } else if (mQuickScrubSection == 0 && currPage > 0) {
-            goToPageWithHaptic(currPage - 1);
-        }
-        if (ENABLE_AUTO_ADVANCE) {
-            mAutoAdvanceAlarm.setAlarm(AUTO_ADVANCE_DELAY);
-        }
-    }
-}
diff --git a/quickstep/src/com/android/quickstep/TouchConsumer.java b/quickstep/src/com/android/quickstep/TouchConsumer.java
index d9b1fcf..12ae7b6 100644
--- a/quickstep/src/com/android/quickstep/TouchConsumer.java
+++ b/quickstep/src/com/android/quickstep/TouchConsumer.java
@@ -19,10 +19,6 @@
 import android.os.Build;
 import android.view.MotionEvent;
 
-import androidx.annotation.IntDef;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
 import java.util.function.Consumer;
 
 @TargetApi(Build.VERSION_CODES.O)
@@ -31,23 +27,6 @@
 
     TouchConsumer NO_OP = (ev) -> {};
 
-    @IntDef(flag = true, value = {
-            INTERACTION_NORMAL,
-            INTERACTION_QUICK_SCRUB
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    @interface InteractionType {}
-    int INTERACTION_NORMAL = 0;
-    int INTERACTION_QUICK_SCRUB = 1;
-
-    default void onQuickScrubStart() { }
-
-    default void onQuickScrubEnd() { }
-
-    default void onQuickScrubProgress(float progress) { }
-
-    default void onShowOverviewFromAltTab() {}
-
     default boolean isActive() {
         return false;
     }
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionLog.java b/quickstep/src/com/android/quickstep/TouchInteractionLog.java
index 053efbb..b542701 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionLog.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionLog.java
@@ -23,7 +23,7 @@
 import java.util.LinkedList;
 
 /**
- * Keeps track of debugging logs for a particular quickstep/scrub gesture.
+ * Keeps track of debugging logs for a particular quickstep gesture.
  */
 public class TouchInteractionLog {
 
@@ -54,18 +54,6 @@
         getCurrentLog().add("qstStart");
     }
 
-    public void startQuickScrub() {
-        getCurrentLog().add("qsStart");
-    }
-
-    public void setQuickScrubProgress(float progress) {
-        getCurrentLog().add("qsP=" + progress);
-    }
-
-    public void endQuickScrub(String reason) {
-        getCurrentLog().add("qsEnd=" + reason);
-    }
-
     public void startRecentsAnimation() {
         getCurrentLog().add("raStart");
     }
@@ -82,14 +70,6 @@
         getCurrentLog().add("raFinish=" + toHome);
     }
 
-    public void launchTaskStart() {
-        getCurrentLog().add("launchStart");
-    }
-
-    public void launchTaskEnd(boolean result) {
-        getCurrentLog().add("launchEnd=" + result);
-    }
-
     public void dump(PrintWriter pw) {
         pw.println("TouchInteractionLog {");
         for (ArrayList<String> gesture : mGestureLogs) {
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 6bbcd65..9f0ee49 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -15,12 +15,9 @@
  */
 package com.android.quickstep;
 
-import static android.view.MotionEvent.ACTION_CANCEL;
 import static android.view.MotionEvent.ACTION_DOWN;
-import static android.view.MotionEvent.ACTION_UP;
 
 import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
-import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_NONE;
 import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_INPUT_CHANNEL;
 import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
 
@@ -34,20 +31,19 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.util.Log;
-import android.util.SparseArray;
+import android.util.Pair;
 import android.view.Choreographer;
 import android.view.InputEvent;
 import android.view.MotionEvent;
 
 import com.android.launcher3.MainThreadExecutor;
-import com.android.launcher3.util.TraceHelper;
 import com.android.systemui.shared.recents.IOverviewProxy;
 import com.android.systemui.shared.recents.ISystemUiProxy;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
 import com.android.systemui.shared.system.InputChannelCompat;
+import com.android.systemui.shared.system.InputChannelCompat.InputEventDispatcher;
 import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver;
 import com.android.systemui.shared.system.InputConsumerController;
-import com.android.systemui.shared.system.NavigationBarCompat.HitTarget;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -59,15 +55,7 @@
 public class TouchInteractionService extends Service {
 
     public static final MainThreadExecutor MAIN_THREAD_EXECUTOR = new MainThreadExecutor();
-
-    private static final SparseArray<String> sMotionEventNames;
-
-    static {
-        sMotionEventNames = new SparseArray<>(3);
-        sMotionEventNames.put(ACTION_DOWN, "ACTION_DOWN");
-        sMotionEventNames.put(ACTION_UP, "ACTION_UP");
-        sMotionEventNames.put(ACTION_CANCEL, "ACTION_CANCEL");
-    }
+    public static final TouchInteractionLog TOUCH_INTERACTION_LOG = new TouchInteractionLog();
 
     public static final int EDGE_NAV_BAR = 1 << 8;
 
@@ -85,73 +73,12 @@
             mRecentsModel.setSystemUiProxy(mISystemUiProxy);
             mOverviewInteractionState.setSystemUiProxy(mISystemUiProxy);
 
-            if (mInputEventReceiver != null) {
-                mInputEventReceiver.dispose();
-            }
+            disposeEventHandlers();
             mInputEventReceiver = InputChannelCompat.fromBundle(bundle, KEY_EXTRA_INPUT_CHANNEL,
                     Looper.getMainLooper(), mMainChoreographer,
                     TouchInteractionService.this::onInputEvent);
         }
 
-        public void onPreMotionEvent(@HitTarget int downHitTarget) {
-            // If ev are using the new dispatching system, skip the old logic
-            if (mInputEventReceiver != null) {
-                return;
-            }
-            mTouchInteractionLog.prepareForNewGesture();
-
-            TraceHelper.beginSection("SysUiBinder");
-            mEventQueue.onNewGesture(downHitTarget);
-            TraceHelper.partitionSection("SysUiBinder", "Down target " + downHitTarget);
-        }
-
-        public void onMotionEvent(MotionEvent ev) {
-            // If ev are using the new dispatching system, skip the old logic
-            if (mInputEventReceiver != null) {
-                ev.recycle();
-                return;
-            }
-            mEventQueue.queue(ev);
-
-            int action = ev.getActionMasked();
-            String name = sMotionEventNames.get(action);
-            if (name != null){
-                TraceHelper.partitionSection("SysUiBinder", name);
-            }
-        }
-
-        public void onBind(ISystemUiProxy iSystemUiProxy) {
-            mISystemUiProxy = iSystemUiProxy;
-            mRecentsModel.setSystemUiProxy(mISystemUiProxy);
-            mOverviewInteractionState.setSystemUiProxy(mISystemUiProxy);
-        }
-
-        public void onQuickScrubStart() {
-            // If ev are using the new dispatching system, skip the old logic
-            if (mInputEventReceiver != null) {
-                return;
-            }
-            mEventQueue.onQuickScrubStart();
-            TraceHelper.partitionSection("SysUiBinder", "onQuickScrubStart");
-        }
-
-        public void onQuickScrubProgress(float progress) {
-            // If ev are using the new dispatching system, skip the old logic
-            if (mInputEventReceiver != null) {
-                return;
-            }
-            mEventQueue.onQuickScrubProgress(progress);
-        }
-
-        public void onQuickScrubEnd() {
-            // If ev are using the new dispatching system, skip the old logic
-            if (mInputEventReceiver != null) {
-                return;
-            }
-            mEventQueue.onQuickScrubEnd();
-            TraceHelper.endSection("SysUiBinder", "onQuickScrubEnd");
-        }
-
         @Override
         public void onOverviewToggle() {
             mOverviewCommandHelper.onOverviewToggle();
@@ -159,37 +86,55 @@
 
         @Override
         public void onOverviewShown(boolean triggeredFromAltTab) {
-            // If ev are using the new dispatching system, skip the old logic
-            if (mInputEventReceiver != null) {
-                mOverviewCommandHelper.onOverviewShown();
-                return;
-            }
-            if (triggeredFromAltTab) {
-                mEventQueue.onNewGesture(HIT_TARGET_NONE);
-                mEventQueue.onOverviewShownFromAltTab();
-            } else {
-                mOverviewCommandHelper.onOverviewShown();
-            }
+            mOverviewCommandHelper.onOverviewShown();
         }
 
         @Override
         public void onOverviewHidden(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
-            // If ev are using the new dispatching system, skip the old logic
-            if (mInputEventReceiver != null) {
-                return;
-            }
             if (triggeredFromAltTab && !triggeredFromHomeKey) {
-                // onOverviewShownFromAltTab initiates quick scrub. Ending it here.
-                mEventQueue.onQuickScrubEnd();
+                // onOverviewShownFromAltTab hides the overview and ends at the target app
+                mOverviewCommandHelper.onOverviewHidden();
             }
         }
 
-        public void onQuickStep(MotionEvent motionEvent) { }
-
         @Override
         public void onTip(int actionType, int viewType) {
             mOverviewCommandHelper.onTip(actionType, viewType);
         }
+
+        /** Deprecated methods **/
+        public void onQuickStep(MotionEvent motionEvent) { }
+
+        public void onQuickScrubEnd() { }
+
+        public void onQuickScrubProgress(float progress) { }
+
+        public void onQuickScrubStart() { }
+
+        public void onPreMotionEvent(int downHitTarget) { }
+
+        public void onMotionEvent(MotionEvent ev) {
+            if (mDeprecatedDispatcher == null) {
+                ev.recycle();
+            } else {
+                mDeprecatedDispatcher.dispatch(ev);
+            }
+        }
+
+        public void onBind(ISystemUiProxy iSystemUiProxy) {
+            mISystemUiProxy = iSystemUiProxy;
+            mRecentsModel.setSystemUiProxy(mISystemUiProxy);
+            mOverviewInteractionState.setSystemUiProxy(mISystemUiProxy);
+
+            // On Bind is received before onInitialize which will dispose these handlers
+            disposeEventHandlers();
+            Pair<InputEventDispatcher, InputEventReceiver> pair = InputChannelCompat.createPair(
+                    "sysui-callbacks", Looper.getMainLooper(), mMainChoreographer,
+                    TouchInteractionService.this::onInputEvent);
+            mDeprecatedDispatcher = pair.first;
+            mInputEventReceiver = pair.second;
+
+        }
     };
 
     private static boolean sConnected = false;
@@ -200,22 +145,23 @@
 
     private ActivityManagerWrapper mAM;
     private RecentsModel mRecentsModel;
-    private MotionEventQueue mEventQueue;
     private ISystemUiProxy mISystemUiProxy;
     private OverviewCommandHelper mOverviewCommandHelper;
     private OverviewComponentObserver mOverviewComponentObserver;
     private OverviewInteractionState mOverviewInteractionState;
     private OverviewCallbacks mOverviewCallbacks;
     private TaskOverlayFactory mTaskOverlayFactory;
-    private TouchInteractionLog mTouchInteractionLog;
     private InputConsumerController mInputConsumer;
     private SwipeSharedState mSwipeSharedState;
 
     private TouchConsumer mConsumer = TouchConsumer.NO_OP;
     private Choreographer mMainChoreographer;
+
     private InputEventReceiver mInputEventReceiver;
     private Region mActiveNavBarRegion = new Region();
 
+    private InputEventDispatcher mDeprecatedDispatcher;
+
     @Override
     public void onCreate() {
         super.onCreate();
@@ -225,12 +171,9 @@
         mMainChoreographer = Choreographer.getInstance();
 
         mOverviewCommandHelper = new OverviewCommandHelper(this, mOverviewComponentObserver);
-        mEventQueue = new MotionEventQueue(Looper.myLooper(), Choreographer.getInstance(),
-                this::newConsumer);
         mOverviewInteractionState = OverviewInteractionState.INSTANCE.get(this);
         mOverviewCallbacks = OverviewCallbacks.get(this);
         mTaskOverlayFactory = TaskOverlayFactory.INSTANCE.get(this);
-        mTouchInteractionLog = new TouchInteractionLog();
         mSwipeSharedState = new SwipeSharedState();
         mInputConsumer = InputConsumerController.getRecentsAnimationInputConsumer();
         mInputConsumer.registerInputConsumer();
@@ -245,14 +188,22 @@
     public void onDestroy() {
         mInputConsumer.unregisterInputConsumer();
         mOverviewComponentObserver.onDestroy();
-        mEventQueue.dispose();
-        if (mInputEventReceiver != null) {
-            mInputEventReceiver.dispose();
-        }
+        disposeEventHandlers();
         sConnected = false;
         super.onDestroy();
     }
 
+    private void disposeEventHandlers() {
+        if (mInputEventReceiver != null) {
+            mInputEventReceiver.dispose();
+            mInputEventReceiver = null;
+        }
+        if (mDeprecatedDispatcher != null) {
+            mDeprecatedDispatcher.dispose();
+            mDeprecatedDispatcher = null;
+        }
+    }
+
     @Override
     public IBinder onBind(Intent intent) {
         Log.d(TAG, "Touch service connected");
@@ -266,45 +217,17 @@
         }
         MotionEvent event = (MotionEvent) ev;
         if (event.getAction() == ACTION_DOWN) {
-            mTouchInteractionLog.prepareForNewGesture();
+            TOUCH_INTERACTION_LOG.prepareForNewGesture();
             boolean useSharedState = mConsumer.isActive();
             mConsumer.onConsumerAboutToBeSwitched();
             mConsumer = newConsumer(useSharedState, event);
+            TOUCH_INTERACTION_LOG.setTouchConsumer(mConsumer);
         }
+        TOUCH_INTERACTION_LOG.addMotionEvent(event);
 
         mConsumer.accept(event);
     }
 
-    private TouchConsumer newConsumer(@HitTarget int downHitTarget, boolean useSharedState) {
-        RunningTaskInfo runningTaskInfo = mAM.getRunningTask(0);
-        if (!useSharedState) {
-            mSwipeSharedState.clearAllState();
-        }
-
-        if (runningTaskInfo == null && !mSwipeSharedState.goingToLauncher) {
-            return TouchConsumer.NO_OP;
-        } else if (mSwipeSharedState.goingToLauncher ||
-                mOverviewComponentObserver.getActivityControlHelper().isResumed()) {
-            return OverviewTouchConsumer.newInstance(
-                    mOverviewComponentObserver.getActivityControlHelper(), false,
-                    mTouchInteractionLog);
-        } else if (ENABLE_QUICKSTEP_LIVE_TILE.get() &&
-                mOverviewComponentObserver.getActivityControlHelper().isInLiveTileMode()) {
-            return OverviewTouchConsumer.newInstance(
-                    mOverviewComponentObserver.getActivityControlHelper(), false,
-                    mTouchInteractionLog, false /* waitForWindowAvailable */);
-        } else {
-            ActivityControlHelper activityControl =
-                    mOverviewComponentObserver.getActivityControlHelper();
-            return new OtherActivityTouchConsumer(this, runningTaskInfo, mRecentsModel,
-                    mOverviewComponentObserver.getOverviewIntent(),
-                    mOverviewComponentObserver.getActivityControlHelper(),
-                    activityControl.deferStartingActivity(downHitTarget), mOverviewCallbacks,
-                    mTaskOverlayFactory, mInputConsumer, mTouchInteractionLog,
-                    mEventQueue::onConsumerInactive, mSwipeSharedState);
-        }
-    }
-
     private TouchConsumer newConsumer(boolean useSharedState, MotionEvent event) {
         RunningTaskInfo runningTaskInfo = mAM.getRunningTask(0);
         if (!useSharedState) {
@@ -316,13 +239,11 @@
         } else if (mSwipeSharedState.goingToLauncher ||
                 mOverviewComponentObserver.getActivityControlHelper().isResumed()) {
             return OverviewTouchConsumer.newInstance(
-                    mOverviewComponentObserver.getActivityControlHelper(), false,
-                    mTouchInteractionLog);
+                    mOverviewComponentObserver.getActivityControlHelper(), false);
         } else if (ENABLE_QUICKSTEP_LIVE_TILE.get() &&
                 mOverviewComponentObserver.getActivityControlHelper().isInLiveTileMode()) {
             return OverviewTouchConsumer.newInstance(
-                    mOverviewComponentObserver.getActivityControlHelper(), false,
-                    mTouchInteractionLog, false /* waitForWindowAvailable */);
+                    mOverviewComponentObserver.getActivityControlHelper(), false);
         } else {
             ActivityControlHelper activityControl =
                     mOverviewComponentObserver.getActivityControlHelper();
@@ -331,7 +252,7 @@
                     mOverviewComponentObserver.getOverviewIntent(),
                     mOverviewComponentObserver.getActivityControlHelper(),
                     shouldDefer, mOverviewCallbacks,
-                    mTaskOverlayFactory, mInputConsumer, mTouchInteractionLog,
+                    mTaskOverlayFactory, mInputConsumer,
                     this::onConsumerInactive, mSwipeSharedState);
         }
     }
@@ -347,6 +268,6 @@
 
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        mTouchInteractionLog.dump(pw);
+        TOUCH_INTERACTION_LOG.dump(pw);
     }
 }
diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
index b0f055c..a3363cd 100644
--- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java
@@ -25,16 +25,14 @@
 import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2;
 import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
 import static com.android.launcher3.config.FeatureFlags.QUICKSTEP_SPRINGS;
+import static com.android.launcher3.config.FeatureFlags.SWIPE_HOME;
 import static com.android.launcher3.util.RaceConditionTracker.ENTER;
 import static com.android.launcher3.util.RaceConditionTracker.EXIT;
-import static com.android.launcher3.config.FeatureFlags.SWIPE_HOME;
 import static com.android.quickstep.ActivityControlHelper.AnimationFactory.ShelfAnimState.HIDE;
 import static com.android.quickstep.ActivityControlHelper.AnimationFactory.ShelfAnimState.PEEK;
-import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_FROM_APP_START_DURATION;
-import static com.android.quickstep.QuickScrubController.QUICK_SWITCH_FROM_APP_START_DURATION;
-import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL;
-import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB;
+import static com.android.quickstep.MultiStateCallback.DEBUG_STATES;
 import static com.android.quickstep.TouchInteractionService.MAIN_THREAD_EXECUTOR;
+import static com.android.quickstep.TouchInteractionService.TOUCH_INTERACTION_LOG;
 import static com.android.quickstep.WindowTransformSwipeHandler.GestureEndTarget.HOME;
 import static com.android.quickstep.WindowTransformSwipeHandler.GestureEndTarget.LAST_TASK;
 import static com.android.quickstep.WindowTransformSwipeHandler.GestureEndTarget.NEW_TASK;
@@ -50,7 +48,6 @@
 import android.annotation.TargetApi;
 import android.app.ActivityManager.RunningTaskInfo;
 import android.content.Context;
-import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.Point;
 import android.graphics.Rect;
@@ -60,7 +57,6 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.SystemClock;
-import android.os.UserHandle;
 import android.view.HapticFeedbackConstants;
 import android.view.MotionEvent;
 import android.view.View;
@@ -68,10 +64,6 @@
 import android.view.WindowManager;
 import android.view.animation.Interpolator;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.UiThread;
-
 import com.android.launcher3.AbstractFloatingView;
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.launcher3.DeviceProfile;
@@ -94,17 +86,14 @@
 import com.android.quickstep.ActivityControlHelper.AnimationFactory;
 import com.android.quickstep.ActivityControlHelper.AnimationFactory.ShelfAnimState;
 import com.android.quickstep.ActivityControlHelper.LayoutListener;
-import com.android.quickstep.TouchConsumer.InteractionType;
 import com.android.quickstep.util.ClipAnimationHelper;
 import com.android.quickstep.util.RemoteAnimationTargetSet;
 import com.android.quickstep.util.SwipeAnimationTargetSet;
 import com.android.quickstep.util.SwipeAnimationTargetSet.SwipeAnimationListener;
-import com.android.quickstep.util.TransformedRect;
 import com.android.quickstep.views.RecentsView;
 import com.android.quickstep.views.TaskView;
 import com.android.systemui.shared.recents.model.ThumbnailData;
 import com.android.systemui.shared.recents.utilities.RectFEvaluator;
-import com.android.systemui.shared.system.ActivityManagerWrapper;
 import com.android.systemui.shared.system.InputConsumerController;
 import com.android.systemui.shared.system.LatencyTrackerCompat;
 import com.android.systemui.shared.system.RecentsAnimationControllerCompat;
@@ -114,44 +103,67 @@
 
 import java.util.function.BiFunction;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.UiThread;
+
 @TargetApi(Build.VERSION_CODES.O)
 public class WindowTransformSwipeHandler<T extends BaseDraggingActivity>
         implements SwipeAnimationListener {
     private static final String TAG = WindowTransformSwipeHandler.class.getSimpleName();
 
+    private static final String[] STATE_NAMES = DEBUG_STATES ? new String[19] : null;
+
+    private static int getFlagForIndex(int index, String name) {
+        if (DEBUG_STATES) {
+            STATE_NAMES[index] = name;
+        }
+        return 1 << index;
+    }
+
     // Launcher UI related states
-    private static final int STATE_LAUNCHER_PRESENT = 1 << 0;
-    private static final int STATE_LAUNCHER_STARTED = 1 << 1;
-    private static final int STATE_LAUNCHER_DRAWN = 1 << 2;
-    private static final int STATE_ACTIVITY_MULTIPLIER_COMPLETE = 1 << 3;
+    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");
+    private static final int STATE_ACTIVITY_MULTIPLIER_COMPLETE =
+            getFlagForIndex(3, "STATE_ACTIVITY_MULTIPLIER_COMPLETE");
 
     // Internal initialization states
-    private static final int STATE_APP_CONTROLLER_RECEIVED = 1 << 4;
+    private static final int STATE_APP_CONTROLLER_RECEIVED =
+            getFlagForIndex(4, "STATE_APP_CONTROLLER_RECEIVED");
 
     // Interaction finish states
-    private static final int STATE_SCALED_CONTROLLER_HOME = 1 << 5;
-    private static final int STATE_SCALED_CONTROLLER_RECENTS = 1 << 6;
-    private static final int STATE_SCALED_CONTROLLER_LAST_TASK = 1 << 7;
+    private static final int STATE_SCALED_CONTROLLER_HOME =
+            getFlagForIndex(5, "STATE_SCALED_CONTROLLER_HOME");
+    private static final int STATE_SCALED_CONTROLLER_RECENTS =
+            getFlagForIndex(6, "STATE_SCALED_CONTROLLER_RECENTS");
+    private static final int STATE_SCALED_CONTROLLER_LAST_TASK =
+            getFlagForIndex(7, "STATE_SCALED_CONTROLLER_LAST_TASK");
 
-    private static final int STATE_HANDLER_INVALIDATED = 1 << 8;
-    private static final int STATE_GESTURE_STARTED_QUICKSTEP = 1 << 9;
-    private static final int STATE_GESTURE_STARTED_QUICKSCRUB = 1 << 10;
-    private static final int STATE_GESTURE_CANCELLED = 1 << 11;
-    private static final int STATE_GESTURE_COMPLETED = 1 << 12;
+    private static final int STATE_HANDLER_INVALIDATED =
+            getFlagForIndex(8, "STATE_HANDLER_INVALIDATED");
+    private static final int STATE_GESTURE_STARTED =
+            getFlagForIndex(9, "STATE_GESTURE_STARTED");
+    private static final int STATE_GESTURE_CANCELLED =
+            getFlagForIndex(10, "STATE_GESTURE_CANCELLED");
+    private static final int STATE_GESTURE_COMPLETED =
+            getFlagForIndex(11, "STATE_GESTURE_COMPLETED");
 
-    // States for quick switch/scrub
-    private static final int STATE_CURRENT_TASK_FINISHED = 1 << 13;
-    private static final int STATE_QUICK_SCRUB_START = 1 << 14;
-    private static final int STATE_QUICK_SCRUB_END = 1 << 15;
+    private static final int STATE_CAPTURE_SCREENSHOT =
+            getFlagForIndex(12, "STATE_CAPTURE_SCREENSHOT");
+    private static final int STATE_SCREENSHOT_CAPTURED =
+            getFlagForIndex(13, "STATE_SCREENSHOT_CAPTURED");
+    private static final int STATE_SCREENSHOT_VIEW_SHOWN =
+            getFlagForIndex(14, "STATE_SCREENSHOT_VIEW_SHOWN");
 
-    private static final int STATE_CAPTURE_SCREENSHOT = 1 << 16;
-    private static final int STATE_SCREENSHOT_CAPTURED = 1 << 17;
-    private static final int STATE_SCREENSHOT_VIEW_SHOWN = 1 << 18;
-
-    private static final int STATE_RESUME_LAST_TASK = 1 << 19;
-    private static final int STATE_START_NEW_TASK = 1 << 20;
-    private static final int STATE_ASSIST_DATA_RECEIVED = 1 << 21;
-
+    private static final int STATE_RESUME_LAST_TASK =
+            getFlagForIndex(15, "STATE_RESUME_LAST_TASK");
+    private static final int STATE_START_NEW_TASK =
+            getFlagForIndex(16, "STATE_START_NEW_TASK");
+    private static final int STATE_CURRENT_TASK_FINISHED =
+            getFlagForIndex(17, "STATE_CURRENT_TASK_FINISHED");
+    private static final int STATE_ASSIST_DATA_RECEIVED =
+            getFlagForIndex(18, "STATE_ASSIST_DATA_RECEIVED");
 
     private static final int LAUNCHER_UI_STATES =
             STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_ACTIVITY_MULTIPLIER_COMPLETE
@@ -165,34 +177,7 @@
             STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_LAUNCHER_STARTED
                     | STATE_APP_CONTROLLER_RECEIVED | STATE_SCREENSHOT_CAPTURED;
 
-    private static final int QUICK_SCRUB_START_UI_STATE = STATE_LAUNCHER_STARTED
-            | STATE_QUICK_SCRUB_START | STATE_APP_CONTROLLER_RECEIVED;
-
     // For debugging, keep in sync with above states
-    public static final String[] STATES = new String[] {
-            "STATE_LAUNCHER_PRESENT",
-            "STATE_LAUNCHER_STARTED",
-            "STATE_LAUNCHER_DRAWN",
-            "STATE_ACTIVITY_MULTIPLIER_COMPLETE",
-            "STATE_APP_CONTROLLER_RECEIVED",
-            "STATE_SCALED_CONTROLLER_HOME",
-            "STATE_SCALED_CONTROLLER_RECENTS",
-            "STATE_SCALED_CONTROLLER_LAST_TASK",
-            "STATE_HANDLER_INVALIDATED",
-            "STATE_GESTURE_STARTED_QUICKSTEP",
-            "STATE_GESTURE_STARTED_QUICKSCRUB",
-            "STATE_GESTURE_CANCELLED",
-            "STATE_GESTURE_COMPLETED",
-            "STATE_CURRENT_TASK_FINISHED",
-            "STATE_QUICK_SCRUB_START",
-            "STATE_QUICK_SCRUB_END",
-            "STATE_CAPTURE_SCREENSHOT",
-            "STATE_SCREENSHOT_CAPTURED",
-            "STATE_SCREENSHOT_VIEW_SHOWN",
-            "STATE_RESUME_LAST_TASK",
-            "STATE_START_NEW_TASK",
-            "STATE_ASSIST_DATA_RECEIVED",
-    };
 
     enum GestureEndTarget {
         HOME(1, STATE_SCALED_CONTROLLER_HOME, true, false, ContainerType.WORKSPACE),
@@ -256,7 +241,6 @@
     private final Context mContext;
     private final ActivityControlHelper<T> mActivityControlHelper;
     private final ActivityInitListener mActivityInitListener;
-    private final TouchInteractionLog mTouchInteractionLog;
 
     private final int mRunningTaskId;
     private final RunningTaskInfo mRunningTaskInfo;
@@ -269,18 +253,13 @@
     private LayoutListener mLayoutListener;
     private RecentsView mRecentsView;
     private SyncRtSurfaceTransactionApplierCompat mSyncTransactionApplier;
-    private QuickScrubController mQuickScrubController;
-    private AnimationFactory mAnimationFactory = (t, i) -> { };
+    private AnimationFactory mAnimationFactory = (t) -> { };
 
     private boolean mWasLauncherAlreadyVisible;
 
     private boolean mPassedOverviewThreshold;
     private boolean mGestureStarted;
     private int mLogAction = Touch.SWIPE;
-    private float mCurrentQuickScrubProgress;
-    private boolean mQuickScrubBlocked;
-
-    private @InteractionType int mInteractionType = INTERACTION_NORMAL;
 
     private final RecentsAnimationWrapper mRecentsAnimationWrapper;
 
@@ -295,7 +274,7 @@
 
     WindowTransformSwipeHandler(RunningTaskInfo runningTaskInfo, Context context,
             long touchTimeMs, ActivityControlHelper<T> controller, boolean continuingLastGesture,
-            InputConsumerController inputConsumer, TouchInteractionLog touchInteractionLog) {
+            InputConsumerController inputConsumer) {
         mContext = context;
         mRunningTaskInfo = runningTaskInfo;
         mRunningTaskId = runningTaskInfo.id;
@@ -304,7 +283,6 @@
         mActivityInitListener = mActivityControlHelper
                 .createActivityInitListener(this::onActivityInit);
         mContinuingLastGesture = continuingLastGesture;
-        mTouchInteractionLog = touchInteractionLog;
         mRecentsAnimationWrapper = new RecentsAnimationWrapper(inputConsumer,
                 this::createNewTouchProxyHandler);
         mClipAnimationHelper = new ClipAnimationHelper(context);
@@ -314,24 +292,20 @@
     }
 
     private void initStateCallbacks() {
-        mStateCallback = new MultiStateCallback();
+        mStateCallback = new MultiStateCallback(STATE_NAMES);
 
         // Re-setup the recents UI when gesture starts, as the state could have been changed during
         // that time by a previous window transition.
-        mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_GESTURE_STARTED_QUICKSTEP,
+        mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_GESTURE_STARTED,
                 this::setupRecentsViewUi);
 
-        mStateCallback.addCallback(STATE_LAUNCHER_DRAWN | STATE_GESTURE_STARTED_QUICKSCRUB,
-                this::initializeLauncherAnimationController);
-        mStateCallback.addCallback(STATE_LAUNCHER_DRAWN | STATE_GESTURE_STARTED_QUICKSTEP,
+        mStateCallback.addCallback(STATE_LAUNCHER_DRAWN | STATE_GESTURE_STARTED,
                 this::initializeLauncherAnimationController);
 
         mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN,
                 this::launcherFrameDrawn);
 
-        mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_GESTURE_STARTED_QUICKSTEP,
-                this::notifyGestureStartedAsync);
-        mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_GESTURE_STARTED_QUICKSCRUB,
+        mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_GESTURE_STARTED,
                 this::notifyGestureStartedAsync);
 
         mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_STARTED
@@ -367,12 +341,12 @@
         mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_APP_CONTROLLER_RECEIVED
                         | STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_SCALED_CONTROLLER_RECENTS
                         | STATE_CURRENT_TASK_FINISHED | STATE_GESTURE_COMPLETED
-                        | STATE_GESTURE_STARTED_QUICKSTEP,
+                        | STATE_GESTURE_STARTED,
                 this::setupLauncherUiAfterSwipeUpAnimation);
         mStateCallback.addCallback(STATE_LAUNCHER_PRESENT | STATE_APP_CONTROLLER_RECEIVED
                         | STATE_ACTIVITY_MULTIPLIER_COMPLETE | STATE_SCALED_CONTROLLER_RECENTS
                         | STATE_CURRENT_TASK_FINISHED | STATE_GESTURE_COMPLETED
-                        | STATE_GESTURE_STARTED_QUICKSTEP | STATE_ASSIST_DATA_RECEIVED,
+                        | STATE_GESTURE_STARTED | STATE_ASSIST_DATA_RECEIVED,
                 this::preloadAssistData);
 
         mStateCallback.addCallback(STATE_HANDLER_INVALIDATED, this::invalidateHandler);
@@ -382,12 +356,6 @@
                 | STATE_SCALED_CONTROLLER_LAST_TASK,
                 this::notifyTransitionCancelled);
 
-        mStateCallback.addCallback(QUICK_SCRUB_START_UI_STATE, this::onQuickScrubStartUi);
-        mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_QUICK_SCRUB_START
-                | STATE_SCALED_CONTROLLER_RECENTS, this::onFinishedTransitionToQuickScrub);
-        mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_CURRENT_TASK_FINISHED
-                | STATE_QUICK_SCRUB_END, this::switchToFinalAppAfterQuickScrub);
-
         mStateCallback.addCallback(LONG_SWIPE_ENTER_STATE, this::checkLongSwipeCanEnter);
         mStateCallback.addCallback(LONG_SWIPE_START_STATE, this::checkLongSwipeCanStart);
 
@@ -409,9 +377,9 @@
     private void initTransitionEndpoints(DeviceProfile dp) {
         mDp = dp;
 
-        TransformedRect tempRect = new TransformedRect();
+        Rect tempRect = new Rect();
         mTransitionDragLength = mActivityControlHelper.getSwipeUpDestinationAndLength(
-                dp, mContext, mInteractionType, tempRect);
+                dp, mContext, tempRect);
         mClipAnimationHelper.updateTargetRect(tempRect);
     }
 
@@ -464,7 +432,6 @@
         });
         mRecentsView.setRecentsAnimationWrapper(mRecentsAnimationWrapper);
         mRecentsView.setClipAnimationHelper(mClipAnimationHelper);
-        mQuickScrubController = mRecentsView.getQuickScrubController();
         mLayoutListener = mActivityControlHelper.createLayoutListener(mActivity);
 
         mStateCallback.setState(STATE_LAUNCHER_PRESENT);
@@ -560,38 +527,12 @@
             LatencyTrackerCompat.logToggleRecents((int) (mLauncherFrameDrawnTime - mTouchTimeMs));
         }
 
-        // This method is only called when STATE_GESTURE_STARTED_QUICKSTEP/
-        // STATE_GESTURE_STARTED_QUICKSCRUB is set, so we can enable the high-res thumbnail loader
-        // here once we are sure that we will end up in an overview state
+        // This method is only called when STATE_GESTURE_STARTED is set, so we can enable the
+        // high-res thumbnail loader here once we are sure that we will end up in an overview state
         RecentsModel.INSTANCE.get(mContext).getThumbnailCache()
                 .getHighResLoadingState().setVisible(true);
     }
 
-    private void shiftAnimationDestinationForQuickscrub() {
-        TransformedRect tempRect = new TransformedRect();
-        mActivityControlHelper
-                .getSwipeUpDestinationAndLength(mDp, mContext, mInteractionType, tempRect);
-        mClipAnimationHelper.updateTargetRect(tempRect);
-
-        float offsetY =
-                mActivityControlHelper.getTranslationYForQuickScrub(tempRect, mDp, mContext);
-        float scale, offsetX;
-        Resources res = mContext.getResources();
-
-        if (ActivityManagerWrapper.getInstance().getRecentTasks(2, UserHandle.myUserId()).size()
-                < 2) {
-            // There are not enough tasks, we don't need to shift
-            offsetX = 0;
-            scale = 1;
-        } else {
-            offsetX = res.getDimensionPixelSize(R.dimen.recents_page_spacing)
-                    + tempRect.rect.width();
-            scale = getTaskCurveScaleForOffsetX(offsetX, tempRect.rect.width());
-        }
-        mClipAnimationHelper.offsetTarget(scale, Utilities.isRtl(res) ? -offsetX : offsetX, offsetY,
-                QuickScrubController.QUICK_SCRUB_START_INTERPOLATOR);
-    }
-
     private float getTaskCurveScaleForOffsetX(float offsetX, float taskWidth) {
         float distanceToReachEdge = mDp.widthPx / 2 + taskWidth / 2 +
                 mContext.getResources().getDimensionPixelSize(R.dimen.recents_page_spacing);
@@ -647,13 +588,11 @@
 
     @UiThread
     public void setShelfState(ShelfAnimState shelfState, Interpolator interpolator, long duration) {
-        if (mInteractionType == INTERACTION_NORMAL) {
-            mAnimationFactory.setShelfState(shelfState, interpolator, duration);
-            mIsShelfPeeking = shelfState == PEEK;
-            if (mRecentsView != null && shelfState.shouldPreformHaptic) {
-                mRecentsView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
-                        HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
-            }
+        mAnimationFactory.setShelfState(shelfState, interpolator, duration);
+        mIsShelfPeeking = shelfState == PEEK;
+        if (mRecentsView != null && shelfState.shouldPreformHaptic) {
+            mRecentsView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
+                    HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
         }
     }
 
@@ -662,7 +601,7 @@
      */
     public void buildAnimationController() {
         initTransitionEndpoints(mActivity.getDeviceProfile());
-        mAnimationFactory.createActivityController(mTransitionDragLength, mInteractionType);
+        mAnimationFactory.createActivityController(mTransitionDragLength);
     }
 
     private void onAnimatorPlaybackControllerCreated(AnimatorPlaybackController anim) {
@@ -678,7 +617,7 @@
         RecentsAnimationControllerCompat controller = mRecentsAnimationWrapper.getController();
         if (controller != null) {
             float offsetX = 0;
-            if (mRecentsView != null && mInteractionType == INTERACTION_NORMAL) {
+            if (mRecentsView != null) {
                 int startScroll = mRecentsView.getScrollForPage(mRecentsView.indexOfChild(
                         mRecentsView.getRunningTaskView()));
                 offsetX = startScroll - mRecentsView.getScrollX();
@@ -699,9 +638,7 @@
         }
 
         if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
-            if (mRecentsAnimationWrapper.getController() != null && mLayoutListener != null &&
-                    (mInteractionType == INTERACTION_NORMAL
-                            || !mQuickScrubController.hasFinishedTransitionToQuickScrub())) {
+            if (mRecentsAnimationWrapper.getController() != null && mLayoutListener != null) {
                 mLayoutListener.open();
                 mLayoutListener.update(mCurrentShift.value > 1, mLongSwipeMode,
                         mClipAnimationHelper.getCurrentRectWithInsets(),
@@ -712,15 +649,14 @@
         final boolean passed = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW;
         if (passed != mPassedOverviewThreshold) {
             mPassedOverviewThreshold = passed;
-            if (mInteractionType == INTERACTION_NORMAL && mRecentsView != null
-                    && !SWIPE_HOME.get()) {
+            if (mRecentsView != null && !SWIPE_HOME.get()) {
                 mRecentsView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
                     HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
             }
         }
         // Update insets of the non-running tasks, as we might switch to them.
         int runningTaskIndex = mRecentsView == null ? -1 : mRecentsView.getRunningTaskIndex();
-        if (mInteractionType == INTERACTION_NORMAL && runningTaskIndex >= 0) {
+        if (runningTaskIndex >= 0) {
             for (int i = 0; i < mRecentsView.getTaskViewCount(); i++) {
                 if (i != runningTaskIndex) {
                     mRecentsView.getTaskViewAt(i).setFullscreenProgress(1 - mCurrentShift.value);
@@ -780,7 +716,7 @@
         initTransitionEndpoints(dp);
 
         mRecentsAnimationWrapper.setController(targetSet.controller, targetSet);
-        mTouchInteractionLog.startRecentsAnimationCallback(targetSet.apps.length);
+        TOUCH_INTERACTION_LOG.startRecentsAnimationCallback(targetSet.apps.length);
         setStateOnUiThread(STATE_APP_CONTROLLER_RECEIVED);
 
         mPassedOverviewThreshold = false;
@@ -791,15 +727,14 @@
         mRecentsAnimationWrapper.setController(null, null);
         mActivityInitListener.unregister();
         setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED);
-        mTouchInteractionLog.cancelRecentsAnimation();
+        TOUCH_INTERACTION_LOG.cancelRecentsAnimation();
     }
 
     @UiThread
     public void onGestureStarted() {
         notifyGestureStartedAsync();
         mShiftAtGestureStart = mCurrentShift.value;
-        setStateOnUiThread(mInteractionType == INTERACTION_NORMAL
-                ? STATE_GESTURE_STARTED_QUICKSTEP : STATE_GESTURE_STARTED_QUICKSCRUB);
+        setStateOnUiThread(STATE_GESTURE_STARTED);
         mGestureStarted = true;
         mRecentsAnimationWrapper.hideCurrentInputMethod();
         mRecentsAnimationWrapper.enableInputConsumer();
@@ -845,8 +780,7 @@
             setTargetAlphaProvider(WindowTransformSwipeHandler::getHiddenTargetAlpha);
         }
 
-        return OverviewTouchConsumer.newInstance(mActivityControlHelper, true,
-                mTouchInteractionLog);
+        return OverviewTouchConsumer.newInstance(mActivityControlHelper, true);
     }
 
     @UiThread
@@ -1114,7 +1048,7 @@
     @UiThread
     private void resumeLastTask() {
         mRecentsAnimationWrapper.finish(false /* toRecents */, null);
-        mTouchInteractionLog.finishRecentsAnimation(false);
+        TOUCH_INTERACTION_LOG.finishRecentsAnimation(false);
     }
 
     @UiThread
@@ -1132,16 +1066,12 @@
                         mMainThreadHandler);
             });
         }
-        mTouchInteractionLog.finishRecentsAnimation(false);
+        TOUCH_INTERACTION_LOG.finishRecentsAnimation(false);
         doLogGesture(NEW_TASK);
     }
 
     public void reset() {
-        if (mInteractionType != INTERACTION_QUICK_SCRUB) {
-            // Only invalidate the handler if we are not quick scrubbing, otherwise, it will be
-            // invalidated after the quick scrub ends
-            setStateOnUiThread(STATE_HANDLER_INVALIDATED);
-        }
+        setStateOnUiThread(STATE_HANDLER_INVALIDATED);
     }
 
     public void cancel() {
@@ -1171,7 +1101,6 @@
         mRecentsView.setEnableFreeScroll(true);
         mRecentsView.setRunningTaskIconScaledDown(false);
         mRecentsView.setOnScrollChangeListener(null);
-        mQuickScrubController.cancelActiveQuickscrub();
     }
 
     private void notifyTransitionCancelled() {
@@ -1250,7 +1179,7 @@
                         () -> setStateOnUiThread(STATE_CURRENT_TASK_FINISHED));
             }
         }
-        mTouchInteractionLog.finishRecentsAnimation(true);
+        TOUCH_INTERACTION_LOG.finishRecentsAnimation(true);
     }
 
     private void finishCurrentTransitionToHome() {
@@ -1258,7 +1187,7 @@
             mRecentsAnimationWrapper.finish(true /* toRecents */,
                     () -> setStateOnUiThread(STATE_CURRENT_TASK_FINISHED));
         }
-        mTouchInteractionLog.finishRecentsAnimation(true);
+        TOUCH_INTERACTION_LOG.finishRecentsAnimation(true);
         doLogGesture(HOME);
     }
 
@@ -1279,91 +1208,6 @@
         reset();
     }
 
-    public void onQuickScrubStart() {
-        if (mInteractionType != INTERACTION_NORMAL) {
-            throw new IllegalArgumentException(
-                    "Can't change interaction type from " + mInteractionType);
-        }
-        mInteractionType = INTERACTION_QUICK_SCRUB;
-        mRecentsAnimationWrapper.runOnInit(this::shiftAnimationDestinationForQuickscrub);
-
-        setStateOnUiThread(STATE_QUICK_SCRUB_START | STATE_GESTURE_COMPLETED);
-
-        // Start the window animation without waiting for launcher.
-        long duration = FeatureFlags.QUICK_SWITCH.get()
-                ? QUICK_SWITCH_FROM_APP_START_DURATION
-                : QUICK_SCRUB_FROM_APP_START_DURATION;
-        animateToProgress(mCurrentShift.value, 1f, duration, LINEAR, RECENTS, 1f);
-    }
-
-    private void onQuickScrubStartUi() {
-        if (!mQuickScrubController.prepareQuickScrub(TAG, FeatureFlags.QUICK_SWITCH.get())) {
-            mQuickScrubBlocked = true;
-            setStateOnUiThread(STATE_RESUME_LAST_TASK | STATE_HANDLER_INVALIDATED);
-            return;
-        }
-        if (mLauncherTransitionController != null) {
-            mLauncherTransitionController.getAnimationPlayer().end();
-            mLauncherTransitionController = null;
-        }
-
-        mActivityControlHelper.onQuickInteractionStart(mActivity, mRunningTaskInfo, false,
-                mTouchInteractionLog);
-
-        // Inform the last progress in case we skipped before.
-        mQuickScrubController.onQuickScrubProgress(mCurrentQuickScrubProgress);
-    }
-
-    private void onFinishedTransitionToQuickScrub() {
-        if (mQuickScrubBlocked) {
-            return;
-        }
-        mLayoutListener.finish();
-        mQuickScrubController.onFinishedTransitionToQuickScrub();
-
-        mRecentsView.animateUpRunningTaskIconScale();
-        if (mQuickScrubController.isQuickSwitch()) {
-            // Adjust the running task so that it is centered and fills the screen.
-            TaskView runningTask = mRecentsView.getRunningTaskView();
-            if (runningTask != null) {
-                float insetHeight = mDp.heightPx - mDp.getInsets().top - mDp.getInsets().bottom;
-                // Usually insetDiff will be 0, unless we allow apps to draw under the insets. In
-                // that case (insetDiff != 0), we need to center in the system-specified available
-                // height rather than launcher's inset height by adding half the insetDiff.
-                float insetDiff = mDp.availableHeightPx - insetHeight;
-                float topMargin = mActivity.getResources().getDimension(
-                        R.dimen.task_thumbnail_half_top_margin);
-                runningTask.setTranslationY((insetDiff / 2 - topMargin) / mRecentsView.getScaleX());
-            }
-        }
-        RecentsModel.INSTANCE.get(mContext).onOverviewShown(false, TAG);
-    }
-
-    public void onQuickScrubProgress(float progress) {
-        mCurrentQuickScrubProgress = progress;
-        if (mQuickScrubController == null || mQuickScrubBlocked ||
-                !mStateCallback.hasStates(QUICK_SCRUB_START_UI_STATE)) {
-            return;
-        }
-        mQuickScrubController.onQuickScrubProgress(progress);
-    }
-
-    public void onQuickScrubEnd() {
-        setStateOnUiThread(STATE_QUICK_SCRUB_END);
-    }
-
-    private void switchToFinalAppAfterQuickScrub() {
-        if (mQuickScrubBlocked) {
-            return;
-        }
-        mQuickScrubController.onQuickScrubEnd();
-
-        // Normally this is handled in reset(), but since we are still scrubbing after the
-        // transition into recents, we need to defer the handler invalidation for quick scrub until
-        // after the gesture ends
-        setStateOnUiThread(STATE_HANDLER_INVALIDATED);
-    }
-
     public void setGestureEndCallback(Runnable gestureEndCallback) {
         mGestureEndCallback = gestureEndCallback;
     }
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
index 9679b81..e254e24 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
@@ -35,7 +35,6 @@
     public FallbackRecentsView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         setOverviewStateEnabled(true);
-        getQuickScrubController().onFinishedTransitionToQuickScrub();
     }
 
     @Override
diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java
index 720c1c4..6d374c6 100644
--- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java
+++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java
@@ -15,9 +15,7 @@
  */
 package com.android.quickstep.util;
 
-import static com.android.launcher3.anim.Interpolators.LINEAR;
 import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
-import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_TRANSLATION_Y_FACTOR;
 import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING;
 import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING;
 
@@ -26,19 +24,15 @@
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.graphics.Matrix.ScaleToFit;
-import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.os.Build;
 import android.os.RemoteException;
-import android.view.animation.Interpolator;
-import androidx.annotation.Nullable;
 
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
-import com.android.launcher3.anim.Interpolators;
 import com.android.launcher3.views.BaseDragLayer;
 import com.android.quickstep.RecentsModel;
 import com.android.quickstep.views.RecentsView;
@@ -53,6 +47,8 @@
 
 import java.util.function.BiFunction;
 
+import androidx.annotation.Nullable;
+
 /**
  * Utility class to handle window clip animation
  */
@@ -67,8 +63,6 @@
     private final RectF mSourceRect = new RectF();
     // The bounds of the task view in launcher window coordinates
     private final RectF mTargetRect = new RectF();
-    // Set when the final window destination is changed, such as offsetting for quick scrub
-    private final PointF mTargetOffset = new PointF();
     // The insets to be used for clipping the app window, which can be larger than mSourceInsets
     // if the aspect ratio of the target is smaller than the aspect ratio of the source rect. In
     // app window coordinates.
@@ -95,11 +89,6 @@
 
     // Corner radius currently applied to transformed window.
     private float mCurrentCornerRadius;
-    private float mTargetScale = 1f;
-    private float mOffsetScale = 1f;
-    private Interpolator mInterpolator = LINEAR;
-    // We translate y slightly faster than the rest of the animation for quick scrub.
-    private Interpolator mOffsetYInterpolator = LINEAR;
 
     // Whether to boost the opening animation target layers, or the closing
     private int mBoostModeTargetLayers = -1;
@@ -130,13 +119,11 @@
         updateSourceStack(target);
     }
 
-    public void updateTargetRect(TransformedRect targetRect) {
-        mOffsetScale = targetRect.scale;
+    public void updateTargetRect(Rect targetRect) {
         mSourceRect.set(mSourceInsets.left, mSourceInsets.top,
                 mSourceStackBounds.width() - mSourceInsets.right,
                 mSourceStackBounds.height() - mSourceInsets.bottom);
-        mTargetRect.set(targetRect.rect);
-        Utilities.scaleRectFAboutCenter(mTargetRect, targetRect.scale);
+        mTargetRect.set(targetRect);
         mTargetRect.offset(mHomeStackBounds.left - mSourceStackBounds.left,
                 mHomeStackBounds.top - mSourceStackBounds.top);
 
@@ -165,18 +152,11 @@
         if (params.currentRect == null) {
             RectF currentRect;
             mTmpRectF.set(mTargetRect);
-            Utilities.scaleRectFAboutCenter(mTmpRectF, mTargetScale * params.offsetScale);
-            float offsetYProgress = mOffsetYInterpolator.getInterpolation(params.progress);
-            float progress = mInterpolator.getInterpolation(params.progress);
+            Utilities.scaleRectFAboutCenter(mTmpRectF, params.offsetScale);
+            float progress = params.progress;
             currentRect = mRectFEvaluator.evaluate(progress, mSourceRect, mTmpRectF);
             currentRect.offset(params.offsetX, 0);
 
-            synchronized (mTargetOffset) {
-                // Stay lined up with the center of the target, since it moves for quick scrub.
-                currentRect.offset(mTargetOffset.x * mOffsetScale * progress,
-                        mTargetOffset.y  * offsetYProgress);
-            }
-
             final RectF sourceWindowClipInsets = params.forLiveTile
                     ? mSourceWindowClipInsetsForLiveTile : mSourceWindowClipInsets;
             mClipRectF.left = sourceWindowClipInsets.left * progress;
@@ -246,16 +226,6 @@
         mTaskAlphaCallback = callback;
     }
 
-    public void offsetTarget(float scale, float offsetX, float offsetY, Interpolator interpolator) {
-        synchronized (mTargetOffset) {
-            mTargetOffset.set(offsetX, offsetY);
-        }
-        mTargetScale = scale;
-        mInterpolator = interpolator;
-        mOffsetYInterpolator = Interpolators.clampToProgress(mInterpolator, 0,
-                QUICK_SCRUB_TRANSLATION_Y_FACTOR);
-    }
-
     public void fromTaskThumbnailView(TaskThumbnailView ttv, RecentsView rv) {
         fromTaskThumbnailView(ttv, rv, null);
     }
@@ -280,8 +250,8 @@
             mSourceInsets.set(ttv.getInsets(fallback));
         }
 
-        TransformedRect targetRect = new TransformedRect();
-        dl.getDescendantRectRelativeToSelf(ttv, targetRect.rect);
+        Rect targetRect = new Rect();
+        dl.getDescendantRectRelativeToSelf(ttv, targetRect);
         updateTargetRect(targetRect);
 
         if (target == null) {
diff --git a/quickstep/src/com/android/quickstep/util/TransformedRect.java b/quickstep/src/com/android/quickstep/util/TransformedRect.java
deleted file mode 100644
index 79f11e4..0000000
--- a/quickstep/src/com/android/quickstep/util/TransformedRect.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep.util;
-
-import android.graphics.Rect;
-
-/**
- * A wrapper around {@link Rect} with additional transformation properties
- */
-public class TransformedRect {
-
-    public final Rect rect = new Rect();
-    public float scale = 1;
-
-    public void set(TransformedRect transformedRect) {
-        rect.set(transformedRect.rect);
-        scale = transformedRect.scale;
-    }
-}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 5925c4c..0c1867d 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -88,7 +88,6 @@
 import com.android.launcher3.util.Themes;
 import com.android.launcher3.util.ViewPool;
 import com.android.quickstep.OverviewCallbacks;
-import com.android.quickstep.QuickScrubController;
 import com.android.quickstep.RecentsAnimationWrapper;
 import com.android.quickstep.RecentsModel;
 import com.android.quickstep.TaskThumbnailCache;
@@ -152,7 +151,6 @@
     private static final float[] sTempFloatArray = new float[3];
 
     protected final T mActivity;
-    private final QuickScrubController mQuickScrubController;
     private final float mFastFlingVelocity;
     private final RecentsModel mModel;
     private final int mTaskTopMargin;
@@ -215,9 +213,6 @@
                 return;
             }
 
-            // Notify the quick scrub controller that a particular task has been removed
-            mQuickScrubController.onTaskRemoved(taskId);
-
             BackgroundExecutor.get().submit(() -> {
                 TaskView taskView = getTaskView(taskId);
                 if (taskView == null) {
@@ -310,7 +305,6 @@
         mFastFlingVelocity = getResources()
                 .getDimensionPixelSize(R.dimen.recents_fast_fling_velocity);
         mActivity = (T) BaseActivity.fromContext(context);
-        mQuickScrubController = new QuickScrubController(mActivity, this);
         mModel = RecentsModel.INSTANCE.get(context);
         mIdp = InvariantDeviceProfile.INSTANCE.get(context);
 
@@ -550,10 +544,6 @@
             mIgnoreResetTaskId = -1;
         }
         resetTaskVisuals();
-
-        if (oldChildCount != getChildCount()) {
-            mQuickScrubController.snapToNextTaskIfAvailable();
-        }
         onTaskStackUpdated();
     }
 
@@ -605,7 +595,6 @@
         mTaskWidth = mTempRect.width();
         mTaskHeight = mTempRect.height();
 
-        // Keep this logic in sync with ActivityControlHelper.getTranslationYForQuickScrub.
         mTempRect.top -= mTaskTopMargin;
         setPadding(mTempRect.left - mInsets.left, mTempRect.top - mInsets.top,
                 dp.widthPx - mInsets.right - mTempRect.right,
@@ -854,10 +843,6 @@
         }
     }
 
-    public QuickScrubController getQuickScrubController() {
-        return mQuickScrubController;
-    }
-
     public void setRunningTaskIconScaledDown(boolean isScaledDown) {
         if (mRunningTaskIconScaledDown != isScaledDown) {
             mRunningTaskIconScaledDown = isScaledDown;
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java
index 88e7ea8..9422141 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -412,10 +412,7 @@
 
     public void resetVisualProperties() {
         resetViewTransforms();
-        if (!getRecentsView().getQuickScrubController().isQuickSwitch()) {
-            // Reset full screen progress unless we are doing back to back quick switch.
-            setFullscreenProgress(0);
-        }
+        setFullscreenProgress(0);
     }
 
     @Override
diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java
index beef97e..899cdd3 100644
--- a/src/com/android/launcher3/LauncherState.java
+++ b/src/com/android/launcher3/LauncherState.java
@@ -27,7 +27,6 @@
 import com.android.launcher3.states.SpringLoadedState;
 import com.android.launcher3.uioverrides.AllAppsState;
 import com.android.launcher3.uioverrides.BackgroundAppState;
-import com.android.launcher3.uioverrides.FastOverviewState;
 import com.android.launcher3.uioverrides.OverviewState;
 import com.android.launcher3.uioverrides.UiFactory;
 import com.android.launcher3.userevent.nano.LauncherLogProto.Action;
@@ -87,9 +86,8 @@
      */
     public static final LauncherState SPRING_LOADED = new SpringLoadedState(1);
     public static final LauncherState OVERVIEW = new OverviewState(2);
-    public static final LauncherState FAST_OVERVIEW = new FastOverviewState(3);
-    public static final LauncherState ALL_APPS = new AllAppsState(4);
-    public static final LauncherState BACKGROUND_APP = new BackgroundAppState(5);
+    public static final LauncherState ALL_APPS = new AllAppsState(3);
+    public static final LauncherState BACKGROUND_APP = new BackgroundAppState(4);
 
     public final int ordinal;
 
@@ -187,6 +185,7 @@
      *   translationY factor where 0 is top aligned and 0.5 is centered vertically
      */
     public float[] getOverviewScaleAndTranslationYFactor(Launcher launcher) {
+        // TODO: Simplify to use a constant value instead of a factor.
         return new float[] {1.1f, 0f};
     }
 
diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/FastOverviewState.java b/src_ui_overrides/com/android/launcher3/uioverrides/FastOverviewState.java
deleted file mode 100644
index 147d194..0000000
--- a/src_ui_overrides/com/android/launcher3/uioverrides/FastOverviewState.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.uioverrides;
-
-/**
- * A dummy overview state
- */
-public class FastOverviewState extends OverviewState {
-
-    public FastOverviewState(int id) {
-        super(id);
-    }
-}