Loading packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/NotificationShadeWindowModelTest.kt +67 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat Loading Loading @@ -83,4 +85,69 @@ class NotificationShadeWindowModelTest : SysuiTestCase() { ) assertThat(isKeyguardOccluded).isFalse() } @Test fun transitionFromOccludedToDreamingTransitionRemainsTrue() = testScope.runTest { val isKeyguardOccluded by collectLastValue(underTest.isKeyguardOccluded) assertThat(isKeyguardOccluded).isFalse() keyguardTransitionRepository.sendTransitionSteps( listOf( TransitionStep( from = KeyguardState.LOCKSCREEN, to = KeyguardState.DREAMING, value = 0f, transitionState = TransitionState.STARTED, ), TransitionStep( from = KeyguardState.LOCKSCREEN, to = KeyguardState.DREAMING, value = 0.5f, transitionState = TransitionState.RUNNING, ), ), testScope, ) assertThat(isKeyguardOccluded).isFalse() keyguardTransitionRepository.sendTransitionStep( TransitionStep( from = KeyguardState.LOCKSCREEN, to = KeyguardState.DREAMING, value = 1f, transitionState = TransitionState.FINISHED, ), ) assertThat(isKeyguardOccluded).isTrue() keyguardTransitionRepository.sendTransitionSteps( listOf( TransitionStep( from = KeyguardState.DREAMING, to = KeyguardState.OCCLUDED, value = 0f, transitionState = TransitionState.STARTED, ), TransitionStep( from = KeyguardState.DREAMING, to = KeyguardState.OCCLUDED, value = 0.5f, transitionState = TransitionState.RUNNING, ), ), testScope, ) assertThat(isKeyguardOccluded).isTrue() keyguardTransitionRepository.sendTransitionStep( TransitionStep( from = KeyguardState.DREAMING, to = KeyguardState.OCCLUDED, value = 1f, transitionState = TransitionState.FINISHED, ), ) assertThat(isKeyguardOccluded).isTrue() } } packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/NotificationShadeWindowModel.kt +36 −8 Original line number Diff line number Diff line Loading @@ -17,14 +17,15 @@ package com.android.systemui.shade.ui.viewmodel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING import com.android.systemui.keyguard.shared.model.KeyguardState.GLANCEABLE_HUB import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.util.kotlin.BooleanFlowOperators.any import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map /** Models UI state for the shade window. */ @SysUISingleton Loading @@ -32,11 +33,38 @@ class NotificationShadeWindowModel @Inject constructor( keyguardTransitionInteractor: KeyguardTransitionInteractor, keyguardInteractor: KeyguardInteractor, ) { /** * Considered to be occluded if in OCCLUDED, DREAMING, GLANCEABLE_HUB/Communal, or transitioning * between those states. Every permutation is listed so we can use optimal flows and support * Scenes. */ val isKeyguardOccluded: Flow<Boolean> = anyOf( keyguardTransitionInteractor.transitionValue(OCCLUDED).map { it == 1f }, keyguardTransitionInteractor.transitionValue(DREAMING).map { it == 1f }, listOf( // Finished in state... keyguardTransitionInteractor.isFinishedIn(OCCLUDED), keyguardTransitionInteractor.isFinishedIn(DREAMING), keyguardTransitionInteractor.isFinishedIn(Scenes.Communal, GLANCEABLE_HUB), // ... or transitions between those states keyguardTransitionInteractor.isInTransition(Edge.create(OCCLUDED, DREAMING)), keyguardTransitionInteractor.isInTransition(Edge.create(DREAMING, OCCLUDED)), keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = OCCLUDED, to = Scenes.Communal), edgeWithoutSceneContainer = Edge.create(from = OCCLUDED, to = GLANCEABLE_HUB), ), keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = Scenes.Communal, to = OCCLUDED), edgeWithoutSceneContainer = Edge.create(from = GLANCEABLE_HUB, to = OCCLUDED), ), keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = DREAMING, to = Scenes.Communal), edgeWithoutSceneContainer = Edge.create(from = DREAMING, to = GLANCEABLE_HUB), ), keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = Scenes.Communal, to = DREAMING), edgeWithoutSceneContainer = Edge.create(from = GLANCEABLE_HUB, to = DREAMING), ), ) .any() } packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/NotificationsShadeWindowModelKosmos.kt +0 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.shade.ui.viewmodel import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos Loading @@ -24,6 +23,5 @@ val Kosmos.notificationShadeWindowModel: NotificationShadeWindowModel by Kosmos.Fixture { NotificationShadeWindowModel( keyguardTransitionInteractor, keyguardInteractor, ) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/NotificationShadeWindowModelTest.kt +67 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat Loading Loading @@ -83,4 +85,69 @@ class NotificationShadeWindowModelTest : SysuiTestCase() { ) assertThat(isKeyguardOccluded).isFalse() } @Test fun transitionFromOccludedToDreamingTransitionRemainsTrue() = testScope.runTest { val isKeyguardOccluded by collectLastValue(underTest.isKeyguardOccluded) assertThat(isKeyguardOccluded).isFalse() keyguardTransitionRepository.sendTransitionSteps( listOf( TransitionStep( from = KeyguardState.LOCKSCREEN, to = KeyguardState.DREAMING, value = 0f, transitionState = TransitionState.STARTED, ), TransitionStep( from = KeyguardState.LOCKSCREEN, to = KeyguardState.DREAMING, value = 0.5f, transitionState = TransitionState.RUNNING, ), ), testScope, ) assertThat(isKeyguardOccluded).isFalse() keyguardTransitionRepository.sendTransitionStep( TransitionStep( from = KeyguardState.LOCKSCREEN, to = KeyguardState.DREAMING, value = 1f, transitionState = TransitionState.FINISHED, ), ) assertThat(isKeyguardOccluded).isTrue() keyguardTransitionRepository.sendTransitionSteps( listOf( TransitionStep( from = KeyguardState.DREAMING, to = KeyguardState.OCCLUDED, value = 0f, transitionState = TransitionState.STARTED, ), TransitionStep( from = KeyguardState.DREAMING, to = KeyguardState.OCCLUDED, value = 0.5f, transitionState = TransitionState.RUNNING, ), ), testScope, ) assertThat(isKeyguardOccluded).isTrue() keyguardTransitionRepository.sendTransitionStep( TransitionStep( from = KeyguardState.DREAMING, to = KeyguardState.OCCLUDED, value = 1f, transitionState = TransitionState.FINISHED, ), ) assertThat(isKeyguardOccluded).isTrue() } }
packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/NotificationShadeWindowModel.kt +36 −8 Original line number Diff line number Diff line Loading @@ -17,14 +17,15 @@ package com.android.systemui.shade.ui.viewmodel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING import com.android.systemui.keyguard.shared.model.KeyguardState.GLANCEABLE_HUB import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.util.kotlin.BooleanFlowOperators.any import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map /** Models UI state for the shade window. */ @SysUISingleton Loading @@ -32,11 +33,38 @@ class NotificationShadeWindowModel @Inject constructor( keyguardTransitionInteractor: KeyguardTransitionInteractor, keyguardInteractor: KeyguardInteractor, ) { /** * Considered to be occluded if in OCCLUDED, DREAMING, GLANCEABLE_HUB/Communal, or transitioning * between those states. Every permutation is listed so we can use optimal flows and support * Scenes. */ val isKeyguardOccluded: Flow<Boolean> = anyOf( keyguardTransitionInteractor.transitionValue(OCCLUDED).map { it == 1f }, keyguardTransitionInteractor.transitionValue(DREAMING).map { it == 1f }, listOf( // Finished in state... keyguardTransitionInteractor.isFinishedIn(OCCLUDED), keyguardTransitionInteractor.isFinishedIn(DREAMING), keyguardTransitionInteractor.isFinishedIn(Scenes.Communal, GLANCEABLE_HUB), // ... or transitions between those states keyguardTransitionInteractor.isInTransition(Edge.create(OCCLUDED, DREAMING)), keyguardTransitionInteractor.isInTransition(Edge.create(DREAMING, OCCLUDED)), keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = OCCLUDED, to = Scenes.Communal), edgeWithoutSceneContainer = Edge.create(from = OCCLUDED, to = GLANCEABLE_HUB), ), keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = Scenes.Communal, to = OCCLUDED), edgeWithoutSceneContainer = Edge.create(from = GLANCEABLE_HUB, to = OCCLUDED), ), keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = DREAMING, to = Scenes.Communal), edgeWithoutSceneContainer = Edge.create(from = DREAMING, to = GLANCEABLE_HUB), ), keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = Scenes.Communal, to = DREAMING), edgeWithoutSceneContainer = Edge.create(from = GLANCEABLE_HUB, to = DREAMING), ), ) .any() }
packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/NotificationsShadeWindowModelKosmos.kt +0 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.systemui.shade.ui.viewmodel import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.kosmos.Kosmos Loading @@ -24,6 +23,5 @@ val Kosmos.notificationShadeWindowModel: NotificationShadeWindowModel by Kosmos.Fixture { NotificationShadeWindowModel( keyguardTransitionInteractor, keyguardInteractor, ) }