diff options
| author | 2024-07-23 19:23:10 +0000 | |
|---|---|---|
| committer | 2024-07-23 19:23:10 +0000 | |
| commit | f55ee22188b32962ea8d0dc2bb836ac1a19d121d (patch) | |
| tree | 30fa9dbada49868d30b2135cec83b49c41c41034 /libs | |
| parent | dcca529ade564e74dff9d5b2ef49ec14c52ed6e1 (diff) | |
| parent | 449343c7c6222c08d98348846382a6317f5966cf (diff) | |
Merge "Add a config parameter for the max num of tasks" into main
Diffstat (limited to 'libs')
5 files changed, 80 insertions, 66 deletions
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java index a1ba24ca366f..282385a16b5f 100644 --- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java +++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java @@ -89,20 +89,15 @@ public class DesktopModeStatus { private static final int DESKTOP_DENSITY_MAX = 1000; /** - * Default value for {@code MAX_TASK_LIMIT}. - */ - @VisibleForTesting - public static final int DEFAULT_MAX_TASK_LIMIT = 4; - - // TODO(b/335131008): add a config-overlay field for the max number of tasks in Desktop Mode - /** - * Flag declaring the maximum number of Tasks to show in Desktop Mode at any one time. + * Sysprop declaring the maximum number of Tasks to show in Desktop Mode at any one time. + * + * <p>If it is not defined, then {@code R.integer.config_maxDesktopWindowingActiveTasks} is + * used. * - * <p> The limit does NOT affect Picture-in-Picture, Bubbles, or System Modals (like a screen + * <p>The limit does NOT affect Picture-in-Picture, Bubbles, or System Modals (like a screen * recording window, or Bluetooth pairing window). */ - private static final int MAX_TASK_LIMIT = SystemProperties.getInt( - "persist.wm.debug.desktop_max_task_limit", DEFAULT_MAX_TASK_LIMIT); + private static final String MAX_TASK_LIMIT_SYS_PROP = "persist.wm.debug.desktop_max_task_limit"; /** * Return {@code true} if veiled resizing is active. If false, fluid resizing is used. @@ -139,8 +134,9 @@ public class DesktopModeStatus { /** * Return the maximum limit on the number of Tasks to show in Desktop Mode at any one time. */ - public static int getMaxTaskLimit() { - return MAX_TASK_LIMIT; + public static int getMaxTaskLimit(@NonNull Context context) { + return SystemProperties.getInt(MAX_TASK_LIMIT_SYS_PROP, + context.getResources().getInteger(R.integer.config_maxDesktopWindowingActiveTasks)); } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 8f587d49c65f..afe46f500e51 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -567,13 +567,15 @@ public abstract class WMShellModule { Transitions transitions, @DynamicOverride DesktopModeTaskRepository desktopModeTaskRepository, ShellTaskOrganizer shellTaskOrganizer) { + int maxTaskLimit = DesktopModeStatus.getMaxTaskLimit(context); if (!DesktopModeStatus.canEnterDesktopMode(context) - || DESKTOP_WINDOWING_MODE.isEnabled(context)) { + || DESKTOP_WINDOWING_MODE.isEnabled(context) + || maxTaskLimit <= 0) { return Optional.empty(); } return Optional.of( new DesktopTasksLimiter( - transitions, desktopModeTaskRepository, shellTaskOrganizer)); + transitions, desktopModeTaskRepository, shellTaskOrganizer, maxTaskLimit)); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt index 534cc22ada47..c5ed1be004e5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt @@ -26,7 +26,6 @@ import androidx.annotation.VisibleForTesting import com.android.internal.protolog.ProtoLog import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.protolog.ShellProtoLogGroup -import com.android.wm.shell.shared.desktopmode.DesktopModeStatus import com.android.wm.shell.transition.Transitions import com.android.wm.shell.transition.Transitions.TransitionObserver @@ -40,12 +39,17 @@ class DesktopTasksLimiter ( transitions: Transitions, private val taskRepository: DesktopModeTaskRepository, private val shellTaskOrganizer: ShellTaskOrganizer, + private val maxTasksLimit: Int, ) { private val minimizeTransitionObserver = MinimizeTransitionObserver() @VisibleForTesting val leftoverMinimizedTasksRemover = LeftoverMinimizedTasksRemover() init { + require(maxTasksLimit > 0) { + "DesktopTasksLimiter should not be created with a maxTasksLimit at 0 or less. " + + "Current value: $maxTasksLimit." + } transitions.registerObserver(minimizeTransitionObserver) taskRepository.addActiveTaskListener(leftoverMinimizedTasksRemover) } @@ -194,12 +198,6 @@ class DesktopTasksLimiter ( } /** - * Returns the maximum number of tasks that should ever be displayed at the same time in Desktop - * Mode. - */ - fun getMaxTaskLimit(): Int = DesktopModeStatus.getMaxTaskLimit() - - /** * Returns the Task to minimize given 1. a list of visible tasks ordered from front to back and * 2. a new task placed in front of all the others. */ @@ -216,7 +214,7 @@ class DesktopTasksLimiter ( fun getTaskToMinimizeIfNeeded( visibleFreeformTaskIdsOrderedFrontToBack: List<Int> ): RunningTaskInfo? { - if (visibleFreeformTaskIdsOrderedFrontToBack.size <= getMaxTaskLimit()) { + if (visibleFreeformTaskIdsOrderedFrontToBack.size <= maxTasksLimit) { ProtoLog.v( ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, "DesktopTasksLimiter: no need to minimize; tasks below limit") diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index 37510ef4ba21..e66018f26d46 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -126,11 +126,11 @@ import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.mock import org.mockito.Mockito.spy import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` as whenever import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.atLeastOnce import org.mockito.kotlin.capture import org.mockito.quality.Strictness -import org.mockito.Mockito.`when` as whenever /** * Test class for {@link DesktopTasksController} @@ -204,7 +204,12 @@ class DesktopTasksControllerTest : ShellTestCase() { shellInit = spy(ShellInit(testExecutor)) desktopModeTaskRepository = DesktopModeTaskRepository() desktopTasksLimiter = - DesktopTasksLimiter(transitions, desktopModeTaskRepository, shellTaskOrganizer) + DesktopTasksLimiter( + transitions, + desktopModeTaskRepository, + shellTaskOrganizer, + MAX_TASK_LIMIT, + ) whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenAnswer { runningTasks } whenever(transitions.startTransition(anyInt(), any(), isNull())).thenAnswer { Binder() } @@ -780,45 +785,41 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveToDesktop_desktopWallpaperDisabled_bringsTasksOver_dontShowBackTask() { - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() - val freeformTasks = (1..taskLimit).map { _ -> setUpFreeformTask() } + val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } val newTask = setUpFullscreenTask() val homeTask = setUpHomeTask() controller.moveToDesktop(newTask, transitionSource = UNKNOWN) val wct = getLatestEnterDesktopWct() - assertThat(wct.hierarchyOps.size).isEqualTo(taskLimit + 1) // visible tasks + home + assertThat(wct.hierarchyOps.size).isEqualTo(MAX_TASK_LIMIT + 1) // visible tasks + home wct.assertReorderAt(0, homeTask) wct.assertReorderSequenceInRange( - range = 1..<(taskLimit + 1), - *freeformTasks.drop(1).toTypedArray(), // Skipping freeformTasks[0] - newTask - ) + range = 1..<(MAX_TASK_LIMIT + 1), + *freeformTasks.drop(1).toTypedArray(), // Skipping freeformTasks[0] + newTask) } @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveToDesktop_desktopWallpaperEnabled_bringsTasksOverLimit_dontShowBackTask() { - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() - val freeformTasks = (1..taskLimit).map { _ -> setUpFreeformTask() } + val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } val newTask = setUpFullscreenTask() val homeTask = setUpHomeTask() controller.moveToDesktop(newTask, transitionSource = UNKNOWN) val wct = getLatestEnterDesktopWct() - assertThat(wct.hierarchyOps.size).isEqualTo(taskLimit + 2) // tasks + home + wallpaper + assertThat(wct.hierarchyOps.size).isEqualTo(MAX_TASK_LIMIT + 2) // tasks + home + wallpaper // Move home to front wct.assertReorderAt(0, homeTask) // Add desktop wallpaper activity wct.assertPendingIntentAt(1, desktopWallpaperIntent) // Bring freeform tasks to front wct.assertReorderSequenceInRange( - range = 2..<(taskLimit + 2), - *freeformTasks.drop(1).toTypedArray(), // Skipping freeformTasks[0] - newTask - ) + range = 2..<(MAX_TASK_LIMIT + 2), + *freeformTasks.drop(1).toTypedArray(), // Skipping freeformTasks[0] + newTask) } @Test @@ -932,9 +933,8 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun moveTaskToFront_bringsTasksOverLimit_minimizesBackTask() { - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() setUpHomeTask() - val freeformTasks = (1..taskLimit + 1).map { _ -> setUpFreeformTask() } + val freeformTasks = (1..MAX_TASK_LIMIT + 1).map { _ -> setUpFreeformTask() } controller.moveTaskToFront(freeformTasks[0]) @@ -1141,8 +1141,7 @@ class DesktopTasksControllerTest : ShellTestCase() { fun handleRequest_fullscreenTaskToFreeform_bringsTasksOverLimit_otherTaskIsMinimized() { assumeTrue(ENABLE_SHELL_TRANSITIONS) - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() - val freeformTasks = (1..taskLimit).map { _ -> setUpFreeformTask() } + val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } freeformTasks.forEach { markTaskVisible(it) } val fullscreenTask = createFullscreenTask() @@ -1187,8 +1186,7 @@ class DesktopTasksControllerTest : ShellTestCase() { fun handleRequest_freeformTask_freeformVisible_aboveTaskLimit_minimize() { assumeTrue(ENABLE_SHELL_TRANSITIONS) - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() - val freeformTasks = (1..taskLimit).map { _ -> setUpFreeformTask() } + val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } freeformTasks.forEach { markTaskVisible(it) } val newFreeformTask = createFreeformTask() @@ -2599,9 +2597,10 @@ class DesktopTasksControllerTest : ShellTestCase() { return TransitionRequestInfo(type, task, null /* remoteTransition */) } - companion object { + private companion object { const val SECOND_DISPLAY = 2 - private val STABLE_BOUNDS = Rect(0, 0, 1000, 1000) + val STABLE_BOUNDS = Rect(0, 0, 1000, 1000) + const val MAX_TASK_LIMIT = 6 } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt index 8d9fd9166050..70f3bf8828fa 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt @@ -38,6 +38,7 @@ import com.android.wm.shell.transition.TransitionInfoBuilder import com.android.wm.shell.transition.Transitions import com.android.wm.shell.util.StubTransaction import com.google.common.truth.Truth.assertThat +import kotlin.test.assertFailsWith import org.junit.After import org.junit.Before import org.junit.Rule @@ -77,8 +78,8 @@ class DesktopTasksLimiterTest : ShellTestCase() { desktopTaskRepo = DesktopModeTaskRepository() - desktopTasksLimiter = DesktopTasksLimiter( - transitions, desktopTaskRepo, shellTaskOrganizer) + desktopTasksLimiter = + DesktopTasksLimiter(transitions, desktopTaskRepo, shellTaskOrganizer, MAX_TASK_LIMIT) } @After @@ -86,12 +87,18 @@ class DesktopTasksLimiterTest : ShellTestCase() { mockitoSession.finishMocking() } - // Currently, the task limit can be overridden through an adb flag. This test ensures the limit - // hasn't been overridden. @Test - fun getMaxTaskLimit_isSameAsConstant() { - assertThat(desktopTasksLimiter.getMaxTaskLimit()).isEqualTo( - DesktopModeStatus.DEFAULT_MAX_TASK_LIMIT) + fun createDesktopTasksLimiter_withZeroLimit_shouldThrow() { + assertFailsWith<IllegalArgumentException> { + DesktopTasksLimiter(transitions, desktopTaskRepo, shellTaskOrganizer, 0) + } + } + + @Test + fun createDesktopTasksLimiter_withNegativeLimit_shouldThrow() { + assertFailsWith<IllegalArgumentException> { + DesktopTasksLimiter(transitions, desktopTaskRepo, shellTaskOrganizer, -5) + } } @Test @@ -247,8 +254,7 @@ class DesktopTasksLimiterTest : ShellTestCase() { @Test fun addAndGetMinimizeTaskChangesIfNeeded_tasksWithinLimit_noTaskMinimized() { - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() - (1..<taskLimit).forEach { _ -> setUpFreeformTask() } + (1..<MAX_TASK_LIMIT).forEach { _ -> setUpFreeformTask() } val wct = WindowContainerTransaction() val minimizedTaskId = @@ -263,9 +269,8 @@ class DesktopTasksLimiterTest : ShellTestCase() { @Test fun addAndGetMinimizeTaskChangesIfNeeded_tasksAboveLimit_backTaskMinimized() { - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() // The following list will be ordered bottom -> top, as the last task is moved to top last. - val tasks = (1..taskLimit).map { setUpFreeformTask() } + val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() } val wct = WindowContainerTransaction() val minimizedTaskId = @@ -282,8 +287,7 @@ class DesktopTasksLimiterTest : ShellTestCase() { @Test fun addAndGetMinimizeTaskChangesIfNeeded_nonMinimizedTasksWithinLimit_noTaskMinimized() { - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() - val tasks = (1..taskLimit).map { setUpFreeformTask() } + val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() } desktopTaskRepo.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = tasks[0].taskId) val wct = WindowContainerTransaction() @@ -299,8 +303,7 @@ class DesktopTasksLimiterTest : ShellTestCase() { @Test fun getTaskToMinimizeIfNeeded_tasksWithinLimit_returnsNull() { - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() - val tasks = (1..taskLimit).map { setUpFreeformTask() } + val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() } val minimizedTask = desktopTasksLimiter.getTaskToMinimizeIfNeeded( visibleFreeformTaskIdsOrderedFrontToBack = tasks.map { it.taskId }) @@ -310,8 +313,7 @@ class DesktopTasksLimiterTest : ShellTestCase() { @Test fun getTaskToMinimizeIfNeeded_tasksAboveLimit_returnsBackTask() { - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() - val tasks = (1..taskLimit + 1).map { setUpFreeformTask() } + val tasks = (1..MAX_TASK_LIMIT + 1).map { setUpFreeformTask() } val minimizedTask = desktopTasksLimiter.getTaskToMinimizeIfNeeded( visibleFreeformTaskIdsOrderedFrontToBack = tasks.map { it.taskId }) @@ -321,9 +323,21 @@ class DesktopTasksLimiterTest : ShellTestCase() { } @Test + fun getTaskToMinimizeIfNeeded_tasksAboveLimit_otherLimit_returnsBackTask() { + desktopTasksLimiter = + DesktopTasksLimiter(transitions, desktopTaskRepo, shellTaskOrganizer, MAX_TASK_LIMIT2) + val tasks = (1..MAX_TASK_LIMIT2 + 1).map { setUpFreeformTask() } + + val minimizedTask = desktopTasksLimiter.getTaskToMinimizeIfNeeded( + visibleFreeformTaskIdsOrderedFrontToBack = tasks.map { it.taskId }) + + // first == front, last == back + assertThat(minimizedTask).isEqualTo(tasks.last()) + } + + @Test fun getTaskToMinimizeIfNeeded_withNewTask_tasksAboveLimit_returnsBackTask() { - val taskLimit = desktopTasksLimiter.getMaxTaskLimit() - val tasks = (1..taskLimit).map { setUpFreeformTask() } + val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() } val minimizedTask = desktopTasksLimiter.getTaskToMinimizeIfNeeded( visibleFreeformTaskIdsOrderedFrontToBack = tasks.map { it.taskId }, @@ -358,4 +372,9 @@ class DesktopTasksLimiterTest : ShellTestCase() { visible = false ) } + + private companion object { + const val MAX_TASK_LIMIT = 6 + const val MAX_TASK_LIMIT2 = 9 + } } |