1 /*
<lambda>null2  * Copyright (C) 2024 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 package com.android.systemui.dreams.ui.viewmodel
18 
19 import com.android.keyguard.KeyguardUpdateMonitor
20 import com.android.systemui.Flags.glanceableHubAllowKeyguardWhenDreaming
21 import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
22 import com.android.systemui.communal.domain.interactor.CommunalInteractor
23 import com.android.systemui.communal.shared.model.CommunalScenes
24 import com.android.systemui.dagger.SysUISingleton
25 import com.android.systemui.dump.DumpManager
26 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
27 import com.android.systemui.keyguard.shared.model.Edge
28 import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
29 import com.android.systemui.keyguard.shared.model.TransitionState
30 import com.android.systemui.keyguard.ui.viewmodel.DreamingToGlanceableHubTransitionViewModel
31 import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel
32 import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToDreamingTransitionViewModel
33 import com.android.systemui.res.R
34 import com.android.systemui.settings.UserTracker
35 import com.android.systemui.util.kotlin.FlowDumperImpl
36 import javax.inject.Inject
37 import kotlinx.coroutines.ExperimentalCoroutinesApi
38 import kotlinx.coroutines.flow.Flow
39 import kotlinx.coroutines.flow.distinctUntilChanged
40 import kotlinx.coroutines.flow.filter
41 import kotlinx.coroutines.flow.flatMapLatest
42 import kotlinx.coroutines.flow.merge
43 
44 @OptIn(ExperimentalCoroutinesApi::class)
45 @SysUISingleton
46 class DreamViewModel
47 @Inject
48 constructor(
49     configurationInteractor: ConfigurationInteractor,
50     keyguardTransitionInteractor: KeyguardTransitionInteractor,
51     fromGlanceableHubTransitionInteractor: GlanceableHubToDreamingTransitionViewModel,
52     toGlanceableHubTransitionViewModel: DreamingToGlanceableHubTransitionViewModel,
53     private val toLockscreenTransitionViewModel: DreamingToLockscreenTransitionViewModel,
54     private val communalInteractor: CommunalInteractor,
55     private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
56     private val userTracker: UserTracker,
57     dumpManager: DumpManager,
58 ) : FlowDumperImpl(dumpManager) {
59 
60     fun startTransitionFromDream() {
61         val showGlanceableHub =
62             communalInteractor.isCommunalEnabled.value &&
63                 !keyguardUpdateMonitor.isEncryptedOrLockdown(userTracker.userId)
64         if (showGlanceableHub && !glanceableHubAllowKeyguardWhenDreaming()) {
65             communalInteractor.changeScene(CommunalScenes.Communal)
66         } else {
67             toLockscreenTransitionViewModel.startTransition()
68         }
69     }
70 
71     val dreamOverlayTranslationX: Flow<Float> =
72         merge(
73                 toGlanceableHubTransitionViewModel.dreamOverlayTranslationX,
74                 fromGlanceableHubTransitionInteractor.dreamOverlayTranslationX,
75             )
76             .distinctUntilChanged()
77 
78     val dreamOverlayTranslationY: Flow<Float> =
79         configurationInteractor
80             .dimensionPixelSize(R.dimen.dream_overlay_exit_y_offset)
81             .flatMapLatest { px: Int ->
82                 toLockscreenTransitionViewModel.dreamOverlayTranslationY(px)
83             }
84 
85     val dreamAlpha: Flow<Float> =
86         merge(
87                 toLockscreenTransitionViewModel.dreamOverlayAlpha,
88                 toGlanceableHubTransitionViewModel.dreamAlpha,
89             )
90             .distinctUntilChanged()
91             .dumpWhileCollecting("dreamAlpha")
92 
93     val dreamOverlayAlpha: Flow<Float> =
94         merge(
95                 toLockscreenTransitionViewModel.dreamOverlayAlpha,
96                 toGlanceableHubTransitionViewModel.dreamOverlayAlpha,
97                 fromGlanceableHubTransitionInteractor.dreamOverlayAlpha,
98             )
99             .distinctUntilChanged()
100 
101     val transitionEnded =
102         keyguardTransitionInteractor.transition(Edge.create(from = DREAMING)).filter { step ->
103             step.transitionState == TransitionState.FINISHED ||
104                 step.transitionState == TransitionState.CANCELED
105         }
106 }
107