From 84fbec0b16cea289a375d5eda3808296fe6b2808 Mon Sep 17 00:00:00 2001 From: Brian Isganitis Date: Tue, 9 Apr 2024 10:55:58 -0700 Subject: [PATCH] Prevent meta shortcut from cancelling split select state. There are two things that need to be changed for this to work: 1. Make the isInOverview condition check for any Overview UI (including the split select state, modal, etc.) 2. Toggle Home All Apps directly, because firing the intent will cause Launcher to pause and resume before the intent is handled. We misinterpret the pause as a request to cancel split screen. Since TaskbarManager has a reference to Launcher, we might as well call the method directly. Test: Manual Fix: 319076403 Flag: N/A Change-Id: Ib8899188f593a168a054a16717df4a95be098557 --- .../launcher3/taskbar/LauncherTaskbarUIController.java | 6 +++--- .../launcher3/taskbar/TaskbarActivityContext.java | 2 +- .../android/launcher3/taskbar/TaskbarInsetsController.kt | 2 +- .../taskbar/TaskbarLauncherStateController.java | 4 ++-- .../com/android/launcher3/taskbar/TaskbarManager.java | 9 +++++---- .../android/launcher3/taskbar/TaskbarUIController.java | 2 +- .../com/android/quickstep/TouchInteractionService.java | 8 +++----- src/com/android/launcher3/Launcher.java | 9 +++++++-- 8 files changed, 23 insertions(+), 19 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 23380d67bd..896cc8424b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -425,14 +425,14 @@ public class LauncherTaskbarUIController extends TaskbarUIController { } @Override - protected boolean isInOverview() { - return mTaskbarLauncherStateController.isInOverview(); + protected boolean isInOverviewUi() { + return mTaskbarLauncherStateController.isInOverviewUi(); } @Override protected boolean canToggleHomeAllApps() { return mLauncher.isResumed() - && !mTaskbarLauncherStateController.isInOverview() + && !mTaskbarLauncherStateController.isInOverviewUi() && !mLauncher.areFreeformTasksVisible(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 390dec9a66..e802e72e21 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -665,7 +665,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { LauncherAtom.TaskBarContainer.Builder taskbarBuilder = LauncherAtom.TaskBarContainer.newBuilder(); - if (mControllers.uiController.isInOverview()) { + if (mControllers.uiController.isInOverviewUi()) { taskbarBuilder.setTaskSwitcherContainer( LauncherAtom.TaskSwitcherContainer.newBuilder()); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt index 8dc81cf461..6163dadca6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt @@ -375,7 +375,7 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas ) { // Taskbar has some touchable elements, take over the full taskbar area if ( - controllers.uiController.isInOverview && + controllers.uiController.isInOverviewUi && DisplayController.isTransientTaskbar(context) ) { val region = diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index b0abbe9e57..17dcacea3c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -666,8 +666,8 @@ public class TaskbarLauncherStateController { && !mLauncher.getWorkspace().isOverlayShown(); } - boolean isInOverview() { - return mLauncherState == LauncherState.OVERVIEW; + boolean isInOverviewUi() { + return mLauncherState.overviewUi; } private void playStateTransitionAnim(AnimatorSet animatorSet, long duration, diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index e4f9ba5260..8f15d61e4e 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -58,6 +58,7 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.statemanager.StatefulActivity; @@ -339,12 +340,12 @@ public class TaskbarManager { /** * Toggles All Apps for Taskbar or Launcher depending on the current state. - * - * @param homeAllAppsIntent Intent used if Taskbar is not enabled or Launcher is resumed. */ - public void toggleAllApps(Intent homeAllAppsIntent) { + public void toggleAllApps() { if (mTaskbarActivityContext == null || mTaskbarActivityContext.canToggleHomeAllApps()) { - mContext.startActivity(homeAllAppsIntent); + // Home All Apps should be toggled from this class, because the controllers are not + // initialized when Taskbar is disabled (i.e. TaskbarActivityContext is null). + if (mActivity instanceof Launcher l) l.toggleAllAppsSearch(); } else { mTaskbarActivityContext.toggleAllAppsSearch(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java index cb0fa406e8..2e78489692 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java @@ -193,7 +193,7 @@ public class TaskbarUIController { } /** Returns {@code true} if Taskbar is currently within overview. */ - protected boolean isInOverview() { + protected boolean isInOverviewUi() { return false; } diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 66d7144ae0..e66268a050 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -602,23 +602,21 @@ public class TouchInteractionService extends Service { } private PendingIntent createAllAppsPendingIntent() { - final Intent homeIntent = new Intent(mOverviewComponentObserver.getHomeIntent()) - .setAction(INTENT_ACTION_ALL_APPS_TOGGLE); - if (FeatureFlags.ENABLE_ALL_APPS_SEARCH_IN_TASKBAR.get()) { return new PendingIntent(new IIntentSender.Stub() { @Override public void send(int code, Intent intent, String resolvedType, IBinder allowlistToken, IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { - MAIN_EXECUTOR.execute(() -> mTaskbarManager.toggleAllApps(homeIntent)); + MAIN_EXECUTOR.execute(() -> mTaskbarManager.toggleAllApps()); } }); } else { return PendingIntent.getActivity( this, GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS, - homeIntent, + new Intent(mOverviewComponentObserver.getHomeIntent()) + .setAction(INTENT_ACTION_ALL_APPS_TOGGLE), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); } } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 3273f27731..155bfa1bd5 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1647,7 +1647,7 @@ public class Launcher extends StatefulActivity } else if (Intent.ACTION_ALL_APPS.equals(intent.getAction())) { showAllAppsFromIntent(alreadyOnHome); } else if (INTENT_ACTION_ALL_APPS_TOGGLE.equals(intent.getAction())) { - toggleAllAppsFromIntent(alreadyOnHome); + toggleAllAppsSearch(alreadyOnHome); } else if (Intent.ACTION_SHOW_WORK_APPS.equals(intent.getAction())) { showAllAppsWithSelectedTabFromIntent(alreadyOnHome, ActivityAllAppsContainerView.AdapterHolder.WORK); @@ -1661,7 +1661,12 @@ public class Launcher extends StatefulActivity // Overridden } - protected void toggleAllAppsFromIntent(boolean alreadyOnHome) { + /** Toggles Launcher All Apps with keyboard ready for search. */ + public void toggleAllAppsSearch() { + toggleAllAppsSearch(/* alreadyOnHome= */ true); + } + + protected void toggleAllAppsSearch(boolean alreadyOnHome) { if (getStateManager().isInStableState(ALL_APPS)) { getStateManager().goToState(NORMAL, alreadyOnHome); } else {