Transitions - Allow ->GONE to be canceled

Especially for when the user may auth but continue pushing down the
power button, allow transitions to GONE to be interrupted by an
immediate transition back to any keyguard state.

Also, optimization for DREAMING->LOCKSCREEN. Add a slight delay in
processing events, because the data source events may come in out of
order or with a small gap.

Test: existing transition tests cover these small tweaks well
Test: atest
frameworks/base/packages/SystemUI/tests/src/com/android/systemui/keyguard/
Fixes: 265325414

Change-Id: I07d8b225db2df04453ffe4b694f5124da94ee560
This commit is contained in:
Matt Pietal
2023-01-12 20:24:14 +00:00
parent f863e3eb83
commit 3fd0a6705a
2 changed files with 11 additions and 7 deletions

View File

@@ -31,8 +31,10 @@ import javax.inject.Inject
import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
@SysUISingleton
@@ -87,6 +89,9 @@ constructor(
private fun listenForDreamingToOccluded() {
scope.launch {
keyguardInteractor.isDreaming
// Add a slight delay, as dreaming and occluded events will arrive with a small gap
// in time. This prevents a transition to OCCLUSION happening prematurely.
.onEach { delay(50) }
.sample(
combine(
keyguardInteractor.isKeyguardOccluded,

View File

@@ -50,10 +50,9 @@ constructor(
private fun listenForGoneToDreaming() {
scope.launch {
keyguardInteractor.isAbleToDream
.sample(keyguardTransitionInteractor.finishedKeyguardState, ::Pair)
.collect { pair ->
val (isAbleToDream, keyguardState) = pair
if (isAbleToDream && keyguardState == KeyguardState.GONE) {
.sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair)
.collect { (isAbleToDream, lastStartedStep) ->
if (isAbleToDream && lastStartedStep.to == KeyguardState.GONE) {
keyguardTransitionRepository.startTransition(
TransitionInfo(
name,
@@ -72,15 +71,15 @@ constructor(
keyguardInteractor.wakefulnessModel
.sample(
combine(
keyguardTransitionInteractor.finishedKeyguardState,
keyguardTransitionInteractor.startedKeyguardTransitionStep,
keyguardInteractor.isAodAvailable,
::Pair
),
::toTriple
)
.collect { (wakefulnessState, keyguardState, isAodAvailable) ->
.collect { (wakefulnessState, lastStartedStep, isAodAvailable) ->
if (
keyguardState == KeyguardState.GONE &&
lastStartedStep.to == KeyguardState.GONE &&
wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP
) {
keyguardTransitionRepository.startTransition(