From 54c6cf7c38bb7425a379fee5d2df9b2bb4505687 Mon Sep 17 00:00:00 2001 From: Saumya Prakash Date: Wed, 11 Dec 2024 14:00:38 +0000 Subject: [PATCH] Close the multi instance menu when other things open This change ensures that if open, the Taskbar multi instance menu will close when another long press app menu is launched, when a folder is opened, or when Taskbar all apps is opened. Fix: 383510315 Test: Open Taskbar multi instance menu and ensure it closes when other views are opening (Taskbar all apps, a folder, and app long press menu) Flag: com.android.launcher3.enable_multi_instance_menu_taskbar Change-Id: Id2d64c86a76978af8db56d3a083dc79a677a1a5d --- .../taskbar/ManageWindowsTaskbarShortcut.kt | 9 ++++++++ .../taskbar/TaskbarActivityContext.java | 1 + .../taskbar/TaskbarPopupController.java | 21 +++++++++++++++++-- .../allapps/TaskbarAllAppsController.java | 1 + 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt index 032eb5151e..75ce7c3dd5 100644 --- a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt +++ b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt @@ -148,11 +148,19 @@ class ManageWindowsTaskbarShortcut( FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN, false, ) + controllers.taskbarPopupController.cleanUpMultiInstanceMenuReference() } } ) } + /** Closes the multi-instance menu if it has been initialized. */ + fun closeMultiInstanceMenu() { + if (::taskbarShortcutAllWindowsView.isInitialized) { + taskbarShortcutAllWindowsView.animateClose() + } + } + /** * A view container for displaying the window of open instances of an app * @@ -238,6 +246,7 @@ class ManageWindowsTaskbarShortcut( ) taskbarOverlayContext.dragLayer?.removeView(menuView.rootView) taskbarOverlayContext.dragLayer.removeTouchController(this) + controllers.taskbarPopupController.cleanUpMultiInstanceMenuReference() } /** TouchController implementations for closing the carousel when touched outside */ diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 8e2246bfdb..54270955b2 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -1422,6 +1422,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { Log.e(TAG, "Unknown type clicked: " + tag); } + mControllers.taskbarPopupController.maybeCloseMultiInstanceMenu(); if (shouldCloseAllOpenViews) { AbstractFloatingView.closeAllOpenViews(this); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java index abf35a21b9..afd317bbb5 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java @@ -86,6 +86,8 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba private TaskbarControllers mControllers; private boolean mAllowInitialSplitSelection; private AppInfo[] mAppInfosList; + private ManageWindowsTaskbarShortcut mManageWindowsTaskbarShortcut; + public TaskbarPopupController(TaskbarActivityContext context) { mContext = context; @@ -111,6 +113,19 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba mPopupDataProvider.setDeepShortcutMap(deepShortcutMapCopy); } + /** Closes the multi-instance menu if it is enabled and currently open. */ + public void maybeCloseMultiInstanceMenu() { + if (Flags.enableMultiInstanceMenuTaskbar() && mManageWindowsTaskbarShortcut != null) { + mManageWindowsTaskbarShortcut.closeMultiInstanceMenu(); + cleanUpMultiInstanceMenuReference(); + } + } + + /** Releases the reference to the Taskbar multi-instance menu */ + public void cleanUpMultiInstanceMenuReference() { + mManageWindowsTaskbarShortcut = null; + } + public void setAllowInitialSplitSelection(boolean allowInitialSplitSelection) { mAllowInitialSplitSelection = allowInitialSplitSelection; } @@ -206,6 +221,7 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba if (Flags.enableMultiInstanceMenuTaskbar() && DesktopModeStatus.canEnterDesktopMode(mContext) && !mControllers.taskbarStashController.isInOverview()) { + maybeCloseMultiInstanceMenu(); shortcuts.addAll(getMultiInstanceMenuOptions().toList()); } return shortcuts.stream(); @@ -325,8 +341,9 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba public SystemShortcut.Factory createManageWindowsShortcutFactory() { return (context, itemInfo, originalView) -> { if (shouldShowMultiInstanceOptions(itemInfo)) { - return new ManageWindowsTaskbarShortcut<>(context, itemInfo, originalView, - mControllers); + mManageWindowsTaskbarShortcut = new ManageWindowsTaskbarShortcut<>( + context, itemInfo, originalView, mControllers); + return mManageWindowsTaskbarShortcut; } return null; }; diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java index 07d86e4e78..ddbf3b7fc6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java @@ -141,6 +141,7 @@ public final class TaskbarAllAppsController { if (isOpen()) { mSlideInView.close(true); } else { + mControllers.taskbarPopupController.maybeCloseMultiInstanceMenu(); show(true, showKeyboard); } }