diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt index 03f5d96769..62543e48f3 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt +++ b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt @@ -62,14 +62,14 @@ constructor( * @property canCreateDesks true if it's possible to create new desks on the display represented * by this object. * @property activeDeskId The ID of the active desk on the associated display (if any). It has a - * value of `-1` if there are no active desks. Note that there can only be at most one active - * desk on each display. + * value of `INACTIVE_DESK_ID` (-1) if there are no active desks. Note that there can only be + * at most one active desk on each display. * @property deskIds a set containing the IDs of the desks on the associated display. */ private data class DisplayDeskConfig( val displayId: Int, var canCreateDesks: Boolean, - var activeDeskId: Int = -1, + var activeDeskId: Int = INACTIVE_DESK_ID, val deskIds: MutableSet, ) @@ -79,6 +79,8 @@ constructor( private val desktopVisibilityListeners: MutableSet = HashSet() private val taskbarDesktopModeListeners: MutableSet = HashSet() + // TODO: b/394387739 - Deprecate this and replace it with something that tracks the count per + // desk. /** Number of visible desktop windows in desktop mode. */ var visibleDesktopTasksCount: Int = 0 /** @@ -142,8 +144,36 @@ constructor( } } + /** Returns whether a desk is currently active on the display with the given [displayId]. */ + fun isInDesktopMode(displayId: Int): Boolean { + if (!DesktopModeStatus.enableMultipleDesktops(context)) { + return areDesktopTasksVisible() + } + + val isInDesktopMode = displaysDesksConfigsMap[displayId].activeDeskId != INACTIVE_DESK_ID + if (DEBUG) { + Log.d(TAG, "isInDesktopMode: $isInDesktopMode") + } + return isInDesktopMode + } + + /** + * Returns whether a desk is currently active on the display with the given [displayId] and + * Overview is not active. + */ + fun isInDesktopModeAndNotInOverview(displayId: Int): Boolean { + if (!DesktopModeStatus.enableMultipleDesktops(context)) { + return areDesktopTasksVisibleAndNotInOverview() + } + + if (DEBUG) { + Log.d(TAG, "isInDesktopModeAndNotInOverview: overview=$inOverviewState") + } + return isInDesktopMode(displayId) && !inOverviewState + } + /** Whether desktop tasks are visible in desktop mode. */ - fun areDesktopTasksVisible(): Boolean { + private fun areDesktopTasksVisible(): Boolean { val desktopTasksVisible: Boolean = visibleDesktopTasksCount > 0 if (DEBUG) { Log.d(TAG, "areDesktopTasksVisible: desktopVisible=$desktopTasksVisible") @@ -152,7 +182,7 @@ constructor( } /** Whether desktop tasks are visible in desktop mode. */ - fun areDesktopTasksVisibleAndNotInOverview(): Boolean { + private fun areDesktopTasksVisibleAndNotInOverview(): Boolean { val desktopTasksVisible: Boolean = visibleDesktopTasksCount > 0 if (DEBUG) { Log.d( @@ -250,6 +280,13 @@ constructor( } private fun notifyDesktopVisibilityListeners(areDesktopTasksVisible: Boolean) { + if (DesktopModeStatus.enableMultipleDesktops(context)) { + // This is triggered using the legacy way of determining the visibility of the desktop + // mode and should not be used when the multi-desks feature is enabled. + // (See b/394685645 for details). + return + } + if (DEBUG) { Log.d(TAG, "notifyDesktopVisibilityListeners: visible=$areDesktopTasksVisible") } @@ -391,7 +428,7 @@ constructor( "Removing non-existing desk Id: $deskId on display: $displayId" } if (it.activeDeskId == deskId) { - it.activeDeskId = -1 + it.activeDeskId = INACTIVE_DESK_ID } } } @@ -542,5 +579,7 @@ constructor( private const val TAG = "DesktopVisController" private const val DEBUG = false + + private const val INACTIVE_DESK_ID = -1 } } diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 4143157637..3f3700bb04 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -246,7 +246,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController { if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue() && mControllers.taskbarDesktopModeController - .getAreDesktopTasksVisibleAndNotInOverview()) { + .isInDesktopModeAndNotInOverview(mLauncher.getDisplayId())) { // 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 9d1fc15693..11ae0c1b84 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -1286,7 +1286,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { boolean areDesktopTasksVisible() { return mControllers != null - && mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible(); + && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId()); } protected void onTaskbarIconClicked(View view) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index af60f10a42..b244be9205 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -194,7 +194,8 @@ public class TaskbarControllers { voiceInteractionWindowController }; - if (taskbarDesktopModeController.getAreDesktopTasksVisibleAndNotInOverview()) { + if (taskbarDesktopModeController.isInDesktopModeAndNotInOverview( + taskbarActivityContext.getDisplayId())) { 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 cb399e8c70..f71dea9df8 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt @@ -30,18 +30,17 @@ class TaskbarDesktopModeController( private lateinit var taskbarControllers: TaskbarControllers private lateinit var taskbarSharedState: TaskbarSharedState - val areDesktopTasksVisibleAndNotInOverview: Boolean - get() = desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview() - - val areDesktopTasksVisible: Boolean - get() = desktopVisibilityController.areDesktopTasksVisible() - fun init(controllers: TaskbarControllers, sharedState: TaskbarSharedState) { taskbarControllers = controllers taskbarSharedState = sharedState desktopVisibilityController.registerTaskbarDesktopModeListener(this) } + fun isInDesktopMode(displayId: Int) = desktopVisibilityController.isInDesktopMode(displayId) + + fun isInDesktopModeAndNotInOverview(displayId: Int) = + desktopVisibilityController.isInDesktopModeAndNotInOverview(displayId) + override fun onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding: Boolean) { taskbarSharedState.showCornerRadiusInDesktopMode = doesAnyTaskRequireTaskbarRounding val cornerRadius = getTaskbarCornerRoundness(doesAnyTaskRequireTaskbarRounding) @@ -49,7 +48,7 @@ class TaskbarDesktopModeController( } fun shouldShowDesktopTasksInTaskbar(): Boolean { - return desktopVisibilityController.areDesktopTasksVisible() || + return isInDesktopMode(context.displayId) || DisplayController.showDesktopTaskbarForFreeformDisplay(context) || (DisplayController.showLockedTaskbarOnHome(context) && taskbarControllers.taskbarStashController.isOnHome) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index f36c48136c..b91f51270c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -347,7 +347,7 @@ public class TaskbarDragController extends DragController im // Pre-drag has ended, start the global system drag. if (mDisallowGlobalDrag || mControllers.taskbarDesktopModeController - .getAreDesktopTasksVisibleAndNotInOverview()) { + .isInDesktopModeAndNotInOverview(mActivity.getDisplayId())) { 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 cada5a39d0..dd9f61e5ef 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -631,7 +631,8 @@ public class TaskbarLauncherStateController { float cornerRoundness = isInLauncher ? 0 : 1; - if (mControllers.taskbarDesktopModeController.getAreDesktopTasksVisibleAndNotInOverview() + if (mControllers.taskbarDesktopModeController.isInDesktopModeAndNotInOverview( + mControllers.taskbarActivityContext.getDisplayId()) && 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 23c507034e..7141bb8185 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt @@ -58,8 +58,9 @@ class TaskbarPinningController(private val context: TaskbarActivityContext) : } val shouldPinTaskbar = if ( - controllers.taskbarDesktopModeController - .areDesktopTasksVisibleAndNotInOverview + controllers.taskbarDesktopModeController.isInDesktopModeAndNotInOverview( + context.displayId + ) ) { !launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE) } else { @@ -140,7 +141,11 @@ class TaskbarPinningController(private val context: TaskbarActivityContext) : @VisibleForTesting fun recreateTaskbarAndUpdatePinningValue() { updateIsAnimatingTaskbarPinningAndNotifyTaskbarDragLayer(false) - if (controllers.taskbarDesktopModeController.areDesktopTasksVisibleAndNotInOverview) { + if ( + controllers.taskbarDesktopModeController.isInDesktopModeAndNotInOverview( + context.displayId + ) + ) { 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 feb9b338d8..5d8b8212a8 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java @@ -217,7 +217,7 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba } shortcuts.add(APP_INFO); if (!mControllers.taskbarDesktopModeController - .getAreDesktopTasksVisibleAndNotInOverview()) { + .isInDesktopModeAndNotInOverview(mContext.getDisplayId())) { shortcuts.addAll(mControllers.uiController.getSplitMenuOptions().toList()); } if (BubbleAnythingFlagHelper.enableCreateAnyBubble()) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 2ded1bff8d..6016394c60 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -1189,7 +1189,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba if (mActivity.isHardwareKeyboard() && mActivity.isThreeButtonNav() && mControllers.taskbarDesktopModeController - .getAreDesktopTasksVisibleAndNotInOverview()) { + .isInDesktopModeAndNotInOverview(mActivity.getDisplayId())) { return false; } diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 23f4f6789e..bb57d6eb74 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -1047,7 +1047,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, DesktopVisibilityController desktopVisibilityController = DesktopVisibilityController.INSTANCE.get(this); if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue() - && desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview() + && desktopVisibilityController.isInDesktopModeAndNotInOverview(getDisplayId()) && !desktopVisibilityController.isRecentsGestureInProgress()) { // Return early to skip setting activity to appear as resumed // TODO: b/333533253 - Remove after flag rollout @@ -1369,7 +1369,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, @Override public boolean areDesktopTasksVisible() { return DesktopVisibilityController.INSTANCE.get(this) - .areDesktopTasksVisibleAndNotInOverview(); + .isInDesktopModeAndNotInOverview(getDisplayId()); } @Override diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java index 7cab751fac..549c2f8e34 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 && !DesktopVisibilityController.INSTANCE.get(mContainer) - .areDesktopTasksVisibleAndNotInOverview(); + .isInDesktopModeAndNotInOverview(mContainer.getDisplayId()); mContainer.getRootView().setForceHideBackArrow(true); diff --git a/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java b/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java index 10ae7a30cb..d92cc86a6d 100644 --- a/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java +++ b/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java @@ -73,8 +73,8 @@ public class SystemWindowManagerProxy extends WindowManagerProxy { } @Override - public boolean isInDesktopMode() { - return mDesktopVisibilityController.areDesktopTasksVisible(); + public boolean isInDesktopMode(int displayId) { + return mDesktopVisibilityController.isInDesktopMode(displayId); } @Override diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index c6bd6770fb..0f1c2941b3 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -275,7 +275,8 @@ public class LauncherRecentsView extends RecentsView isInDesktopMode } pinningController = spy(TaskbarPinningController(taskbarActivityContext)) diff --git a/src/com/android/launcher3/util/DisplayController.java b/src/com/android/launcher3/util/DisplayController.java index ee1af810f7..80086870a1 100644 --- a/src/com/android/launcher3/util/DisplayController.java +++ b/src/com/android/launcher3/util/DisplayController.java @@ -448,7 +448,7 @@ public class DisplayController implements ComponentCallbacks, mIsTaskbarPinned = LauncherPrefs.get(displayInfoContext).get(TASKBAR_PINNING); mIsTaskbarPinnedInDesktopMode = LauncherPrefs.get(displayInfoContext).get( TASKBAR_PINNING_IN_DESKTOP_MODE); - mIsInDesktopMode = wmProxy.isInDesktopMode(); + mIsInDesktopMode = wmProxy.isInDesktopMode(DEFAULT_DISPLAY); mShowLockedTaskbarOnHome = wmProxy.showLockedTaskbarOnHome(displayInfoContext); mShowDesktopTaskbarForFreeformDisplay = wmProxy.showDesktopTaskbarForFreeformDisplay( displayInfoContext); diff --git a/src/com/android/launcher3/util/window/WindowManagerProxy.java b/src/com/android/launcher3/util/window/WindowManagerProxy.java index f511ef2eac..bbb9e28a4a 100644 --- a/src/com/android/launcher3/util/window/WindowManagerProxy.java +++ b/src/com/android/launcher3/util/window/WindowManagerProxy.java @@ -109,7 +109,7 @@ public class WindowManagerProxy { /** * Returns if we are in desktop mode or not. */ - public boolean isInDesktopMode() { + public boolean isInDesktopMode(int displayId) { return false; } diff --git a/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt b/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt index 588a668b7a..aa1451b53a 100644 --- a/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt +++ b/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt @@ -203,7 +203,7 @@ class DisplayControllerTest { fun testTaskbarPinningChangeInLockedTaskbarChange() { whenever(windowManagerProxy.showLockedTaskbarOnHome(any())).thenReturn(true) whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(true) - whenever(windowManagerProxy.isInDesktopMode()).thenReturn(false) + whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(false) whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false) DisplayController.enableTaskbarModePreferenceForTests(true) @@ -219,7 +219,7 @@ class DisplayControllerTest { fun testLockedTaskbarChangeOnConfigurationChanged() { whenever(windowManagerProxy.showLockedTaskbarOnHome(any())).thenReturn(true) whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(true) - whenever(windowManagerProxy.isInDesktopMode()).thenReturn(false) + whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(false) whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false) DisplayController.enableTaskbarModePreferenceForTests(true) assertTrue(displayController.getInfo().isTransientTaskbar()) @@ -237,7 +237,7 @@ class DisplayControllerTest { whenever(windowManagerProxy.showDesktopTaskbarForFreeformDisplay(any())).thenReturn(true) whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false) whenever(launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE)).thenReturn(false) - whenever(windowManagerProxy.isInDesktopMode()).thenReturn(true) + whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(true) whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(false) DisplayController.enableTaskbarModePreferenceForTests(true) @@ -256,7 +256,7 @@ class DisplayControllerTest { whenever(windowManagerProxy.showDesktopTaskbarForFreeformDisplay(any())).thenReturn(true) whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false) whenever(launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE)).thenReturn(false) - whenever(windowManagerProxy.isInDesktopMode()).thenReturn(false) + whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(false) whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(false) DisplayController.enableTaskbarModePreferenceForTests(true) @@ -275,7 +275,7 @@ class DisplayControllerTest { whenever(windowManagerProxy.showDesktopTaskbarForFreeformDisplay(any())).thenReturn(true) whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false) whenever(launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE)).thenReturn(false) - whenever(windowManagerProxy.isInDesktopMode()).thenReturn(false) + whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(false) whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(true) DisplayController.enableTaskbarModePreferenceForTests(true)