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..f3b27fa 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;
@@ -210,8 +153,7 @@
             // Optimization, hide the all apps view to prevent layout while initializing
             activity.getAppsView().getContentView().setVisibility(View.GONE);
 
-            AccessibilityManagerCompat.sendEventToTest(
-                    activity, TestProtocol.SWITCHED_TO_STATE_MESSAGE);
+            AccessibilityManagerCompat.sendStateEventToTest(activity, fromState.ordinal);
         } else {
             fromState = startState;
         }
@@ -221,10 +163,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 +211,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 +234,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 +344,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/com/android/launcher3/TestProtocol.java b/src/com/android/launcher3/TestProtocol.java
index 0a3b86d..008b624 100644
--- a/src/com/android/launcher3/TestProtocol.java
+++ b/src/com/android/launcher3/TestProtocol.java
@@ -22,6 +22,7 @@
 public final class TestProtocol {
     public static final String GET_SCROLL_MESSAGE = "TAPL_GET_SCROLL";
     public static final String SCROLL_Y_FIELD = "scrollY";
+    public static final String STATE_FIELD = "state";
     public static final String SWITCHED_TO_STATE_MESSAGE = "TAPL_SWITCHED_TO_STATE";
     public static final String RESPONSE_MESSAGE_POSTFIX = "_RESPONSE";
 }
diff --git a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java
index 6feb1e9..51e914c 100644
--- a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java
+++ b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java
@@ -52,11 +52,14 @@
         return (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
     }
 
-    public static void sendEventToTest(Context context, String eventTag) {
+    public static void sendStateEventToTest(Context context, int stateOrdinal) {
         final AccessibilityManager accessibilityManager = getAccessibilityManagerForTest(context);
         if (accessibilityManager == null) return;
 
-        sendEventToTest(accessibilityManager, eventTag, null);
+        final Bundle parcel = new Bundle();
+        parcel.putInt(TestProtocol.STATE_FIELD, stateOrdinal);
+
+        sendEventToTest(accessibilityManager, TestProtocol.SWITCHED_TO_STATE_MESSAGE, parcel);
     }
 
     private static void sendEventToTest(
diff --git a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java
index 0e2ed6c..c125c10 100644
--- a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java
+++ b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java
@@ -522,8 +522,7 @@
             }
             mLauncher.getStateManager().goToState(targetState, false /* animated */);
 
-            AccessibilityManagerCompat.sendEventToTest(
-                    mLauncher, TestProtocol.SWITCHED_TO_STATE_MESSAGE);
+            AccessibilityManagerCompat.sendStateEventToTest(mLauncher, targetState.ordinal);
         }
     }
 
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);
-    }
-}
diff --git a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java
index 42817c1..3e4b1f3 100644
--- a/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java
+++ b/tests/tapl/com/android/launcher3/tapl/AllAppsFromOverview.java
@@ -45,7 +45,8 @@
         final Point start = qsb.getVisibleCenter();
         final int endY = (int) (mLauncher.getDevice().getDisplayHeight() * 0.6);
         LauncherInstrumentation.log("AllAppsFromOverview.switchBackToOverview before swipe");
-        mLauncher.swipe(start.x, start.y, start.x, endY);
+        mLauncher.swipe(
+                start.x, start.y, start.x, endY, LauncherInstrumentation.OVERVIEW_STATE_ORDINAL);
 
         return new Overview(mLauncher);
     }
diff --git a/tests/tapl/com/android/launcher3/tapl/Background.java b/tests/tapl/com/android/launcher3/tapl/Background.java
index 08d2889..790e938 100644
--- a/tests/tapl/com/android/launcher3/tapl/Background.java
+++ b/tests/tapl/com/android/launcher3/tapl/Background.java
@@ -50,21 +50,22 @@
     @NonNull
     public BaseOverview switchToOverview() {
         verifyActiveContainer();
-        goToOverviewUnchecked();
+        goToOverviewUnchecked(LauncherInstrumentation.BACKGROUND_APP_STATE_ORDINAL);
         assertTrue("Overview not visible", mLauncher.getDevice().wait(
                 Until.hasObject(By.pkg(getOverviewPackageName())), WAIT_TIME_MS));
         return new BaseOverview(mLauncher);
     }
 
 
-    protected void goToOverviewUnchecked() {
+    protected void goToOverviewUnchecked(int expectedState) {
         if (mLauncher.isSwipeUpEnabled()) {
             final int height = mLauncher.getDevice().getDisplayHeight();
             final UiObject2 navBar = mLauncher.getSystemUiObject("navigation_bar_frame");
 
             mLauncher.swipe(
                     navBar.getVisibleBounds().centerX(), navBar.getVisibleBounds().centerY(),
-                    navBar.getVisibleBounds().centerX(), height - 400);
+                    navBar.getVisibleBounds().centerX(), height - 400,
+                    expectedState);
         } else {
             mLauncher.getSystemUiObject("recent_apps").click();
         }
diff --git a/tests/tapl/com/android/launcher3/tapl/Home.java b/tests/tapl/com/android/launcher3/tapl/Home.java
index 522ce14..bf857f0 100644
--- a/tests/tapl/com/android/launcher3/tapl/Home.java
+++ b/tests/tapl/com/android/launcher3/tapl/Home.java
@@ -47,7 +47,7 @@
     @Override
     public Overview switchToOverview() {
         verifyActiveContainer();
-        goToOverviewUnchecked();
+        goToOverviewUnchecked(LauncherInstrumentation.OVERVIEW_STATE_ORDINAL);
         return new Overview(mLauncher);
     }
 }
\ No newline at end of file
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index 6b76012..6aa18d3 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -54,6 +54,9 @@
 public final class LauncherInstrumentation {
 
     private static final String TAG = "Tapl";
+    static final int OVERVIEW_STATE_ORDINAL = 2;
+    static final int APPS_LIST_STATE_ORDINAL = 4;
+    static final int BACKGROUND_APP_STATE_ORDINAL = 5;
 
     // Types for launcher containers that the user is interacting with. "Background" is a
     // pseudo-container corresponding to inactive launcher covered by another app.
@@ -154,7 +157,7 @@
         fail(message + ". " + "Actual: " + actual);
     }
 
-    static public void assertEquals(String message, int expected, int actual) {
+    static private void assertEquals(String message, int expected, int actual) {
         if (expected != actual) {
             fail(message + " expected: " + expected + " but was: " + actual);
         }
@@ -416,12 +419,14 @@
         return mDevice;
     }
 
-    void swipe(int startX, int startY, int endX, int endY) {
-        executeAndWaitForEvent(
+    void swipe(int startX, int startY, int endX, int endY, int expectedState) {
+        final Bundle parcel = (Bundle) executeAndWaitForEvent(
                 () -> mDevice.swipe(startX, startY, endX, endY, 60),
                 event -> TestProtocol.SWITCHED_TO_STATE_MESSAGE.equals(event.getClassName()),
                 "Swipe failed to receive an event for the swipe end: " + startX + ", " + startY
                         + ", " + endX + ", " + endY);
+        assertEquals("Swipe switched launcher to a wrong state",
+                expectedState, parcel.getInt(TestProtocol.STATE_FIELD));
     }
 
     void waitForIdle() {
diff --git a/tests/tapl/com/android/launcher3/tapl/Overview.java b/tests/tapl/com/android/launcher3/tapl/Overview.java
index 9e0c07f..1f7ed29 100644
--- a/tests/tapl/com/android/launcher3/tapl/Overview.java
+++ b/tests/tapl/com/android/launcher3/tapl/Overview.java
@@ -51,7 +51,8 @@
         final UiObject2 navBar = mLauncher.getSystemUiObject("navigation_bar_frame");
         final Point start = navBar.getVisibleCenter();
         LauncherInstrumentation.log("Overview.switchToAllApps before swipe");
-        mLauncher.swipe(start.x, start.y, start.x, 0);
+        mLauncher.swipe(
+                start.x, start.y, start.x, 0, LauncherInstrumentation.APPS_LIST_STATE_ORDINAL);
 
         return new AllAppsFromOverview(mLauncher);
     }
diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java
index e10c4fb..4f86603 100644
--- a/tests/tapl/com/android/launcher3/tapl/Workspace.java
+++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java
@@ -55,7 +55,8 @@
                 start.x,
                 start.y,
                 start.x,
-                endY
+                endY,
+                LauncherInstrumentation.APPS_LIST_STATE_ORDINAL
         );
 
         return new AllApps(mLauncher);
