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

Commit 3fd0a670 authored by Matt Pietal's avatar Matt Pietal
Browse files

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
parent f863e3eb
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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,
+6 −7
Original line number Diff line number Diff line
@@ -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(