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