Ensure SwitchAppByDoubleTapDivider waits for apps to fully switch before ending the transition

Bug: 248037249

Test: atest com.android.wm.shell.flicker.splitscreen.SwitchAppByDoubleTapDivider
Change-Id: I136a1d8eefc201d59bb63c2cb3c0b587d9cbfffa
This commit is contained in:
Pablo Gamito
2022-09-23 10:28:31 +00:00
parent 5f6e63d6a5
commit cf8206dadb

View File

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