From 2f1c1e10de95c38a28a686addaeed589d02be422 Mon Sep 17 00:00:00 2001 From: Jagrut Desai Date: Tue, 17 Dec 2024 11:33:58 -0800 Subject: [PATCH] Don't recreate taskbar in Overview This cl includes - when going to overview from Launcher or Desktop Mode don't recreate taskbar and keep it a same variant as the context user was in. - user will still be able to pin/unpin taskbar in overview, but it will be recreated to the launcher context. - opening app from taskbar context is now aware of if taskbar is in desktop mode and opens app in Desktop Mode when user oepn any app. - This cl will not include the animation when taskbar variant is changing between launcher and desktop mode. Solution - if desktop tasks are visible we will open any app from taskbar context into Desktop windowing mode after launching the DesktopTaskView manually. We will launch desktop task from recentview first and upon end of recent animation we will launch the app. Bug: 343882478 Test: Manual Flag: com.android.window.flags.enable_desktop_windowing_mode Change-Id: Ib67e1e7150670f901c07c2df188cde81e7d725dc --- .../DesktopVisibilityController.java | 22 +++++--- .../KeyboardQuickSwitchController.java | 6 +-- .../taskbar/LauncherTaskbarUIController.java | 3 +- .../taskbar/TaskbarActivityContext.java | 52 +++++++++++++++++-- .../launcher3/taskbar/TaskbarControllers.java | 2 +- .../taskbar/TaskbarDesktopModeController.kt | 3 ++ .../taskbar/TaskbarDragController.java | 3 +- .../TaskbarLauncherStateController.java | 2 +- .../taskbar/TaskbarPinningController.kt | 7 ++- .../taskbar/TaskbarPopupController.java | 3 +- .../taskbar/TaskbarStashController.java | 3 +- .../uioverrides/QuickstepLauncher.java | 4 +- .../quickstep/BaseActivityInterface.java | 2 +- .../quickstep/BaseContainerInterface.java | 2 +- .../quickstep/LauncherSwipeHandlerV2.java | 3 +- .../quickstep/views/LauncherRecentsView.java | 2 +- .../android/quickstep/views/RecentsView.java | 13 +++++ .../TaskbarPinningControllerTest.kt | 5 +- 18 files changed, 108 insertions(+), 29 deletions(-) diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java index fd0243a035..488cea572a 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java @@ -109,6 +109,17 @@ public class DesktopVisibilityController { * Whether desktop tasks are visible in desktop mode. */ public boolean areDesktopTasksVisible() { + boolean desktopTasksVisible = mVisibleDesktopTasksCount > 0; + if (DEBUG) { + Log.d(TAG, "areDesktopTasksVisible: desktopVisible=" + desktopTasksVisible); + } + return desktopTasksVisible; + } + + /** + * Whether desktop tasks are visible in desktop mode. + */ + public boolean areDesktopTasksVisibleAndNotInOverview() { boolean desktopTasksVisible = mVisibleDesktopTasksCount > 0; if (DEBUG) { Log.d(TAG, "areDesktopTasksVisible: desktopVisible=" + desktopTasksVisible @@ -160,9 +171,9 @@ public class DesktopVisibilityController { if (visibleTasksCount != mVisibleDesktopTasksCount) { final boolean wasVisible = mVisibleDesktopTasksCount > 0; final boolean isVisible = visibleTasksCount > 0; - final boolean wereDesktopTasksVisibleBefore = areDesktopTasksVisible(); + final boolean wereDesktopTasksVisibleBefore = areDesktopTasksVisibleAndNotInOverview(); mVisibleDesktopTasksCount = visibleTasksCount; - final boolean areDesktopTasksVisibleNow = areDesktopTasksVisible(); + final boolean areDesktopTasksVisibleNow = areDesktopTasksVisibleAndNotInOverview(); if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) { notifyDesktopVisibilityListeners(areDesktopTasksVisibleNow); } @@ -219,13 +230,12 @@ public class DesktopVisibilityController { + " currentValue=" + mInOverviewState); } if (overviewStateEnabled != mInOverviewState) { - final boolean wereDesktopTasksVisibleBefore = areDesktopTasksVisible(); + final boolean wereDesktopTasksVisibleBefore = areDesktopTasksVisibleAndNotInOverview(); mInOverviewState = overviewStateEnabled; - final boolean areDesktopTasksVisibleNow = areDesktopTasksVisible(); + final boolean areDesktopTasksVisibleNow = areDesktopTasksVisibleAndNotInOverview(); if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) { notifyDesktopVisibilityListeners(areDesktopTasksVisibleNow); } - if (ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()) { return; } @@ -279,7 +289,7 @@ public class DesktopVisibilityController { if (mBackgroundStateEnabled) { setLauncherViewsVisibility(View.VISIBLE); markLauncherResumed(); - } else if (areDesktopTasksVisible() && !mGestureInProgress) { + } else if (areDesktopTasksVisibleAndNotInOverview() && !mGestureInProgress) { // Switching out of background state. If desktop tasks are visible, pause launcher. setLauncherViewsVisibility(View.INVISIBLE); markLauncherPaused(); diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java index de42669000..cd38e5e285 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java @@ -188,8 +188,8 @@ public final class KeyboardQuickSwitchController implements mQuickSwitchViewController = new KeyboardQuickSwitchViewController( mControllers, mOverlayContext, keyboardQuickSwitchView, mControllerCallbacks); - final boolean onDesktop = - mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible(); + final boolean onDesktop = mControllers.taskbarDesktopModeController + .getAreDesktopTasksVisibleAndNotInOverview(); if (mModel.isTaskListValid(mTaskListChangeId) && taskIdsToExclude.equals(mExcludedTaskIds)) { @@ -233,7 +233,7 @@ public final class KeyboardQuickSwitchController implements private void processLoadedTasks(List tasks, Set taskIdsToExclude) { mHasDesktopTask = false; mWasDesktopTaskFilteredOut = false; - if (mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible()) { + if (mControllers.taskbarDesktopModeController.getAreDesktopTasksVisibleAndNotInOverview()) { processLoadedTasksOnDesktop(tasks, taskIdsToExclude); } else { processLoadedTasksOutsideDesktop(tasks, taskIdsToExclude); diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index ea42d771cb..371a0e81e7 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -245,7 +245,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController { } if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue() - && mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible()) { + && mControllers.taskbarDesktopModeController + .getAreDesktopTasksVisibleAndNotInOverview()) { // TODO: b/333533253 - Remove after flag rollout isVisible = false; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 7b326c1b9f..633806d7bb 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -1297,7 +1297,18 @@ public class TaskbarActivityContext extends BaseTaskbarContext { RemoteTransition remoteTransition = (areDesktopTasksVisible() && canUnminimizeDesktopTask(groupTask.task1.key.id)) ? createUnminimizeRemoteTransition() : null; - handleGroupTaskLaunch(groupTask, remoteTransition, areDesktopTasksVisible()); + if (areDesktopTasksVisible() && mControllers.uiController.isInOverviewUi()) { + RunnableList runnableList = recents.launchRunningDesktopTaskView(); + // Wrapping it in runnable so we post after DW is ready for the app + // launch. + if (runnableList != null) { + runnableList.add(() -> UI_HELPER_EXECUTOR.execute( + () -> handleGroupTaskLaunch(groupTask, remoteTransition, + areDesktopTasksVisible()))); + } + } else { + handleGroupTaskLaunch(groupTask, remoteTransition, areDesktopTasksVisible()); + } mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true); } else if (tag instanceof FolderInfo) { // Tapping an expandable folder icon on Taskbar @@ -1317,9 +1328,29 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } else if (tag instanceof TaskItemInfo info) { RemoteTransition remoteTransition = canUnminimizeDesktopTask(info.getTaskId()) ? createUnminimizeRemoteTransition() : null; - UI_HELPER_EXECUTOR.execute(() -> - SystemUiProxy.INSTANCE.get(this).showDesktopApp( - info.getTaskId(), remoteTransition)); + + TaskView taskView = null; + if (recents != null) { + taskView = recents.getTaskViewByTaskId(info.getTaskId()); + } + + if (areDesktopTasksVisible() && taskView != null) { + RunnableList runnableList = taskView.launchWithAnimation(); + if (runnableList != null) { + runnableList.add(() -> + // wrapped it in runnable here since we need the post for DW to be + // ready. if we don't other DW will be gone and only the launched + // task will show. + UI_HELPER_EXECUTOR.execute(() -> + SystemUiProxy.INSTANCE.get(this).showDesktopApp( + info.getTaskId(), remoteTransition))); + } + } else { + UI_HELPER_EXECUTOR.execute(() -> + SystemUiProxy.INSTANCE.get(this).showDesktopApp( + info.getTaskId(), remoteTransition)); + } + mControllers.taskbarStashController.updateAndAnimateTransientTaskbar( /* stash= */ true); } else if (tag instanceof WorkspaceItemInfo) { @@ -1563,7 +1594,18 @@ public class TaskbarActivityContext extends BaseTaskbarContext { .launchAppPair((AppPairIcon) launchingIconView, -1 /*cuj*/))); } else { - startItemInfoActivity(itemInfos.get(0), foundTask); + if (areDesktopTasksVisible() + && mControllers.uiController.isInOverviewUi()) { + RunnableList runnableList = recents.launchRunningDesktopTaskView(); + // Wrapping it in runnable so we post after DW is ready for the app + // launch. + if (runnableList != null) { + runnableList.add(() -> UI_HELPER_EXECUTOR.execute( + () -> startItemInfoActivity(itemInfos.get(0), foundTask))); + } + } else { + startItemInfoActivity(itemInfos.get(0), foundTask); + } } } ); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index 826722dbb3..af60f10a42 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -194,7 +194,7 @@ public class TaskbarControllers { voiceInteractionWindowController }; - if (taskbarDesktopModeController.getAreDesktopTasksVisible()) { + if (taskbarDesktopModeController.getAreDesktopTasksVisibleAndNotInOverview()) { mCornerRoundness.value = taskbarDesktopModeController.getTaskbarCornerRoundness( mSharedState.showCornerRadiusInDesktopMode); } else { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt index 47a35c55ab..a7c73817a2 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt @@ -27,6 +27,9 @@ class TaskbarDesktopModeController( private lateinit var taskbarControllers: TaskbarControllers private lateinit var taskbarSharedState: TaskbarSharedState + val areDesktopTasksVisibleAndNotInOverview: Boolean + get() = desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview() + val areDesktopTasksVisible: Boolean get() = desktopVisibilityController.areDesktopTasksVisible() diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index fc307b2e88..a9e8d6dc7b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -344,7 +344,8 @@ public class TaskbarDragController extends DragController im // TODO(297921594) clean it up when taskbar to desktop drag is implemented. // Pre-drag has ended, start the global system drag. if (mDisallowGlobalDrag - || mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible()) { + || mControllers.taskbarDesktopModeController + .getAreDesktopTasksVisibleAndNotInOverview()) { AbstractFloatingView.closeAllOpenViewsExcept(mActivity, TYPE_TASKBAR_ALL_APPS); return; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index 250e33a56f..1905561225 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -635,7 +635,7 @@ public class TaskbarLauncherStateController { float cornerRoundness = isInLauncher ? 0 : 1; - if (mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible() + if (mControllers.taskbarDesktopModeController.getAreDesktopTasksVisibleAndNotInOverview() && mControllers.getSharedState() != null) { cornerRoundness = mControllers.taskbarDesktopModeController.getTaskbarCornerRoundness( diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt index bcfc7181da..23c507034e 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt @@ -57,7 +57,10 @@ class TaskbarPinningController(private val context: TaskbarActivityContext) : return } val shouldPinTaskbar = - if (controllers.taskbarDesktopModeController.areDesktopTasksVisible) { + if ( + controllers.taskbarDesktopModeController + .areDesktopTasksVisibleAndNotInOverview + ) { !launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE) } else { !launcherPrefs.get(TASKBAR_PINNING) @@ -137,7 +140,7 @@ class TaskbarPinningController(private val context: TaskbarActivityContext) : @VisibleForTesting fun recreateTaskbarAndUpdatePinningValue() { updateIsAnimatingTaskbarPinningAndNotifyTaskbarDragLayer(false) - if (controllers.taskbarDesktopModeController.areDesktopTasksVisible) { + if (controllers.taskbarDesktopModeController.areDesktopTasksVisibleAndNotInOverview) { launcherPrefs.put( TASKBAR_PINNING_IN_DESKTOP_MODE, !launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE), diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java index 772d45d73c..b3698ad433 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java @@ -200,7 +200,8 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba shortcuts.add(PIN_UNPIN_ITEM); } shortcuts.add(APP_INFO); - if (!mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible()) { + if (!mControllers.taskbarDesktopModeController + .getAreDesktopTasksVisibleAndNotInOverview()) { shortcuts.addAll(mControllers.uiController.getSplitMenuOptions().toList()); } if (com.android.wm.shell.Flags.enableBubbleAnything()) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 67be8dac05..7dd40af877 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -1180,7 +1180,8 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba // Do not stash if hardware keyboard is attached, in 3 button nav and desktop windowing mode if (isHardwareKeyboard() && mActivity.isThreeButtonNav() - && mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible()) { + && mControllers.taskbarDesktopModeController + .getAreDesktopTasksVisibleAndNotInOverview()) { return false; } diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index e17771cdf9..dfbb4d74f5 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -1025,7 +1025,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, DesktopVisibilityController desktopVisibilityController = getDesktopVisibilityController(); if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue() && desktopVisibilityController != null - && desktopVisibilityController.areDesktopTasksVisible() + && desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview() && !desktopVisibilityController.isRecentsGestureInProgress()) { // Return early to skip setting activity to appear as resumed // TODO: b/333533253 - Remove after flag rollout @@ -1354,7 +1354,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, public boolean areDesktopTasksVisible() { DesktopVisibilityController desktopVisibilityController = getDesktopVisibilityController(); if (desktopVisibilityController != null) { - return desktopVisibilityController.areDesktopTasksVisible(); + return desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview(); } return false; } diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java index 1e755eb220..1437a6e15a 100644 --- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java +++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java @@ -87,7 +87,7 @@ public abstract class BaseActivityInterface 0 && (mContainer.getDesktopVisibilityController() == null - || !mContainer.getDesktopVisibilityController().areDesktopTasksVisible()); + || !mContainer.getDesktopVisibilityController() + .areDesktopTasksVisibleAndNotInOverview()); mContainer.getRootView().setForceHideBackArrow(true); diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 4f823e6e6f..4ee6ef60a4 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -287,7 +287,7 @@ public class LauncherRecentsView extends RecentsView isInDesktopMode } pinningController = spy(TaskbarPinningController(taskbarActivityContext)) pinningController.init(taskbarControllers, taskbarSharedState)