• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.domain.interactor.CommunalSettingsInteractor
24 import com.android.systemui.dagger.SysUISingleton
25 import com.android.systemui.dump.DumpManager
26 import com.android.systemui.keyguard.domain.interactor.FromDreamingTransitionInteractor
27 import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
28 import com.android.systemui.keyguard.shared.model.Edge
29 import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
30 import com.android.systemui.keyguard.shared.model.TransitionState
31 import com.android.systemui.keyguard.ui.viewmodel.DreamingToGlanceableHubTransitionViewModel
32 import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel
33 import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToDreamingTransitionViewModel
34 import com.android.systemui.res.R
35 import com.android.systemui.settings.UserTracker
36 import com.android.systemui.util.kotlin.FlowDumperImpl
37 import javax.inject.Inject
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 @SysUISingleton
45 class DreamViewModel
46 @Inject
47 constructor(
48     configurationInteractor: ConfigurationInteractor,
49     keyguardTransitionInteractor: KeyguardTransitionInteractor,
50     fromGlanceableHubTransitionViewModel: GlanceableHubToDreamingTransitionViewModel,
51     toGlanceableHubTransitionViewModel: DreamingToGlanceableHubTransitionViewModel,
52     private val toLockscreenTransitionViewModel: DreamingToLockscreenTransitionViewModel,
53     private val fromDreamingTransitionInteractor: FromDreamingTransitionInteractor,
54     private val communalInteractor: CommunalInteractor,
55     private val communalSettingsInteractor: CommunalSettingsInteractor,
56     private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
57     private val userTracker: UserTracker,
58     dumpManager: DumpManager,
59 ) : FlowDumperImpl(dumpManager) {
60 
61     fun startTransitionFromDream() {
62         val showGlanceableHub =
63             if (communalSettingsInteractor.isV2FlagEnabled()) {
64                 communalSettingsInteractor.autoOpenEnabled.value
65             } else {
66                 communalInteractor.isCommunalEnabled.value &&
67                     !keyguardUpdateMonitor.isEncryptedOrLockdown(userTracker.userId)
68             }
69         fromDreamingTransitionInteractor.startToLockscreenOrGlanceableHubTransition(
70             showGlanceableHub && !glanceableHubAllowKeyguardWhenDreaming()
71         )
72     }
73 
74     val dreamOverlayTranslationX: Flow<Float> =
75         merge(
76                 toGlanceableHubTransitionViewModel.dreamOverlayTranslationX,
77                 fromGlanceableHubTransitionViewModel.dreamOverlayTranslationX,
78             )
79             .distinctUntilChanged()
80 
81     val dreamOverlayTranslationY: Flow<Float> =
82         configurationInteractor
83             .dimensionPixelSize(R.dimen.dream_overlay_exit_y_offset)
84             .flatMapLatest { px: Int ->
85                 toLockscreenTransitionViewModel.dreamOverlayTranslationY(px)
86             }
87 
88     val dreamAlpha: Flow<Float> =
89         merge(
90                 toLockscreenTransitionViewModel.dreamOverlayAlpha,
91                 toGlanceableHubTransitionViewModel.dreamAlpha,
92             )
93             .distinctUntilChanged()
94             .dumpWhileCollecting("dreamAlpha")
95 
96     val dreamOverlayAlpha: Flow<Float> =
97         merge(
98                 toLockscreenTransitionViewModel.dreamOverlayAlpha,
99                 toGlanceableHubTransitionViewModel.dreamOverlayAlpha,
100                 fromGlanceableHubTransitionViewModel.dreamOverlayAlpha,
101             )
102             .distinctUntilChanged()
103 
104     val transitionEnded =
105         keyguardTransitionInteractor.transition(Edge.create(from = DREAMING)).filter { step ->
106             step.transitionState == TransitionState.FINISHED ||
107                 step.transitionState == TransitionState.CANCELED
108         }
109 }
110