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

Commit 0211241c authored by Nataniel Borges's avatar Nataniel Borges
Browse files

Nav bar moves independently of the layer

Wait until it's in the correct place to consider the rotation as finished

Relanding ag/26837592 which was reverted because it dodn't work on tablets

Fixes: 332788177
Test: atest FlickerTestsRotation
Change-Id: Ifcf6e8ceb8e1e62054cfbfb22a38f6a703feb077
parent 045b99e0
Loading
Loading
Loading
Loading
+45 −1
Original line number Diff line number Diff line
@@ -17,8 +17,12 @@
package com.android.server.wm.flicker.activityembedding.rotation

import android.platform.test.annotations.Presubmit
import android.tools.Position
import android.tools.datatypes.Rect
import android.tools.flicker.legacy.FlickerBuilder
import android.tools.flicker.legacy.LegacyFlickerTest
import android.tools.traces.Condition
import android.tools.traces.DeviceStateDump
import android.tools.traces.component.ComponentNameMatcher
import com.android.server.wm.flicker.activityembedding.ActivityEmbeddingTestBase
import com.android.server.wm.flicker.helpers.setRotation
@@ -30,7 +34,14 @@ abstract class RotationTransition(flicker: LegacyFlickerTest) : ActivityEmbeddin
    override val transition: FlickerBuilder.() -> Unit = {
        setup { this.setRotation(flicker.scenario.startRotation) }
        teardown { testApp.exit(wmHelper) }
        transitions { this.setRotation(flicker.scenario.endRotation) }
        transitions {
            this.setRotation(flicker.scenario.endRotation)
            if (!flicker.scenario.isTablet) {
                wmHelper.StateSyncBuilder()
                    .add(navBarInPosition(flicker.scenario.isGesturalNavigation))
                    .waitForAndVerify()
            }
        }
    }

    /** {@inheritDoc} */
@@ -76,4 +87,37 @@ abstract class RotationTransition(flicker: LegacyFlickerTest) : ActivityEmbeddin
        appLayerRotates_StartingPos()
        appLayerRotates_EndingPos()
    }

    private fun navBarInPosition(isGesturalNavigation: Boolean): Condition<DeviceStateDump> {
        return Condition("navBarPosition") { dump ->
            val display =
                dump.layerState.displays.filterNot { it.isOff }.minByOrNull { it.id }
                    ?: error("There is no display!")
            val displayArea = display.layerStackSpace
            val navBarPosition = display.navBarPosition(isGesturalNavigation)
            val navBarRegion = dump.layerState
                .getLayerWithBuffer(ComponentNameMatcher.NAV_BAR)
                ?.visibleRegion?.bounds ?: Rect.EMPTY

            when (navBarPosition) {
                Position.TOP ->
                    navBarRegion.top == displayArea.top &&
                        navBarRegion.left == displayArea.left &&
                        navBarRegion.right == displayArea.right
                Position.BOTTOM ->
                    navBarRegion.bottom == displayArea.bottom &&
                        navBarRegion.left == displayArea.left &&
                        navBarRegion.right == displayArea.right
                Position.LEFT ->
                    navBarRegion.left == displayArea.left &&
                        navBarRegion.top == displayArea.top &&
                        navBarRegion.bottom == displayArea.bottom
                Position.RIGHT ->
                    navBarRegion.right == displayArea.right &&
                        navBarRegion.top == displayArea.top &&
                        navBarRegion.bottom == displayArea.bottom
                else -> error("Unknown position $navBarPosition")
            }
        }
    }
}