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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user