diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchAppByDoubleTapDivider.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchAppByDoubleTapDivider.kt index 6697b64f40437..f06dd66f61d28 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchAppByDoubleTapDivider.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/splitscreen/SwitchAppByDoubleTapDivider.kt @@ -27,6 +27,8 @@ import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group1 import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.flicker.helpers.isRotated +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper import com.android.wm.shell.flicker.SPLIT_SCREEN_DIVIDER_COMPONENT import com.android.wm.shell.flicker.appWindowIsVisibleAtEnd import com.android.wm.shell.flicker.layerIsVisibleAtEnd @@ -48,7 +50,7 @@ import org.junit.runners.Parameterized @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group1 -class SwitchAppByDoubleTapDivider (testSpec: FlickerTestParameter) : SplitScreenBase(testSpec) { +class SwitchAppByDoubleTapDivider(testSpec: FlickerTestParameter) : SplitScreenBase(testSpec) { override val transition: FlickerBuilder.() -> Unit get() = { @@ -61,9 +63,51 @@ class SwitchAppByDoubleTapDivider (testSpec: FlickerTestParameter) : SplitScreen wmHelper.StateSyncBuilder() .withAppTransitionIdle() .waitForAndVerify() + + waitForLayersToSwitch(wmHelper) + waitForWindowsToSwitch(wmHelper) } } + private fun waitForWindowsToSwitch(wmHelper: WindowManagerStateHelper) { + wmHelper.StateSyncBuilder().add("appWindowsSwitched") { + val primaryAppWindow = it.wmState.visibleWindows.firstOrNull { window -> + primaryApp.windowMatchesAnyOf(window) + } ?: return@add false + val secondaryAppWindow = it.wmState.visibleWindows.firstOrNull { window -> + secondaryApp.windowMatchesAnyOf(window) + } ?: return@add false + + if (testSpec.startRotation.isRotated()) { + return@add primaryAppWindow.frame.right <= secondaryAppWindow.frame.left + } else { + return@add primaryAppWindow.frame.bottom <= secondaryAppWindow.frame.top + } + }.waitForAndVerify() + } + + private fun waitForLayersToSwitch(wmHelper: WindowManagerStateHelper) { + wmHelper.StateSyncBuilder().add("appLayersSwitched") { + val primaryAppLayer = it.layerState.visibleLayers.firstOrNull { window -> + primaryApp.layerMatchesAnyOf(window) + } ?: return@add false + val secondaryAppLayer = it.layerState.visibleLayers.firstOrNull { window -> + secondaryApp.layerMatchesAnyOf(window) + } ?: return@add false + + val primaryVisibleRegion = primaryAppLayer.visibleRegion?.bounds + ?: return@add false + val secondaryVisibleRegion = secondaryAppLayer.visibleRegion?.bounds + ?: return@add false + + if (testSpec.startRotation.isRotated()) { + return@add primaryVisibleRegion.right <= secondaryVisibleRegion.left + } else { + return@add primaryVisibleRegion.bottom <= secondaryVisibleRegion.top + } + }.waitForAndVerify() + } + @IwTest(focusArea = "sysui") @Presubmit @Test