diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index a59aead..ab6eafb 100644
--- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -414,13 +414,6 @@
     }
 
     @Override
-    protected boolean canToggleHomeAllApps() {
-        return mLauncher.isResumed()
-                && !mTaskbarLauncherStateController.isInOverview()
-                && !mLauncher.areFreeformTasksVisible();
-    }
-
-    @Override
     public RecentsView getRecentsView() {
         return mLauncher.getOverviewPanel();
     }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 26212c1..557c009 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -1560,13 +1560,4 @@
     public float getStashedTaskbarScale() {
         return mControllers.stashedHandleViewController.getStashedHandleHintScale().value;
     }
-
-    /** Closes the KeyboardQuickSwitchView without an animation if open. */
-    public void closeKeyboardQuickSwitchView() {
-        mControllers.keyboardQuickSwitchController.closeQuickSwitchView(false);
-    }
-
-    boolean canToggleHomeAllApps() {
-        return mControllers.uiController.canToggleHomeAllApps();
-    }
 }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index e4f9ba5..1b03e7a 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -23,6 +23,7 @@
 
 import static com.android.launcher3.BaseActivity.EVENT_DESTROYED;
 import static com.android.launcher3.Flags.enableUnfoldStateAnimation;
+import static com.android.launcher3.LauncherState.OVERVIEW;
 import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION;
 import static com.android.launcher3.config.FeatureFlags.enableTaskbarNoRecreate;
 import static com.android.launcher3.util.DisplayController.CHANGE_DENSITY;
@@ -66,7 +67,6 @@
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.SettingsCache;
 import com.android.launcher3.util.SimpleBroadcastReceiver;
-import com.android.quickstep.AllAppsActionManager;
 import com.android.quickstep.RecentsActivity;
 import com.android.quickstep.SystemUiProxy;
 import com.android.quickstep.TouchInteractionService;
@@ -155,8 +155,6 @@
     private final SimpleBroadcastReceiver mTaskbarBroadcastReceiver =
             new SimpleBroadcastReceiver(this::showTaskbarFromBroadcast);
 
-    private final AllAppsActionManager mAllAppsActionManager;
-
     private final Runnable mActivityOnDestroyCallback = new Runnable() {
         @Override
         public void run() {
@@ -207,14 +205,12 @@
             };
 
     @SuppressLint("WrongConstant")
-    public TaskbarManager(
-            TouchInteractionService service, AllAppsActionManager allAppsActionManager) {
+    public TaskbarManager(TouchInteractionService service) {
         Display display =
                 service.getSystemService(DisplayManager.class).getDisplay(DEFAULT_DISPLAY);
         mContext = service.createWindowContext(display,
                 ENABLE_TASKBAR_NAVBAR_UNIFICATION ? TYPE_NAVIGATION_BAR : TYPE_NAVIGATION_BAR_PANEL,
                 null);
-        mAllAppsActionManager = allAppsActionManager;
         mNavigationBarPanelContext = ENABLE_TASKBAR_NAVBAR_UNIFICATION
                 ? service.createWindowContext(display, TYPE_NAVIGATION_BAR_PANEL, null)
                 : null;
@@ -265,10 +261,10 @@
                     recreateTaskbar();
                 } else {
                     // Config change might be handled without re-creating the taskbar
-                    if (dp != null && !isTaskbarEnabled(dp)) {
+                    if (dp != null && !isTaskbarPresent(dp)) {
                         destroyExistingTaskbar();
                     } else {
-                        if (dp != null && isTaskbarEnabled(dp)) {
+                        if (dp != null && isTaskbarPresent(dp)) {
                             if (ENABLE_TASKBAR_NAVBAR_UNIFICATION) {
                                 // Re-initialize for screen size change? Should this be done
                                 // by looking at screen-size change flag in configDiff in the
@@ -323,7 +319,7 @@
         }
         DeviceProfile dp = mUserUnlocked ?
                 LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
-        if (dp == null || !isTaskbarEnabled(dp)) {
+        if (dp == null || !isTaskbarPresent(dp)) {
             removeTaskbarRootViewFromWindow();
         }
     }
@@ -343,11 +339,20 @@
      * @param homeAllAppsIntent Intent used if Taskbar is not enabled or Launcher is resumed.
      */
     public void toggleAllApps(Intent homeAllAppsIntent) {
-        if (mTaskbarActivityContext == null || mTaskbarActivityContext.canToggleHomeAllApps()) {
+        if (mTaskbarActivityContext == null) {
             mContext.startActivity(homeAllAppsIntent);
-        } else {
-            mTaskbarActivityContext.toggleAllAppsSearch();
+            return;
         }
+
+        if (mActivity != null
+                && mActivity.isResumed()
+                && !mActivity.isInState(OVERVIEW)
+                && !(mActivity instanceof QuickstepLauncher l && l.areFreeformTasksVisible())) {
+            mContext.startActivity(homeAllAppsIntent);
+            return;
+        }
+
+        mTaskbarActivityContext.toggleAllAppsSearch();
     }
 
     /**
@@ -442,12 +447,9 @@
             DeviceProfile dp = mUserUnlocked ?
                 LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
 
-            // All Apps action is unrelated to navbar unification, so we only need to check DP.
-            mAllAppsActionManager.setTaskbarPresent(dp != null && dp.isTaskbarPresent);
-
             destroyExistingTaskbar();
 
-            boolean isTaskbarEnabled = dp != null && isTaskbarEnabled(dp);
+            boolean isTaskbarEnabled = dp != null && isTaskbarPresent(dp);
             debugWhyTaskbarNotDestroyed("recreateTaskbar: isTaskbarEnabled=" + isTaskbarEnabled
                 + " [dp != null (i.e. mUserUnlocked)]=" + (dp != null)
                 + " FLAG_HIDE_NAVBAR_WINDOW=" + ENABLE_TASKBAR_NAVBAR_UNIFICATION
@@ -512,7 +514,7 @@
         }
     }
 
-    private static boolean isTaskbarEnabled(DeviceProfile deviceProfile) {
+    private static boolean isTaskbarPresent(DeviceProfile deviceProfile) {
         return ENABLE_TASKBAR_NAVBAR_UNIFICATION || deviceProfile.isTaskbarPresent;
     }
 
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
index 109400e..efe1e39 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
@@ -197,11 +197,6 @@
         return false;
     }
 
-    /** Returns {@code true} if Home All Apps available instead of Taskbar All Apps. */
-    protected boolean canToggleHomeAllApps() {
-        return false;
-    }
-
     @CallSuper
     protected void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(String.format(
diff --git a/quickstep/src/com/android/quickstep/AllAppsActionManager.kt b/quickstep/src/com/android/quickstep/AllAppsActionManager.kt
deleted file mode 100644
index fd2ed3a..0000000
--- a/quickstep/src/com/android/quickstep/AllAppsActionManager.kt
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2024 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 android.accessibilityservice.AccessibilityService.GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS
-import android.app.PendingIntent
-import android.app.RemoteAction
-import android.content.Context
-import android.graphics.drawable.Icon
-import android.view.accessibility.AccessibilityManager
-import com.android.launcher3.R
-import java.util.concurrent.Executor
-
-/**
- * Registers a [RemoteAction] for toggling All Apps if needed.
- *
- * We need this action when either [isHomeAndOverviewSame] or [isTaskbarPresent] is `true`. When
- * home and overview are the same, we can control Launcher's or Taskbar's All Apps tray. If they are
- * not the same, but Taskbar is present, we can only control Taskbar's tray.
- */
-class AllAppsActionManager(
-    private val context: Context,
-    private val bgExecutor: Executor,
-    private val createAllAppsPendingIntent: () -> PendingIntent,
-) {
-
-    /** `true` if home and overview are the same Activity. */
-    var isHomeAndOverviewSame = false
-        set(value) {
-            field = value
-            updateSystemAction()
-        }
-
-    /** `true` if Taskbar is enabled. */
-    var isTaskbarPresent = false
-        set(value) {
-            field = value
-            updateSystemAction()
-        }
-
-    /** `true` if the action should be registered. */
-    var isActionRegistered = false
-        private set
-
-    private fun updateSystemAction() {
-        val shouldRegisterAction = isHomeAndOverviewSame || isTaskbarPresent
-        if (isActionRegistered == shouldRegisterAction) return
-        isActionRegistered = shouldRegisterAction
-
-        bgExecutor.execute {
-            val accessibilityManager =
-                context.getSystemService(AccessibilityManager::class.java) ?: return@execute
-            if (shouldRegisterAction) {
-                accessibilityManager.registerSystemAction(
-                    RemoteAction(
-                        Icon.createWithResource(context, R.drawable.ic_apps),
-                        context.getString(R.string.all_apps_label),
-                        context.getString(R.string.all_apps_label),
-                        createAllAppsPendingIntent(),
-                    ),
-                    GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS,
-                )
-            } else {
-                accessibilityManager.unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS)
-            }
-        }
-    }
-
-    fun onDestroy() {
-        context
-            .getSystemService(AccessibilityManager::class.java)
-            ?.unregisterSystemAction(
-                GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS,
-            )
-    }
-}
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index b43c520..719c4f7 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -31,7 +31,6 @@
 import static com.android.launcher3.MotionEventsUtils.isTrackpadMultiFingerSwipe;
 import static com.android.launcher3.config.FeatureFlags.ENABLE_TRACKPAD_GESTURE;
 import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
-import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
 import static com.android.launcher3.util.OnboardingPrefs.HOME_BOUNCE_SEEN;
 import static com.android.launcher3.util.window.WindowManagerProxy.MIN_TABLET_WIDTH;
 import static com.android.quickstep.GestureState.DEFAULT_STATE;
@@ -60,12 +59,14 @@
 import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_STARTING_WINDOW;
 
 import android.app.PendingIntent;
+import android.app.RemoteAction;
 import android.app.Service;
 import android.content.IIntentReceiver;
 import android.content.IIntentSender;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.graphics.Region;
+import android.graphics.drawable.Icon;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.Looper;
@@ -76,6 +77,7 @@
 import android.view.InputDevice;
 import android.view.InputEvent;
 import android.view.MotionEvent;
+import android.view.accessibility.AccessibilityManager;
 
 import androidx.annotation.BinderThread;
 import androidx.annotation.NonNull;
@@ -86,6 +88,7 @@
 import com.android.launcher3.ConstantItem;
 import com.android.launcher3.EncryptionType;
 import com.android.launcher3.LauncherPrefs;
+import com.android.launcher3.R;
 import com.android.launcher3.anim.AnimatedFloat;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.provider.RestoreDbTask;
@@ -98,6 +101,7 @@
 import com.android.launcher3.uioverrides.flags.FlagsFactory;
 import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
 import com.android.launcher3.util.DisplayController;
+import com.android.launcher3.util.Executors;
 import com.android.launcher3.util.LockedUserState;
 import com.android.launcher3.util.SafeCloseable;
 import com.android.launcher3.util.ScreenOnTracker;
@@ -484,7 +488,6 @@
 
     private TaskbarManager mTaskbarManager;
     private Function<GestureState, AnimatedFloat> mSwipeUpProxyProvider = i -> null;
-    private AllAppsActionManager mAllAppsActionManager;
 
     @Override
     public void onCreate() {
@@ -494,9 +497,7 @@
         mMainChoreographer = Choreographer.getInstance();
         mAM = ActivityManagerWrapper.getInstance();
         mDeviceState = new RecentsAnimationDeviceState(this, true);
-        mAllAppsActionManager = new AllAppsActionManager(
-                this, UI_HELPER_EXECUTOR, this::createAllAppsPendingIntent);
-        mTaskbarManager = new TaskbarManager(this, mAllAppsActionManager);
+        mTaskbarManager = new TaskbarManager(this);
         mRotationTouchHelper = mDeviceState.getRotationTouchHelper();
         mInputConsumer = InputConsumerController.getRecentsAnimationInputConsumer();
         BootAwarePreloader.start(this);
@@ -589,7 +590,16 @@
     }
 
     private void onOverviewTargetChange(boolean isHomeAndOverviewSame) {
-        mAllAppsActionManager.setHomeAndOverviewSame(isHomeAndOverviewSame);
+        Executors.UI_HELPER_EXECUTOR.execute(() -> {
+            AccessibilityManager am = getSystemService(AccessibilityManager.class);
+
+            if (isHomeAndOverviewSame) {
+                am.registerSystemAction(
+                        createAllAppsAction(), GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS);
+            } else {
+                am.unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS);
+            }
+        });
 
         StatefulActivity newOverviewActivity = mOverviewComponentObserver.getActivityInterface()
                 .getCreatedActivity();
@@ -599,12 +609,13 @@
         mTISBinder.onOverviewTargetChange();
     }
 
-    private PendingIntent createAllAppsPendingIntent() {
+    private RemoteAction createAllAppsAction() {
         final Intent homeIntent = new Intent(mOverviewComponentObserver.getHomeIntent())
                 .setAction(INTENT_ACTION_ALL_APPS_TOGGLE);
+        final PendingIntent actionPendingIntent;
 
         if (FeatureFlags.ENABLE_ALL_APPS_SEARCH_IN_TASKBAR.get()) {
-            return new PendingIntent(new IIntentSender.Stub() {
+            actionPendingIntent = new PendingIntent(new IIntentSender.Stub() {
                 @Override
                 public void send(int code, Intent intent, String resolvedType,
                         IBinder allowlistToken, IIntentReceiver finishedReceiver,
@@ -613,12 +624,18 @@
                 }
             });
         } else {
-            return PendingIntent.getActivity(
+            actionPendingIntent = PendingIntent.getActivity(
                     this,
                     GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS,
                     homeIntent,
                     PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
         }
+
+        return new RemoteAction(
+                Icon.createWithResource(this, R.drawable.ic_apps),
+                getString(R.string.all_apps_label),
+                getString(R.string.all_apps_label),
+                actionPendingIntent);
     }
 
     @UiThread
@@ -661,7 +678,8 @@
         mDeviceState.destroy();
         SystemUiProxy.INSTANCE.get(this).clearProxy();
 
-        mAllAppsActionManager.onDestroy();
+        getSystemService(AccessibilityManager.class)
+                .unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS);
 
         mTaskbarManager.destroy();
         sConnected = false;
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt
deleted file mode 100644
index 73b35e8..0000000
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2024 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 android.app.PendingIntent
-import android.content.IIntentSender
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.platform.app.InstrumentationRegistry
-import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR
-import com.android.launcher3.util.TestUtil
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.Semaphore
-import java.util.concurrent.TimeUnit.SECONDS
-import org.junit.Test
-import org.junit.runner.RunWith
-
-private const val TIMEOUT = 5L
-
-@RunWith(AndroidJUnit4::class)
-class AllAppsActionManagerTest {
-    private val callbackSemaphore = Semaphore(0)
-    private val bgExecutor = UI_HELPER_EXECUTOR
-
-    private val allAppsActionManager =
-        AllAppsActionManager(
-            InstrumentationRegistry.getInstrumentation().targetContext,
-            bgExecutor,
-        ) {
-            callbackSemaphore.release()
-            PendingIntent(IIntentSender.Default())
-        }
-
-    @Test
-    fun taskbarPresent_actionRegistered() {
-        allAppsActionManager.isTaskbarPresent = true
-        assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
-        assertThat(allAppsActionManager.isActionRegistered).isTrue()
-    }
-
-    @Test
-    fun homeAndOverviewSame_actionRegistered() {
-        allAppsActionManager.isHomeAndOverviewSame = true
-        assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
-        assertThat(allAppsActionManager.isActionRegistered).isTrue()
-    }
-
-    @Test
-    fun toggleTaskbar_destroyedAfterActionRegistered_actionUnregistered() {
-        allAppsActionManager.isTaskbarPresent = true
-        assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
-
-        allAppsActionManager.isTaskbarPresent = false
-        TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to unregister.
-        assertThat(allAppsActionManager.isActionRegistered).isFalse()
-    }
-
-    @Test
-    fun toggleTaskbar_destroyedBeforeActionRegistered_pendingActionUnregistered() {
-        allAppsActionManager.isTaskbarPresent = true
-        allAppsActionManager.isTaskbarPresent = false
-
-        TestUtil.runOnExecutorSync(bgExecutor) {} // Force system action to unregister.
-        assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
-        assertThat(allAppsActionManager.isActionRegistered).isFalse()
-    }
-
-    @Test
-    fun changeHome_sameAsOverviewBeforeActionUnregistered_actionRegisteredAgain() {
-        allAppsActionManager.isHomeAndOverviewSame = true // Initialize to same.
-        assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
-
-        allAppsActionManager.isHomeAndOverviewSame = false
-        allAppsActionManager.isHomeAndOverviewSame = true
-        assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
-        assertThat(allAppsActionManager.isActionRegistered).isTrue()
-    }
-}
