Loading packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt +18 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,8 @@ import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepos import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockMode import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.DozeTransitionModel import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.GONE import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN Loading Loading @@ -154,6 +156,22 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.GONE) } @Test fun testTransitionToDreaming() = kosmos.runTest { // Ensure dozing is off fakeKeyguardRepository.setDozeTransitionModel( DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) ) testScope.advanceTimeBy(600L) keyguardInteractor.setDreaming(true) testScope.advanceTimeBy(60L) assertThat(transitionRepository) .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.DREAMING) } @Test @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR) @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_GLANCEABLE_HUB_V2) Loading packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +15 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ constructor( override fun start() { listenForDozingToAny() listenForDozingToDreaming() listenForDozingToGoneViaBiometrics() listenForWakeFromDozing() listenForTransitionToCamera(scope, keyguardInteractor) Loading Loading @@ -128,6 +129,18 @@ constructor( isCommunalAvailable && dreamManager.canStartDreaming(false) } @OptIn(FlowPreview::class) @SuppressLint("MissingPermission") private fun listenForDozingToDreaming() { scope.launch { keyguardInteractor.isAbleToDream .filterRelevantKeyguardStateAnd { isAbleToDream -> isAbleToDream } .collect { startTransitionTo(KeyguardState.DREAMING, ownerReason = "isAbleToDream") } } } @OptIn(FlowPreview::class) @SuppressLint("MissingPermission") private fun listenForDozingToAny() { Loading Loading @@ -284,6 +297,7 @@ constructor( interpolator = Interpolators.LINEAR duration = when (toState) { KeyguardState.DREAMING -> TO_DREAMING_DURATION KeyguardState.GONE -> TO_GONE_DURATION KeyguardState.GLANCEABLE_HUB -> TO_GLANCEABLE_HUB_DURATION KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION Loading @@ -297,6 +311,7 @@ constructor( companion object { const val TAG = "FromDozingTransitionInteractor" private val DEFAULT_DURATION = 500.milliseconds val TO_DREAMING_DURATION = 300.milliseconds val TO_GLANCEABLE_HUB_DURATION = DEFAULT_DURATION val TO_GONE_DURATION = DEFAULT_DURATION val TO_LOCKSCREEN_DURATION = DEFAULT_DURATION Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModel.kt 0 → 100644 +42 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromDozingTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow import javax.inject.Inject import kotlinx.coroutines.flow.Flow /** * Breaks down DOZING->DREAMING transition into discrete steps for corresponding views to consume. */ @SysUISingleton class DozingToDreamingTransitionViewModel @Inject constructor(animationFlow: KeyguardTransitionAnimationFlow) { private val transitionAnimation = animationFlow.setup( duration = FromDozingTransitionInteractor.TO_DREAMING_DURATION, edge = Edge.create(from = DOZING, to = DREAMING), ) val lockscreenAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f) } packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt +2 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ constructor( private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel, private val aodToOccludedTransitionViewModel: AodToOccludedTransitionViewModel, private val aodToPrimaryBouncerTransitionViewModel: AodToPrimaryBouncerTransitionViewModel, private val dozingToDreamingTransitionViewModel: DozingToDreamingTransitionViewModel, private val dozingToGoneTransitionViewModel: DozingToGoneTransitionViewModel, private val dozingToLockscreenTransitionViewModel: DozingToLockscreenTransitionViewModel, private val dozingToOccludedTransitionViewModel: DozingToOccludedTransitionViewModel, Loading Loading @@ -247,6 +248,7 @@ constructor( aodToLockscreenTransitionViewModel.lockscreenAlpha(viewState), aodToOccludedTransitionViewModel.lockscreenAlpha(viewState), aodToPrimaryBouncerTransitionViewModel.lockscreenAlpha, dozingToDreamingTransitionViewModel.lockscreenAlpha, dozingToGoneTransitionViewModel.lockscreenAlpha(viewState), dozingToLockscreenTransitionViewModel.lockscreenAlpha, dozingToOccludedTransitionViewModel.lockscreenAlpha(viewState), Loading packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModelKosmos.kt 0 → 100644 +25 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture val Kosmos.dozingToDreamingTransitionViewModel by Fixture { DozingToDreamingTransitionViewModel(animationFlow = keyguardTransitionAnimationFlow) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt +18 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,8 @@ import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepos import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockMode import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.DozeTransitionModel import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.GONE import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN Loading Loading @@ -154,6 +156,22 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.GONE) } @Test fun testTransitionToDreaming() = kosmos.runTest { // Ensure dozing is off fakeKeyguardRepository.setDozeTransitionModel( DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) ) testScope.advanceTimeBy(600L) keyguardInteractor.setDreaming(true) testScope.advanceTimeBy(60L) assertThat(transitionRepository) .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.DREAMING) } @Test @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR) @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_GLANCEABLE_HUB_V2) Loading
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +15 −0 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ constructor( override fun start() { listenForDozingToAny() listenForDozingToDreaming() listenForDozingToGoneViaBiometrics() listenForWakeFromDozing() listenForTransitionToCamera(scope, keyguardInteractor) Loading Loading @@ -128,6 +129,18 @@ constructor( isCommunalAvailable && dreamManager.canStartDreaming(false) } @OptIn(FlowPreview::class) @SuppressLint("MissingPermission") private fun listenForDozingToDreaming() { scope.launch { keyguardInteractor.isAbleToDream .filterRelevantKeyguardStateAnd { isAbleToDream -> isAbleToDream } .collect { startTransitionTo(KeyguardState.DREAMING, ownerReason = "isAbleToDream") } } } @OptIn(FlowPreview::class) @SuppressLint("MissingPermission") private fun listenForDozingToAny() { Loading Loading @@ -284,6 +297,7 @@ constructor( interpolator = Interpolators.LINEAR duration = when (toState) { KeyguardState.DREAMING -> TO_DREAMING_DURATION KeyguardState.GONE -> TO_GONE_DURATION KeyguardState.GLANCEABLE_HUB -> TO_GLANCEABLE_HUB_DURATION KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION Loading @@ -297,6 +311,7 @@ constructor( companion object { const val TAG = "FromDozingTransitionInteractor" private val DEFAULT_DURATION = 500.milliseconds val TO_DREAMING_DURATION = 300.milliseconds val TO_GLANCEABLE_HUB_DURATION = DEFAULT_DURATION val TO_GONE_DURATION = DEFAULT_DURATION val TO_LOCKSCREEN_DURATION = DEFAULT_DURATION Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModel.kt 0 → 100644 +42 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromDozingTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow import javax.inject.Inject import kotlinx.coroutines.flow.Flow /** * Breaks down DOZING->DREAMING transition into discrete steps for corresponding views to consume. */ @SysUISingleton class DozingToDreamingTransitionViewModel @Inject constructor(animationFlow: KeyguardTransitionAnimationFlow) { private val transitionAnimation = animationFlow.setup( duration = FromDozingTransitionInteractor.TO_DREAMING_DURATION, edge = Edge.create(from = DOZING, to = DREAMING), ) val lockscreenAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f) }
packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt +2 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ constructor( private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel, private val aodToOccludedTransitionViewModel: AodToOccludedTransitionViewModel, private val aodToPrimaryBouncerTransitionViewModel: AodToPrimaryBouncerTransitionViewModel, private val dozingToDreamingTransitionViewModel: DozingToDreamingTransitionViewModel, private val dozingToGoneTransitionViewModel: DozingToGoneTransitionViewModel, private val dozingToLockscreenTransitionViewModel: DozingToLockscreenTransitionViewModel, private val dozingToOccludedTransitionViewModel: DozingToOccludedTransitionViewModel, Loading Loading @@ -247,6 +248,7 @@ constructor( aodToLockscreenTransitionViewModel.lockscreenAlpha(viewState), aodToOccludedTransitionViewModel.lockscreenAlpha(viewState), aodToPrimaryBouncerTransitionViewModel.lockscreenAlpha, dozingToDreamingTransitionViewModel.lockscreenAlpha, dozingToGoneTransitionViewModel.lockscreenAlpha(viewState), dozingToLockscreenTransitionViewModel.lockscreenAlpha, dozingToOccludedTransitionViewModel.lockscreenAlpha(viewState), Loading
packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModelKosmos.kt 0 → 100644 +25 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.keyguard.ui.viewmodel import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture val Kosmos.dozingToDreamingTransitionViewModel by Fixture { DozingToDreamingTransitionViewModel(animationFlow = keyguardTransitionAnimationFlow) }