Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +65 −67 Original line number Diff line number Diff line Loading @@ -171,7 +171,6 @@ import org.junit.Assume.assumeTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.isA import org.mockito.ArgumentMatchers.isNull import org.mockito.Mock Loading Loading @@ -363,9 +362,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() shellInit.init() val captor = ArgumentCaptor.forClass(RecentsTransitionStateListener::class.java) val captor = argumentCaptor<RecentsTransitionStateListener>() verify(recentsTransitionHandler).addTransitionStateListener(captor.capture()) recentsTransitionStateListener = captor.value recentsTransitionStateListener = captor.firstValue controller.taskbarDesktopTaskListener = taskbarDesktopTaskListener Loading Loading @@ -441,7 +440,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() fun doesAnyTaskRequireTaskbarRounding_toggleResizeOfFreeFormTask_returnTrue() { val task1 = setUpFreeformTask() val argumentCaptor = ArgumentCaptor.forClass(Boolean::class.java) val argumentCaptor = argumentCaptor<Boolean>() controller.toggleDesktopTaskSize( task1, ToggleTaskSizeInteraction( Loading @@ -461,7 +460,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() STABLE_BOUNDS.height(), displayController, ) assertThat(argumentCaptor.value).isTrue() assertThat(argumentCaptor.firstValue).isTrue() } @Test Loading @@ -476,7 +475,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() val stableBounds = Rect().apply { displayLayout.getStableBounds(this) } val task1 = setUpFreeformTask(bounds = stableBounds, active = true) val argumentCaptor = ArgumentCaptor.forClass(Boolean::class.java) val argumentCaptor = argumentCaptor<Boolean>() controller.toggleDesktopTaskSize( task1, ToggleTaskSizeInteraction( Loading @@ -497,7 +496,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(displayController), anyOrNull(), ) assertThat(argumentCaptor.value).isFalse() assertThat(argumentCaptor.firstValue).isFalse() } @Test Loading Loading @@ -1736,7 +1735,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveBackgroundTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) Loading @@ -1751,12 +1750,12 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() verify(desktopModeEnterExitTransitionListener) .onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.firstValue) } @Test fun moveRunningTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) Loading @@ -1768,7 +1767,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() verify(desktopModeEnterExitTransitionListener) .onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.firstValue) } @Test Loading Loading @@ -2224,26 +2223,26 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() fun moveTaskToFront_remoteTransition_usesOneshotHandler() { setUpHomeTask() val freeformTasks = List(MAX_TASK_LIMIT) { setUpFreeformTask() } val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) controller.moveTaskToFront(freeformTasks[0], RemoteTransition(TestRemoteTransition())) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.firstValue) } @Test fun moveTaskToFront_bringsTasksOverLimit_remoteTransition_usesWindowLimitHandler() { setUpHomeTask() val freeformTasks = List(MAX_TASK_LIMIT + 1) { setUpFreeformTask() } val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) controller.moveTaskToFront(freeformTasks[0], RemoteTransition(TestRemoteTransition())) assertThat(transitionHandlerArgCaptor.value) assertThat(transitionHandlerArgCaptor.firstValue) .isInstanceOf(DesktopWindowLimitRemoteHandler::class.java) } Loading Loading @@ -2718,9 +2717,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() } } Loading Loading @@ -2759,9 +2758,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startPipTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() } } Loading @@ -2775,9 +2774,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK } captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK } } @Test Loading @@ -2791,10 +2790,10 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() // The only active task is being minimized. controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) // Adds remove wallpaper operation captor.value.assertReorderAt(index = 0, wallpaperToken, toTop = false) captor.firstValue.assertReorderAt(index = 0, wallpaperToken, toTop = false) } @Test Loading @@ -2808,9 +2807,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() // The only active task is already minimized. controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() } } Loading @@ -2825,9 +2824,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.minimizeTask(task1, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() } } Loading @@ -2845,10 +2844,10 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() // task1 is the only visible task as task2 is minimized. controller.minimizeTask(task1, MinimizeReason.MINIMIZE_BUTTON) // Adds remove wallpaper operation val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) // Adds remove wallpaper operation captor.value.assertReorderAt(index = 0, wallpaperToken, toTop = false) captor.firstValue.assertReorderAt(index = 0, wallpaperToken, toTop = false) } @Test Loading Loading @@ -4635,7 +4634,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val wctArgument = argumentCaptor<WindowContainerTransaction>() verify(splitScreenController) .requestEnterSplitSelect( eq(task2), Loading @@ -4643,9 +4642,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT), eq(task2.configuration.windowConfiguration.bounds), ) assertThat(wctArgument.value.hierarchyOps).hasSize(1) assertThat(wctArgument.firstValue.hierarchyOps).hasSize(1) // Removes wallpaper activity when leaving desktop wctArgument.value.assertReorderAt(index = 0, wallpaperToken, toTop = false) wctArgument.firstValue.assertReorderAt(index = 0, wallpaperToken, toTop = false) } @Test Loading @@ -4660,7 +4659,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val wctArgument = argumentCaptor<WindowContainerTransaction>() verify(splitScreenController) .requestEnterSplitSelect( eq(task2), Loading @@ -4669,7 +4668,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(task2.configuration.windowConfiguration.bounds), ) // Does not remove wallpaper activity, as desktop still has visible desktop tasks assertThat(wctArgument.value.hierarchyOps).isEmpty() assertThat(wctArgument.firstValue.hierarchyOps).isEmpty() } @Test Loading @@ -4677,7 +4676,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() fun newWindow_fromFullscreenOpensInSplit() { setUpLandscapeDisplay() val task = setUpFullscreenTask() val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java) val optionsCaptor = argumentCaptor<Bundle>() runOpenNewWindow(task) verify(splitScreenController) .startIntent( Loading @@ -4690,7 +4689,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(true), eq(SPLIT_INDEX_UNDEFINED), ) assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode) assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode) .isEqualTo(WINDOWING_MODE_MULTI_WINDOW) } Loading @@ -4699,7 +4698,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() fun newWindow_fromSplitOpensInSplit() { setUpLandscapeDisplay() val task = setUpSplitScreenTask() val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java) val optionsCaptor = argumentCaptor<Bundle>() runOpenNewWindow(task) verify(splitScreenController) .startIntent( Loading @@ -4712,7 +4711,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(true), eq(SPLIT_INDEX_UNDEFINED), ) assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode) assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode) .isEqualTo(WINDOWING_MODE_MULTI_WINDOW) } Loading Loading @@ -4807,11 +4806,11 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() setUpLandscapeDisplay() val task = setUpFullscreenTask() val taskToRequest = setUpFreeformTask() val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java) val optionsCaptor = argumentCaptor<Bundle>() runOpenInstance(task, taskToRequest.taskId) verify(splitScreenController) .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull()) assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode) assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode) .isEqualTo(WINDOWING_MODE_MULTI_WINDOW) } Loading @@ -4821,11 +4820,11 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() setUpLandscapeDisplay() val task = setUpSplitScreenTask() val taskToRequest = setUpFreeformTask() val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java) val optionsCaptor = argumentCaptor<Bundle>() runOpenInstance(task, taskToRequest.taskId) verify(splitScreenController) .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull()) assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode) assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode) .isEqualTo(WINDOWING_MODE_MULTI_WINDOW) } Loading Loading @@ -5912,35 +5911,37 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() mockDragEvent, mockCallback as Consumer<Boolean>, ) val arg: ArgumentCaptor<WindowContainerTransaction> = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() var expectedWindowingMode: Int if (indicatorType == DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR) { expectedWindowingMode = WINDOWING_MODE_FULLSCREEN // Fullscreen launches currently use default transitions verify(transitions).startTransition(any(), capture(arg), anyOrNull()) verify(transitions).startTransition(any(), arg.capture(), anyOrNull()) } else { expectedWindowingMode = WINDOWING_MODE_FREEFORM if (tabTearingAnimationFlagEnabled) { verify(desktopMixedTransitionHandler) .startLaunchTransition( eq(TRANSIT_OPEN), capture(arg), arg.capture(), anyOrNull(), anyOrNull(), anyOrNull(), ) } else { // All other launches use a special handler. verify(dragAndDropTransitionHandler).handleDropEvent(capture(arg)) verify(dragAndDropTransitionHandler).handleDropEvent(arg.capture()) } } assertThat( ActivityOptions.fromBundle(arg.value.hierarchyOps[0].launchOptions) ActivityOptions.fromBundle(arg.firstValue.hierarchyOps[0].launchOptions) .launchWindowingMode ) .isEqualTo(expectedWindowingMode) assertThat(ActivityOptions.fromBundle(arg.value.hierarchyOps[0].launchOptions).launchBounds) assertThat( ActivityOptions.fromBundle(arg.firstValue.hierarchyOps[0].launchOptions) .launchBounds ) .isEqualTo(expectedBounds) } Loading Loading @@ -6122,52 +6123,49 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @WindowManager.TransitionType type: Int = TRANSIT_OPEN, handlerClass: Class<out TransitionHandler>? = null, ): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() if (handlerClass == null) { verify(transitions).startTransition(eq(type), arg.capture(), isNull()) } else { verify(transitions).startTransition(eq(type), arg.capture(), isA(handlerClass)) } return arg.value return arg.lastValue } private fun getLatestToggleResizeDesktopTaskWct( currentBounds: Rect? = null ): WindowContainerTransaction { val arg: ArgumentCaptor<WindowContainerTransaction> = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() verify(toggleResizeDesktopTaskTransitionHandler, atLeastOnce()) .startTransition(capture(arg), eq(currentBounds)) return arg.value .startTransition(arg.capture(), eq(currentBounds)) return arg.lastValue } private fun getLatestDesktopMixedTaskWct( @WindowManager.TransitionType type: Int = TRANSIT_OPEN ): WindowContainerTransaction { val arg: ArgumentCaptor<WindowContainerTransaction> = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() verify(desktopMixedTransitionHandler) .startLaunchTransition(eq(type), capture(arg), anyOrNull(), anyOrNull(), anyOrNull()) return arg.value .startLaunchTransition(eq(type), arg.capture(), anyOrNull(), anyOrNull(), anyOrNull()) return arg.lastValue } private fun getLatestEnterDesktopWct(): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() verify(enterDesktopTransitionHandler).moveToDesktop(arg.capture(), any()) return arg.value return arg.lastValue } private fun getLatestDragToDesktopWct(): WindowContainerTransaction { val arg: ArgumentCaptor<WindowContainerTransaction> = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) verify(dragToDesktopTransitionHandler).finishDragToDesktopTransition(capture(arg)) return arg.value val arg = argumentCaptor<WindowContainerTransaction>() verify(dragToDesktopTransitionHandler).finishDragToDesktopTransition(arg.capture()) return arg.lastValue } private fun getLatestExitDesktopWct(): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() verify(exitDesktopTransitionHandler).startTransition(any(), arg.capture(), any(), any()) return arg.value return arg.lastValue } private fun findBoundsChange(wct: WindowContainerTransaction, task: RunningTaskInfo): Rect? = Loading Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +65 −67 Original line number Diff line number Diff line Loading @@ -171,7 +171,6 @@ import org.junit.Assume.assumeTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.isA import org.mockito.ArgumentMatchers.isNull import org.mockito.Mock Loading Loading @@ -363,9 +362,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() shellInit.init() val captor = ArgumentCaptor.forClass(RecentsTransitionStateListener::class.java) val captor = argumentCaptor<RecentsTransitionStateListener>() verify(recentsTransitionHandler).addTransitionStateListener(captor.capture()) recentsTransitionStateListener = captor.value recentsTransitionStateListener = captor.firstValue controller.taskbarDesktopTaskListener = taskbarDesktopTaskListener Loading Loading @@ -441,7 +440,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() fun doesAnyTaskRequireTaskbarRounding_toggleResizeOfFreeFormTask_returnTrue() { val task1 = setUpFreeformTask() val argumentCaptor = ArgumentCaptor.forClass(Boolean::class.java) val argumentCaptor = argumentCaptor<Boolean>() controller.toggleDesktopTaskSize( task1, ToggleTaskSizeInteraction( Loading @@ -461,7 +460,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() STABLE_BOUNDS.height(), displayController, ) assertThat(argumentCaptor.value).isTrue() assertThat(argumentCaptor.firstValue).isTrue() } @Test Loading @@ -476,7 +475,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() val stableBounds = Rect().apply { displayLayout.getStableBounds(this) } val task1 = setUpFreeformTask(bounds = stableBounds, active = true) val argumentCaptor = ArgumentCaptor.forClass(Boolean::class.java) val argumentCaptor = argumentCaptor<Boolean>() controller.toggleDesktopTaskSize( task1, ToggleTaskSizeInteraction( Loading @@ -497,7 +496,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(displayController), anyOrNull(), ) assertThat(argumentCaptor.value).isFalse() assertThat(argumentCaptor.firstValue).isFalse() } @Test Loading Loading @@ -1736,7 +1735,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun moveBackgroundTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) Loading @@ -1751,12 +1750,12 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() verify(desktopModeEnterExitTransitionListener) .onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.firstValue) } @Test fun moveRunningTaskToDesktop_remoteTransition_usesOneShotHandler() { val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) Loading @@ -1768,7 +1767,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() verify(desktopModeEnterExitTransitionListener) .onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.firstValue) } @Test Loading Loading @@ -2224,26 +2223,26 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() fun moveTaskToFront_remoteTransition_usesOneshotHandler() { setUpHomeTask() val freeformTasks = List(MAX_TASK_LIMIT) { setUpFreeformTask() } val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) controller.moveTaskToFront(freeformTasks[0], RemoteTransition(TestRemoteTransition())) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value) assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.firstValue) } @Test fun moveTaskToFront_bringsTasksOverLimit_remoteTransition_usesWindowLimitHandler() { setUpHomeTask() val freeformTasks = List(MAX_TASK_LIMIT + 1) { setUpFreeformTask() } val transitionHandlerArgCaptor = ArgumentCaptor.forClass(TransitionHandler::class.java) val transitionHandlerArgCaptor = argumentCaptor<TransitionHandler>() whenever(transitions.startTransition(anyInt(), any(), transitionHandlerArgCaptor.capture())) .thenReturn(Binder()) controller.moveTaskToFront(freeformTasks[0], RemoteTransition(TestRemoteTransition())) assertThat(transitionHandlerArgCaptor.value) assertThat(transitionHandlerArgCaptor.firstValue) .isInstanceOf(DesktopWindowLimitRemoteHandler::class.java) } Loading Loading @@ -2718,9 +2717,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() } } Loading Loading @@ -2759,9 +2758,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startPipTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() } } Loading @@ -2775,9 +2774,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK } captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK } } @Test Loading @@ -2791,10 +2790,10 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() // The only active task is being minimized. controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) // Adds remove wallpaper operation captor.value.assertReorderAt(index = 0, wallpaperToken, toTop = false) captor.firstValue.assertReorderAt(index = 0, wallpaperToken, toTop = false) } @Test Loading @@ -2808,9 +2807,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() // The only active task is already minimized. controller.minimizeTask(task, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() } } Loading @@ -2825,9 +2824,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.minimizeTask(task1, MinimizeReason.MINIMIZE_BUTTON) val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) captor.value.hierarchyOps.none { hop -> captor.firstValue.hierarchyOps.none { hop -> hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() } } Loading @@ -2845,10 +2844,10 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() // task1 is the only visible task as task2 is minimized. controller.minimizeTask(task1, MinimizeReason.MINIMIZE_BUTTON) // Adds remove wallpaper operation val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val captor = argumentCaptor<WindowContainerTransaction>() verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) // Adds remove wallpaper operation captor.value.assertReorderAt(index = 0, wallpaperToken, toTop = false) captor.firstValue.assertReorderAt(index = 0, wallpaperToken, toTop = false) } @Test Loading Loading @@ -4635,7 +4634,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val wctArgument = argumentCaptor<WindowContainerTransaction>() verify(splitScreenController) .requestEnterSplitSelect( eq(task2), Loading @@ -4643,9 +4642,9 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT), eq(task2.configuration.windowConfiguration.bounds), ) assertThat(wctArgument.value.hierarchyOps).hasSize(1) assertThat(wctArgument.firstValue.hierarchyOps).hasSize(1) // Removes wallpaper activity when leaving desktop wctArgument.value.assertReorderAt(index = 0, wallpaperToken, toTop = false) wctArgument.firstValue.assertReorderAt(index = 0, wallpaperToken, toTop = false) } @Test Loading @@ -4660,7 +4659,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val wctArgument = argumentCaptor<WindowContainerTransaction>() verify(splitScreenController) .requestEnterSplitSelect( eq(task2), Loading @@ -4669,7 +4668,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(task2.configuration.windowConfiguration.bounds), ) // Does not remove wallpaper activity, as desktop still has visible desktop tasks assertThat(wctArgument.value.hierarchyOps).isEmpty() assertThat(wctArgument.firstValue.hierarchyOps).isEmpty() } @Test Loading @@ -4677,7 +4676,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() fun newWindow_fromFullscreenOpensInSplit() { setUpLandscapeDisplay() val task = setUpFullscreenTask() val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java) val optionsCaptor = argumentCaptor<Bundle>() runOpenNewWindow(task) verify(splitScreenController) .startIntent( Loading @@ -4690,7 +4689,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(true), eq(SPLIT_INDEX_UNDEFINED), ) assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode) assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode) .isEqualTo(WINDOWING_MODE_MULTI_WINDOW) } Loading @@ -4699,7 +4698,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() fun newWindow_fromSplitOpensInSplit() { setUpLandscapeDisplay() val task = setUpSplitScreenTask() val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java) val optionsCaptor = argumentCaptor<Bundle>() runOpenNewWindow(task) verify(splitScreenController) .startIntent( Loading @@ -4712,7 +4711,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() eq(true), eq(SPLIT_INDEX_UNDEFINED), ) assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode) assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode) .isEqualTo(WINDOWING_MODE_MULTI_WINDOW) } Loading Loading @@ -4807,11 +4806,11 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() setUpLandscapeDisplay() val task = setUpFullscreenTask() val taskToRequest = setUpFreeformTask() val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java) val optionsCaptor = argumentCaptor<Bundle>() runOpenInstance(task, taskToRequest.taskId) verify(splitScreenController) .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull()) assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode) assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode) .isEqualTo(WINDOWING_MODE_MULTI_WINDOW) } Loading @@ -4821,11 +4820,11 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() setUpLandscapeDisplay() val task = setUpSplitScreenTask() val taskToRequest = setUpFreeformTask() val optionsCaptor = ArgumentCaptor.forClass(Bundle::class.java) val optionsCaptor = argumentCaptor<Bundle>() runOpenInstance(task, taskToRequest.taskId) verify(splitScreenController) .startTask(anyInt(), anyInt(), optionsCaptor.capture(), anyOrNull()) assertThat(ActivityOptions.fromBundle(optionsCaptor.value).launchWindowingMode) assertThat(ActivityOptions.fromBundle(optionsCaptor.firstValue).launchWindowingMode) .isEqualTo(WINDOWING_MODE_MULTI_WINDOW) } Loading Loading @@ -5912,35 +5911,37 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() mockDragEvent, mockCallback as Consumer<Boolean>, ) val arg: ArgumentCaptor<WindowContainerTransaction> = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() var expectedWindowingMode: Int if (indicatorType == DesktopModeVisualIndicator.IndicatorType.TO_FULLSCREEN_INDICATOR) { expectedWindowingMode = WINDOWING_MODE_FULLSCREEN // Fullscreen launches currently use default transitions verify(transitions).startTransition(any(), capture(arg), anyOrNull()) verify(transitions).startTransition(any(), arg.capture(), anyOrNull()) } else { expectedWindowingMode = WINDOWING_MODE_FREEFORM if (tabTearingAnimationFlagEnabled) { verify(desktopMixedTransitionHandler) .startLaunchTransition( eq(TRANSIT_OPEN), capture(arg), arg.capture(), anyOrNull(), anyOrNull(), anyOrNull(), ) } else { // All other launches use a special handler. verify(dragAndDropTransitionHandler).handleDropEvent(capture(arg)) verify(dragAndDropTransitionHandler).handleDropEvent(arg.capture()) } } assertThat( ActivityOptions.fromBundle(arg.value.hierarchyOps[0].launchOptions) ActivityOptions.fromBundle(arg.firstValue.hierarchyOps[0].launchOptions) .launchWindowingMode ) .isEqualTo(expectedWindowingMode) assertThat(ActivityOptions.fromBundle(arg.value.hierarchyOps[0].launchOptions).launchBounds) assertThat( ActivityOptions.fromBundle(arg.firstValue.hierarchyOps[0].launchOptions) .launchBounds ) .isEqualTo(expectedBounds) } Loading Loading @@ -6122,52 +6123,49 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @WindowManager.TransitionType type: Int = TRANSIT_OPEN, handlerClass: Class<out TransitionHandler>? = null, ): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() if (handlerClass == null) { verify(transitions).startTransition(eq(type), arg.capture(), isNull()) } else { verify(transitions).startTransition(eq(type), arg.capture(), isA(handlerClass)) } return arg.value return arg.lastValue } private fun getLatestToggleResizeDesktopTaskWct( currentBounds: Rect? = null ): WindowContainerTransaction { val arg: ArgumentCaptor<WindowContainerTransaction> = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() verify(toggleResizeDesktopTaskTransitionHandler, atLeastOnce()) .startTransition(capture(arg), eq(currentBounds)) return arg.value .startTransition(arg.capture(), eq(currentBounds)) return arg.lastValue } private fun getLatestDesktopMixedTaskWct( @WindowManager.TransitionType type: Int = TRANSIT_OPEN ): WindowContainerTransaction { val arg: ArgumentCaptor<WindowContainerTransaction> = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() verify(desktopMixedTransitionHandler) .startLaunchTransition(eq(type), capture(arg), anyOrNull(), anyOrNull(), anyOrNull()) return arg.value .startLaunchTransition(eq(type), arg.capture(), anyOrNull(), anyOrNull(), anyOrNull()) return arg.lastValue } private fun getLatestEnterDesktopWct(): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() verify(enterDesktopTransitionHandler).moveToDesktop(arg.capture(), any()) return arg.value return arg.lastValue } private fun getLatestDragToDesktopWct(): WindowContainerTransaction { val arg: ArgumentCaptor<WindowContainerTransaction> = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) verify(dragToDesktopTransitionHandler).finishDragToDesktopTransition(capture(arg)) return arg.value val arg = argumentCaptor<WindowContainerTransaction>() verify(dragToDesktopTransitionHandler).finishDragToDesktopTransition(arg.capture()) return arg.lastValue } private fun getLatestExitDesktopWct(): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) val arg = argumentCaptor<WindowContainerTransaction>() verify(exitDesktopTransitionHandler).startTransition(any(), arg.capture(), any(), any()) return arg.value return arg.lastValue } private fun findBoundsChange(wct: WindowContainerTransaction, task: RunningTaskInfo): Rect? = Loading