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:
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user