Merge "Transitions - Support OCCLUDED -> GONE" into tm-qpr-dev am: d08e90b90a

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21587361

Change-Id: I61202dc4e0ea1550525d705fdfa3d343c5f4678a
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Matt Pietal
2023-03-03 17:01:30 +00:00
committed by Automerger Merge Worker
2 changed files with 133 additions and 3 deletions

View File

@@ -45,6 +45,7 @@ constructor(
override fun start() { override fun start() {
listenForOccludedToLockscreen() listenForOccludedToLockscreen()
listenForOccludedToGone()
listenForOccludedToDreaming() listenForOccludedToDreaming()
listenForOccludedToAodOrDozing() listenForOccludedToAodOrDozing()
} }
@@ -72,11 +73,22 @@ constructor(
private fun listenForOccludedToLockscreen() { private fun listenForOccludedToLockscreen() {
scope.launch { scope.launch {
keyguardInteractor.isKeyguardOccluded keyguardInteractor.isKeyguardOccluded
.sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) .sample(
.collect { (isOccluded, lastStartedKeyguardState) -> combine(
keyguardInteractor.isKeyguardShowing,
keyguardTransitionInteractor.startedKeyguardTransitionStep,
::Pair
),
::toTriple
)
.collect { (isOccluded, isShowing, lastStartedKeyguardState) ->
// Occlusion signals come from the framework, and should interrupt any // Occlusion signals come from the framework, and should interrupt any
// existing transition // existing transition
if (!isOccluded && lastStartedKeyguardState.to == KeyguardState.OCCLUDED) { if (
!isOccluded &&
isShowing &&
lastStartedKeyguardState.to == KeyguardState.OCCLUDED
) {
keyguardTransitionRepository.startTransition( keyguardTransitionRepository.startTransition(
TransitionInfo( TransitionInfo(
name, name,
@@ -90,6 +102,38 @@ constructor(
} }
} }
private fun listenForOccludedToGone() {
scope.launch {
keyguardInteractor.isKeyguardOccluded
.sample(
combine(
keyguardInteractor.isKeyguardShowing,
keyguardTransitionInteractor.startedKeyguardTransitionStep,
::Pair
),
::toTriple
)
.collect { (isOccluded, isShowing, lastStartedKeyguardState) ->
// Occlusion signals come from the framework, and should interrupt any
// existing transition
if (
!isOccluded &&
!isShowing &&
lastStartedKeyguardState.to == KeyguardState.OCCLUDED
) {
keyguardTransitionRepository.startTransition(
TransitionInfo(
name,
KeyguardState.OCCLUDED,
KeyguardState.GONE,
getAnimator(),
)
)
}
}
}
}
private fun listenForOccludedToAodOrDozing() { private fun listenForOccludedToAodOrDozing() {
scope.launch { scope.launch {
keyguardInteractor.wakefulnessModel keyguardInteractor.wakefulnessModel

View File

@@ -357,6 +357,92 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() {
coroutineContext.cancelChildren() coroutineContext.cancelChildren()
} }
@Test
fun `OCCLUDED to GONE`() =
testScope.runTest {
// GIVEN a device on lockscreen
keyguardRepository.setKeyguardShowing(true)
runCurrent()
// GIVEN a prior transition has run to OCCLUDED
runner.startTransition(
testScope,
TransitionInfo(
ownerName = "",
from = KeyguardState.LOCKSCREEN,
to = KeyguardState.OCCLUDED,
animator =
ValueAnimator().apply {
duration = 10
interpolator = Interpolators.LINEAR
},
)
)
keyguardRepository.setKeyguardOccluded(true)
runCurrent()
reset(mockTransitionRepository)
// WHEN keyguard goes away
keyguardRepository.setKeyguardShowing(false)
// AND occlusion ends
keyguardRepository.setKeyguardOccluded(false)
runCurrent()
val info =
withArgCaptor<TransitionInfo> {
verify(mockTransitionRepository).startTransition(capture(), anyBoolean())
}
// THEN a transition to GONE should occur
assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor")
assertThat(info.from).isEqualTo(KeyguardState.OCCLUDED)
assertThat(info.to).isEqualTo(KeyguardState.GONE)
assertThat(info.animator).isNotNull()
coroutineContext.cancelChildren()
}
@Test
fun `OCCLUDED to LOCKSCREEN`() =
testScope.runTest {
// GIVEN a device on lockscreen
keyguardRepository.setKeyguardShowing(true)
runCurrent()
// GIVEN a prior transition has run to OCCLUDED
runner.startTransition(
testScope,
TransitionInfo(
ownerName = "",
from = KeyguardState.LOCKSCREEN,
to = KeyguardState.OCCLUDED,
animator =
ValueAnimator().apply {
duration = 10
interpolator = Interpolators.LINEAR
},
)
)
keyguardRepository.setKeyguardOccluded(true)
runCurrent()
reset(mockTransitionRepository)
// WHEN occlusion ends
keyguardRepository.setKeyguardOccluded(false)
runCurrent()
val info =
withArgCaptor<TransitionInfo> {
verify(mockTransitionRepository).startTransition(capture(), anyBoolean())
}
// THEN a transition to LOCKSCREEN should occur
assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor")
assertThat(info.from).isEqualTo(KeyguardState.OCCLUDED)
assertThat(info.to).isEqualTo(KeyguardState.LOCKSCREEN)
assertThat(info.animator).isNotNull()
coroutineContext.cancelChildren()
}
@Test @Test
fun `LOCKSCREEN to DOZING`() = fun `LOCKSCREEN to DOZING`() =
testScope.runTest { testScope.runTest {