• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
<lambda>null2  *  Copyright (C) 2022 The Android Open Source Project
3  *
4  *  Licensed under the Apache License, Version 2.0 (the "License");
5  *  you may not use this file except in compliance with the License.
6  *  You may obtain a copy of the License at
7  *
8  *       http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *  Unless required by applicable law or agreed to in writing, software
11  *  distributed under the License is distributed on an "AS IS" BASIS,
12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *  See the License for the specific language governing permissions and
14  *  limitations under the License.
15  *
16  */
17 
18 package com.android.systemui.keyguard.domain.interactor
19 
20 import com.android.systemui.dagger.SysUISingleton
21 import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository
22 import com.android.systemui.keyguard.shared.model.KeyguardState
23 import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
24 import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
25 import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
26 import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
27 import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED
28 import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER
29 import com.android.systemui.keyguard.shared.model.TransitionState
30 import com.android.systemui.keyguard.shared.model.TransitionStep
31 import javax.inject.Inject
32 import kotlinx.coroutines.flow.Flow
33 import kotlinx.coroutines.flow.filter
34 import kotlinx.coroutines.flow.map
35 import kotlinx.coroutines.flow.merge
36 
37 /** Encapsulates business-logic related to the keyguard transitions. */
38 @SysUISingleton
39 class KeyguardTransitionInteractor
40 @Inject
41 constructor(
42     repository: KeyguardTransitionRepository,
43 ) {
44     /** (any)->GONE transition information */
45     val anyStateToGoneTransition: Flow<TransitionStep> =
46         repository.transitions.filter { step -> step.to == KeyguardState.GONE }
47 
48     /** (any)->AOD transition information */
49     val anyStateToAodTransition: Flow<TransitionStep> =
50         repository.transitions.filter { step -> step.to == KeyguardState.AOD }
51 
52     /** AOD->LOCKSCREEN transition information. */
53     val aodToLockscreenTransition: Flow<TransitionStep> = repository.transition(AOD, LOCKSCREEN)
54 
55     /** DREAMING->LOCKSCREEN transition information. */
56     val dreamingToLockscreenTransition: Flow<TransitionStep> =
57         repository.transition(DREAMING, LOCKSCREEN)
58 
59     /** GONE->DREAMING transition information. */
60     val goneToDreamingTransition: Flow<TransitionStep> = repository.transition(GONE, DREAMING)
61 
62     /** LOCKSCREEN->AOD transition information. */
63     val lockscreenToAodTransition: Flow<TransitionStep> = repository.transition(LOCKSCREEN, AOD)
64 
65     /** LOCKSCREEN->PRIMARY_BOUNCER transition information. */
66     val mLockscreenToPrimaryBouncerTransition: Flow<TransitionStep> =
67         repository.transition(LOCKSCREEN, PRIMARY_BOUNCER)
68 
69     /** LOCKSCREEN->DREAMING transition information. */
70     val lockscreenToDreamingTransition: Flow<TransitionStep> =
71         repository.transition(LOCKSCREEN, DREAMING)
72 
73     /** LOCKSCREEN->OCCLUDED transition information. */
74     val lockscreenToOccludedTransition: Flow<TransitionStep> =
75         repository.transition(LOCKSCREEN, OCCLUDED)
76 
77     /** OCCLUDED->LOCKSCREEN transition information. */
78     val occludedToLockscreenTransition: Flow<TransitionStep> =
79         repository.transition(OCCLUDED, LOCKSCREEN)
80 
81     /** PRIMARY_BOUNCER->GONE transition information. */
82     val primaryBouncerToGoneTransition: Flow<TransitionStep> =
83         repository.transition(PRIMARY_BOUNCER, GONE)
84 
85     /**
86      * AOD<->LOCKSCREEN transition information, mapped to dozeAmount range of AOD (1f) <->
87      * Lockscreen (0f).
88      */
89     val dozeAmountTransition: Flow<TransitionStep> =
90         merge(
91             aodToLockscreenTransition.map { step -> step.copy(value = 1f - step.value) },
92             lockscreenToAodTransition,
93         )
94 
95     /* The last [TransitionStep] with a [TransitionState] of STARTED */
96     val startedKeyguardTransitionStep: Flow<TransitionStep> =
97         repository.transitions.filter { step -> step.transitionState == TransitionState.STARTED }
98 
99     /* The last [TransitionStep] with a [TransitionState] of CANCELED */
100     val canceledKeyguardTransitionStep: Flow<TransitionStep> =
101         repository.transitions.filter { step -> step.transitionState == TransitionState.CANCELED }
102 
103     /* The last [TransitionStep] with a [TransitionState] of FINISHED */
104     val finishedKeyguardTransitionStep: Flow<TransitionStep> =
105         repository.transitions.filter { step -> step.transitionState == TransitionState.FINISHED }
106 
107     /* The last completed [KeyguardState] transition */
108     val finishedKeyguardState: Flow<KeyguardState> =
109         finishedKeyguardTransitionStep.map { step -> step.to }
110 }
111