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