ImeFlicker: Improve imeLayerAlphaOneAfterSnapshotStartingWindowRemoval

Makes the assertion report which layer it triggered on and what the alpha
value actually was.

Test: atest FlickerTestsIme
Bug: 288745848
Change-Id: Ica021ac14cf79ca920de44f502b565f3088fe981
This commit is contained in:
Adrian Roos
2023-07-05 15:00:34 +00:00
parent 7abad12e55
commit 16336aea3e

View File

@@ -19,9 +19,7 @@ package com.android.server.wm.flicker.ime
import android.platform.test.annotations.Postsubmit
import android.platform.test.annotations.Presubmit
import android.tools.common.Rotation
import android.tools.common.Timestamp
import android.tools.common.flicker.subject.exceptions.ExceptionMessageBuilder
import android.tools.common.flicker.subject.exceptions.InvalidPropertyException
import android.tools.common.flicker.subject.layers.LayerTraceEntrySubject
import android.tools.common.traces.component.ComponentNameMatcher
import android.tools.device.flicker.junit.FlickerParametersRunnerFactory
import android.tools.device.flicker.legacy.FlickerBuilder
@@ -85,44 +83,37 @@ open class ShowImeOnAppStartWhenLaunchingAppFromFixedOrientationTest(flicker: Le
@Postsubmit
@Test
fun imeLayerAlphaOneAfterSnapshotStartingWindowRemoval() {
// Check if the snapshot appeared during the trace
var imeSnapshotRemovedTimestamp: Timestamp? = null
val layerTrace = flicker.reader.readLayersTrace() ?: error("Unable to read layers trace")
val layerTrace = flicker.reader.readLayersTrace()
val layerTraceEntries = layerTrace?.entries?.toList() ?: emptyList()
layerTraceEntries.zipWithNext { prev, next ->
val prevSnapshotLayerVisible =
ComponentNameMatcher.SNAPSHOT.layerMatchesAnyOf(prev.visibleLayers)
val nextSnapshotLayerVisible =
ComponentNameMatcher.SNAPSHOT.layerMatchesAnyOf(next.visibleLayers)
if (
imeSnapshotRemovedTimestamp == null &&
(prevSnapshotLayerVisible && !nextSnapshotLayerVisible)
) {
imeSnapshotRemovedTimestamp = next.timestamp
// Find the entries immediately after the IME snapshot has disappeared
val imeSnapshotRemovedEntries = layerTrace.entries.asSequence()
.zipWithNext { prev, next ->
if (ComponentNameMatcher.SNAPSHOT.layerMatchesAnyOf(prev.visibleLayers) &&
!ComponentNameMatcher.SNAPSHOT.layerMatchesAnyOf(next.visibleLayers)) {
next
} else {
null
}
}
}
.filterNotNull()
// if so, make an assertion
imeSnapshotRemovedTimestamp?.let { timestamp ->
val stateAfterSnapshot =
layerTrace?.getEntryAt(timestamp) ?: error("State not found for $timestamp")
// If we find it, make sure the IME is visible and fully animated in.
imeSnapshotRemovedEntries.forEach { entry ->
val entrySubject = LayerTraceEntrySubject(entry)
val imeLayerSubjects = entrySubject.subjects.filter {
ComponentNameMatcher.IME.layerMatchesAnyOf(it.layer) && it.isVisible
}
val imeLayers =
ComponentNameMatcher.IME.filterLayers(stateAfterSnapshot.visibleLayers.toList())
entrySubject
.check { "InputMethod must exist and be visible" }
.that(imeLayerSubjects.isNotEmpty())
.isEqual(true)
require(imeLayers.isNotEmpty()) { "IME layer not found" }
if (imeLayers.any { it.color.a != 1.0f }) {
val errorMsgBuilder =
ExceptionMessageBuilder()
.setTimestamp(timestamp)
.forInvalidProperty("IME layer alpha")
.setExpected("is 1.0")
.setActual("not 1.0")
.addExtraDescription("Filter", ComponentNameMatcher.IME.toLayerIdentifier())
throw InvalidPropertyException(errorMsgBuilder)
imeLayerSubjects.forEach { imeLayerSubject ->
imeLayerSubject
.check { "alpha" }
.that(imeLayerSubject.layer.color.a)
.isEqual(1.0f)
}
}
}