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)