diff options
7 files changed, 129 insertions, 1 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java index 63b03ab76aac..a839a230ea6f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java @@ -36,6 +36,7 @@ import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.IBinder; +import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.util.ArraySet; @@ -261,6 +262,11 @@ public class DesktopModeController implements RemoteCallable<DesktopModeControll } } + /** Get number of tasks that are marked as visible */ + int getVisibleTaskCount() { + return mDesktopModeTaskRepository.getVisibleTaskCount(); + } + @NonNull private WindowContainerTransaction bringDesktopAppsToFront(boolean force) { final WindowContainerTransaction wct = new WindowContainerTransaction(); @@ -438,5 +444,15 @@ public class DesktopModeController implements RemoteCallable<DesktopModeControll executeRemoteCallWithTaskPermission(mController, "showDesktopApps", DesktopModeController::showDesktopApps); } + + @Override + public int getVisibleTaskCount() throws RemoteException { + int[] result = new int[1]; + executeRemoteCallWithTaskPermission(mController, "getVisibleTaskCount", + controller -> result[0] = controller.getVisibleTaskCount(), + true /* blocking */ + ); + return result[0]; + } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt index 600ccc17ecaa..47342c9f21ee 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt @@ -143,6 +143,13 @@ class DesktopModeTaskRepository { } /** + * Get number of tasks that are marked as visible + */ + fun getVisibleTaskCount(): Int { + return visibleTasks.size + } + + /** * Add (or move if it already exists) the task to the top of the ordered list. */ fun addOrMoveFreeformTaskToTop(taskId: Int) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 9165f7012bb5..23033253eaf9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -96,6 +96,11 @@ class DesktopTasksController( } } + /** Get number of tasks that are marked as visible */ + fun getVisibleTaskCount(): Int { + return desktopModeTaskRepository.getVisibleTaskCount() + } + /** Move a task with given `taskId` to desktop */ fun moveToDesktop(taskId: Int) { shellTaskOrganizer.getRunningTaskInfo(taskId)?.let { task -> moveToDesktop(task) } @@ -309,5 +314,16 @@ class DesktopTasksController( Consumer(DesktopTasksController::showDesktopApps) ) } + + override fun getVisibleTaskCount(): Int { + val result = IntArray(1) + ExecutorUtils.executeRemoteCallWithTaskPermission( + controller, + "getVisibleTaskCount", + { controller -> result[0] = controller.getVisibleTaskCount() }, + true /* blocking */ + ) + return result[0] + } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl index 5042bd6f2d65..d0739e14675f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl @@ -23,4 +23,7 @@ interface IDesktopMode { /** Show apps on the desktop */ void showDesktopApps(); + + /** Get count of visible desktop tasks */ + int getVisibleTaskCount(); }
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeControllerTest.java index 35cc16852b9f..7997a7ed7f7f 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeControllerTest.java @@ -334,6 +334,41 @@ public class DesktopModeControllerTest extends ShellTestCase { } @Test + public void testGetVisibleTaskCount_noTasks_returnsZero() { + assertThat(mController.getVisibleTaskCount()).isEqualTo(0); + } + + @Test + public void testGetVisibleTaskCount_twoTasks_bothVisible_returnsTwo() { + RunningTaskInfo task1 = createFreeformTask(); + mDesktopModeTaskRepository.addActiveTask(task1.taskId); + mDesktopModeTaskRepository.addOrMoveFreeformTaskToTop(task1.taskId); + mDesktopModeTaskRepository.updateVisibleFreeformTasks(task1.taskId, true /* visible */); + + RunningTaskInfo task2 = createFreeformTask(); + mDesktopModeTaskRepository.addActiveTask(task2.taskId); + mDesktopModeTaskRepository.addOrMoveFreeformTaskToTop(task2.taskId); + mDesktopModeTaskRepository.updateVisibleFreeformTasks(task2.taskId, true /* visible */); + + assertThat(mController.getVisibleTaskCount()).isEqualTo(2); + } + + @Test + public void testGetVisibleTaskCount_twoTasks_oneVisible_returnsOne() { + RunningTaskInfo task1 = createFreeformTask(); + mDesktopModeTaskRepository.addActiveTask(task1.taskId); + mDesktopModeTaskRepository.addOrMoveFreeformTaskToTop(task1.taskId); + mDesktopModeTaskRepository.updateVisibleFreeformTasks(task1.taskId, true /* visible */); + + RunningTaskInfo task2 = createFreeformTask(); + mDesktopModeTaskRepository.addActiveTask(task2.taskId); + mDesktopModeTaskRepository.addOrMoveFreeformTaskToTop(task2.taskId); + mDesktopModeTaskRepository.updateVisibleFreeformTasks(task2.taskId, false /* visible */); + + assertThat(mController.getVisibleTaskCount()).isEqualTo(1); + } + + @Test public void testHandleTransitionRequest_desktopModeNotActive_returnsNull() { when(DesktopModeStatus.isActive(any())).thenReturn(false); WindowContainerTransaction wct = mController.handleRequest( diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt index 1e43a5983821..45cb3a062cc5 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt @@ -141,6 +141,36 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() { } @Test + fun getVisibleTaskCount() { + // No tasks, count is 0 + assertThat(repo.getVisibleTaskCount()).isEqualTo(0) + + // New task increments count to 1 + repo.updateVisibleFreeformTasks(taskId = 1, visible = true) + assertThat(repo.getVisibleTaskCount()).isEqualTo(1) + + // Visibility update to same task does not increase count + repo.updateVisibleFreeformTasks(taskId = 1, visible = true) + assertThat(repo.getVisibleTaskCount()).isEqualTo(1) + + // Second task visible increments count + repo.updateVisibleFreeformTasks(taskId = 2, visible = true) + assertThat(repo.getVisibleTaskCount()).isEqualTo(2) + + // Hiding a task decrements count + repo.updateVisibleFreeformTasks(taskId = 1, visible = false) + assertThat(repo.getVisibleTaskCount()).isEqualTo(1) + + // Hiding all tasks leaves count at 0 + repo.updateVisibleFreeformTasks(taskId = 2, visible = false) + assertThat(repo.getVisibleTaskCount()).isEqualTo(0) + + // Hiding a not existing task, count remains at 0 + repo.updateVisibleFreeformTasks(taskId = 999, visible = false) + assertThat(repo.getVisibleTaskCount()).isEqualTo(0) + } + + @Test fun addOrMoveFreeformTaskToTop_didNotExist_addsToTop() { repo.addOrMoveFreeformTaskToTop(5) repo.addOrMoveFreeformTaskToTop(6) 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 4011d080564d..f16beeed57a3 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 @@ -197,6 +197,27 @@ class DesktopTasksControllerTest : ShellTestCase() { } @Test + fun getVisibleTaskCount_noTasks_returnsZero() { + assertThat(controller.getVisibleTaskCount()).isEqualTo(0) + } + + @Test + fun getVisibleTaskCount_twoTasks_bothVisible_returnsTwo() { + setUpHomeTask() + setUpFreeformTask().also(::markTaskVisible) + setUpFreeformTask().also(::markTaskVisible) + assertThat(controller.getVisibleTaskCount()).isEqualTo(2) + } + + @Test + fun getVisibleTaskCount_twoTasks_oneVisible_returnsOne() { + setUpHomeTask() + setUpFreeformTask().also(::markTaskVisible) + setUpFreeformTask().also(::markTaskHidden) + assertThat(controller.getVisibleTaskCount()).isEqualTo(1) + } + + @Test fun moveToDesktop() { val task = setUpFullscreenTask() controller.moveToDesktop(task) @@ -224,7 +245,7 @@ class DesktopTasksControllerTest : ShellTestCase() { assertThat(hierarchyOps).hasSize(3) assertReorderSequence(homeTask, freeformTask, fullscreenTask) assertThat(changes[fullscreenTask.token.asBinder()]?.windowingMode) - .isEqualTo(WINDOWING_MODE_FREEFORM) + .isEqualTo(WINDOWING_MODE_FREEFORM) } } |