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

Commit dc2f9fe1 authored by Pablo Gamito's avatar Pablo Gamito Committed by Android (Google) Code Review
Browse files

Merge "Ensure SwitchAppByDoubleTapDivider waits for apps to fully switch...

Merge "Ensure SwitchAppByDoubleTapDivider waits for apps to fully switch before ending the transition"
parents 4b90718a cf8206da
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")