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

Commit cf8206da authored by Pablo Gamito's avatar Pablo Gamito
Browse files

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
parent 5f6e63d6
Loading
Loading
Loading
Loading
+45 −1
Original line number Diff line number Diff line
@@ -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
@@ -61,7 +63,49 @@ 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")