Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7220b56f authored by Yuichiro Hanada's avatar Yuichiro Hanada
Browse files

Switch to use mockito-kotlin's ArgumentCaptor

It has better nullability handling.

Bug: 390161102
Test: DesktopTasksControllerTest
Flag: EXEMPT test only change

Change-Id: Ic0071528f3a4de77825d3473a99730b4d527b40b
parent 5433f61b
Loading
Loading
Loading
Loading
+65 −67
Original line number Diff line number Diff line
@@ -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
@@ -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

@@ -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(
@@ -461,7 +460,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
                STABLE_BOUNDS.height(),
                displayController,
            )
        assertThat(argumentCaptor.value).isTrue()
        assertThat(argumentCaptor.firstValue).isTrue()
    }

    @Test
@@ -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(
@@ -497,7 +496,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
                eq(displayController),
                anyOrNull(),
            )
        assertThat(argumentCaptor.value).isFalse()
        assertThat(argumentCaptor.firstValue).isFalse()
    }

    @Test
@@ -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())

@@ -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())

@@ -1768,7 +1767,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()

        verify(desktopModeEnterExitTransitionListener)
            .onEnterDesktopModeTransitionStarted(FREEFORM_ANIMATION_DURATION)
        assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.value)
        assertIs<OneShotRemoteHandler>(transitionHandlerArgCaptor.firstValue)
    }

    @Test
@@ -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)
    }

@@ -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()
        }
    }
@@ -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()
        }
    }
@@ -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
@@ -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
@@ -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()
        }
    }
@@ -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()
        }
    }
@@ -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
@@ -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),
@@ -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
@@ -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),
@@ -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
@@ -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(
@@ -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)
    }

@@ -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(
@@ -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)
    }

@@ -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)
    }

@@ -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)
    }

@@ -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)
    }

@@ -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? =