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