diff options
| author | 2024-08-14 19:56:41 +0200 | |
|---|---|---|
| committer | 2024-08-28 14:57:35 +0200 | |
| commit | 5cce2ad0f10d8df5c29f4565bb25fcd2f042803a (patch) | |
| tree | a7f900d757dd53fd62f53cabed6b1839ee39c68b | |
| parent | 7fec56e0fd1378bcce5a0d237d96ee5da77e0727 (diff) | |
[Flexiglass] Fix SharedNotificationContainerViewModel
Transform deprecated KTF states to work in Flexiglass.
Add some more test utilities to be able to test scene container flag on/
off without copying the same test.
Bug: b/349784682
Flag: com.android.systemui.scene_container
Test: Added unit tests for scene container
Change-Id: I91578f20a9d6c2045fe68594485e7f6cfa903661
6 files changed, 313 insertions, 167 deletions
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt index 236e202749b2..a82ee4c359a3 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt @@ -190,7 +190,7 @@ sealed interface ObservableTransitionState { } } - fun isIdle(scene: SceneKey?): Boolean { + fun isIdle(scene: SceneKey? = null): Boolean { return this is Idle && (scene == null || this.currentScene == scene) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt index 733cac99f4ec..3f97f0b7a67d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt @@ -42,10 +42,14 @@ import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.shared.model.BurnInModel -import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER import com.android.systemui.keyguard.shared.model.KeyguardState.AOD +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.GONE import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN +import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED +import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep @@ -56,6 +60,10 @@ import com.android.systemui.keyguard.ui.viewmodel.aodBurnInViewModel import com.android.systemui.keyguard.ui.viewmodel.keyguardRootViewModel import com.android.systemui.kosmos.testScope import com.android.systemui.res.R +import com.android.systemui.scene.data.repository.Idle +import com.android.systemui.scene.data.repository.Transition +import com.android.systemui.scene.data.repository.setTransition +import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.shade.mockLargeScreenHeaderHelper import com.android.systemui.shade.shadeTestUtil @@ -66,6 +74,7 @@ import com.google.common.collect.Range import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.runCurrent @@ -295,34 +304,47 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // Start transitioning to glanceable hub val progress = 0.6f - keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.STARTED, - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GLANCEABLE_HUB, - value = 0f, - ) + kosmos.setTransition( + sceneTransition = Transition(from = Scenes.Lockscreen, to = Scenes.Communal), + stateTransition = + TransitionStep( + transitionState = TransitionState.STARTED, + from = LOCKSCREEN, + to = GLANCEABLE_HUB, + value = 0f, + ) ) + runCurrent() - keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.RUNNING, - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GLANCEABLE_HUB, - value = progress, - ) + kosmos.setTransition( + sceneTransition = + Transition( + from = Scenes.Lockscreen, + to = Scenes.Communal, + progress = flowOf(progress) + ), + stateTransition = + TransitionStep( + transitionState = TransitionState.RUNNING, + from = LOCKSCREEN, + to = GLANCEABLE_HUB, + value = progress, + ) ) + runCurrent() assertThat(alpha).isIn(Range.closed(0f, 1f)) // Finish transition to glanceable hub - keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.FINISHED, - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GLANCEABLE_HUB, - value = 1f, - ) + kosmos.setTransition( + sceneTransition = Idle(Scenes.Communal), + stateTransition = + TransitionStep( + transitionState = TransitionState.FINISHED, + from = LOCKSCREEN, + to = GLANCEABLE_HUB, + value = 1f, + ) ) assertThat(alpha).isEqualTo(0f) @@ -348,35 +370,46 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // Start transitioning to glanceable hub val progress = 0.6f - keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.STARTED, - from = KeyguardState.DREAMING, - to = KeyguardState.GLANCEABLE_HUB, - value = 0f, - ) + kosmos.setTransition( + sceneTransition = Transition(from = Scenes.Lockscreen, to = Scenes.Communal), + stateTransition = + TransitionStep( + transitionState = TransitionState.STARTED, + from = DREAMING, + to = GLANCEABLE_HUB, + value = 0f, + ) ) runCurrent() - keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.RUNNING, - from = KeyguardState.DREAMING, - to = KeyguardState.GLANCEABLE_HUB, - value = progress, - ) + kosmos.setTransition( + sceneTransition = + Transition( + from = Scenes.Lockscreen, + to = Scenes.Communal, + progress = flowOf(progress) + ), + stateTransition = + TransitionStep( + transitionState = TransitionState.RUNNING, + from = DREAMING, + to = GLANCEABLE_HUB, + value = progress, + ) ) runCurrent() // Keep notifications hidden during the transition from dream to hub assertThat(alpha).isEqualTo(0) // Finish transition to glanceable hub - keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.FINISHED, - from = KeyguardState.DREAMING, - to = KeyguardState.GLANCEABLE_HUB, - value = 1f, - ) + kosmos.setTransition( + sceneTransition = Idle(Scenes.Communal), + stateTransition = + TransitionStep( + transitionState = TransitionState.FINISHED, + from = DREAMING, + to = GLANCEABLE_HUB, + value = 1f, + ) ) assertThat(alpha).isEqualTo(0f) } @@ -400,35 +433,47 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S testScope.runTest { val isOnLockscreen by collectLastValue(underTest.isOnLockscreen) - keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GONE, - testScope, + kosmos.setTransition( + sceneTransition = Idle(Scenes.Gone), + stateTransition = TransitionStep(from = LOCKSCREEN, to = GONE) ) assertThat(isOnLockscreen).isFalse() + kosmos.setTransition( + sceneTransition = Idle(Scenes.Lockscreen), + stateTransition = TransitionStep(from = GONE, to = LOCKSCREEN) + ) + assertThat(isOnLockscreen).isTrue() // While progressing from lockscreen, should still be true - keyguardTransitionRepository.sendTransitionStep( - TransitionStep( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GONE, - value = 0.8f, - transitionState = TransitionState.RUNNING - ) + kosmos.setTransition( + sceneTransition = Transition(from = Scenes.Lockscreen, to = Scenes.Gone), + stateTransition = + TransitionStep( + from = LOCKSCREEN, + to = GONE, + value = 0.8f, + transitionState = TransitionState.RUNNING + ) ) assertThat(isOnLockscreen).isTrue() - keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.GONE, - to = KeyguardState.LOCKSCREEN, - testScope, + kosmos.setTransition( + sceneTransition = Idle(Scenes.Lockscreen), + stateTransition = + TransitionStep( + from = GONE, + to = LOCKSCREEN, + ) ) assertThat(isOnLockscreen).isTrue() - keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.PRIMARY_BOUNCER, - testScope, + kosmos.setTransition( + sceneTransition = Idle(Scenes.Bouncer), + stateTransition = + TransitionStep( + from = LOCKSCREEN, + to = PRIMARY_BOUNCER, + ) ) assertThat(isOnLockscreen).isTrue() } @@ -442,8 +487,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S shadeTestUtil.setLockscreenShadeExpansion(0f) shadeTestUtil.setQsExpansion(0f) keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.OCCLUDED, + from = LOCKSCREEN, + to = OCCLUDED, testScope, ) assertThat(isOnLockscreenWithoutShade).isFalse() @@ -480,11 +525,15 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S assertThat(isOnGlanceableHubWithoutShade).isFalse() // Move to glanceable hub - keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GLANCEABLE_HUB, - testScope = this + kosmos.setTransition( + sceneTransition = Idle(Scenes.Communal), + stateTransition = + TransitionStep( + from = LOCKSCREEN, + to = GLANCEABLE_HUB, + ) ) + assertThat(isOnGlanceableHubWithoutShade).isTrue() // While state is GLANCEABLE_HUB, validate variations of both shade and qs expansion @@ -502,6 +551,14 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S shadeTestUtil.setQsExpansion(0f) shadeTestUtil.setLockscreenShadeExpansion(0f) + kosmos.setTransition( + sceneTransition = Idle(Scenes.Communal), + stateTransition = + TransitionStep( + from = LOCKSCREEN, + to = GLANCEABLE_HUB, + ) + ) assertThat(isOnGlanceableHubWithoutShade).isTrue() } @@ -808,8 +865,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // GONE transition gets to 90% complete keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GONE, + from = LOCKSCREEN, + to = GONE, transitionState = TransitionState.STARTED, value = 0f, ) @@ -817,8 +874,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S runCurrent() keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GONE, + from = LOCKSCREEN, + to = GONE, transitionState = TransitionState.RUNNING, value = 0.9f, ) @@ -843,8 +900,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // OCCLUDED transition gets to 90% complete keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.OCCLUDED, + from = LOCKSCREEN, + to = OCCLUDED, transitionState = TransitionState.STARTED, value = 0f, ) @@ -852,8 +909,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S runCurrent() keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.OCCLUDED, + from = LOCKSCREEN, + to = OCCLUDED, transitionState = TransitionState.RUNNING, value = 0.9f, ) @@ -877,8 +934,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S showLockscreen() keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.GONE, + from = LOCKSCREEN, + to = GONE, testScope ) keyguardRepository.setStatusBarState(StatusBarState.SHADE) @@ -922,8 +979,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // ... then user hits power to go to AOD keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.AOD, + from = LOCKSCREEN, + to = AOD, testScope, ) // ... followed by a shade collapse @@ -945,7 +1002,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // PRIMARY_BOUNCER->GONE transition is started keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.PRIMARY_BOUNCER, + from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.STARTED, value = 0f, @@ -956,7 +1013,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // PRIMARY_BOUNCER->GONE transition running keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.PRIMARY_BOUNCER, + from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.RUNNING, value = 0.1f, @@ -967,7 +1024,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.PRIMARY_BOUNCER, + from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.RUNNING, value = 0.9f, @@ -979,7 +1036,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S hideCommunalScene() keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.PRIMARY_BOUNCER, + from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.FINISHED, value = 1f @@ -1003,7 +1060,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // PRIMARY_BOUNCER->GONE transition is started keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.PRIMARY_BOUNCER, + from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.STARTED, ) @@ -1013,7 +1070,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // PRIMARY_BOUNCER->GONE transition running keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.PRIMARY_BOUNCER, + from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.RUNNING, value = 0.1f, @@ -1024,7 +1081,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.PRIMARY_BOUNCER, + from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.RUNNING, value = 0.9f, @@ -1035,7 +1092,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.PRIMARY_BOUNCER, + from = PRIMARY_BOUNCER, to = GONE, transitionState = TransitionState.FINISHED, value = 1f @@ -1058,7 +1115,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // ALTERNATE_BOUNCER->GONE transition is started keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.ALTERNATE_BOUNCER, + from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.STARTED, value = 0f, @@ -1069,7 +1126,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // ALTERNATE_BOUNCER->GONE transition running keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.ALTERNATE_BOUNCER, + from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.RUNNING, value = 0.1f, @@ -1080,7 +1137,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.ALTERNATE_BOUNCER, + from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.RUNNING, value = 0.9f, @@ -1092,7 +1149,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S hideCommunalScene() keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.ALTERNATE_BOUNCER, + from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.FINISHED, value = 1f @@ -1116,7 +1173,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // ALTERNATE_BOUNCER->GONE transition is started keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.ALTERNATE_BOUNCER, + from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.STARTED, ) @@ -1126,7 +1183,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S // ALTERNATE_BOUNCER->GONE transition running keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.ALTERNATE_BOUNCER, + from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.RUNNING, value = 0.1f, @@ -1137,7 +1194,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.ALTERNATE_BOUNCER, + from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.RUNNING, value = 0.9f, @@ -1148,7 +1205,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardTransitionRepository.sendTransitionStep( TransitionStep( - from = KeyguardState.ALTERNATE_BOUNCER, + from = ALTERNATE_BOUNCER, to = GONE, transitionState = TransitionState.FINISHED, value = 1f @@ -1165,8 +1222,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD) runCurrent() keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.AOD, - to = KeyguardState.LOCKSCREEN, + from = AOD, + to = LOCKSCREEN, testScope, ) } @@ -1178,8 +1235,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardRepository.setDreaming(true) runCurrent() keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.DREAMING, + from = LOCKSCREEN, + to = DREAMING, testScope, ) } @@ -1191,8 +1248,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardRepository.setStatusBarState(StatusBarState.SHADE_LOCKED) runCurrent() keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.AOD, - to = KeyguardState.LOCKSCREEN, + from = AOD, + to = LOCKSCREEN, testScope, ) } @@ -1204,8 +1261,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S keyguardRepository.setStatusBarState(StatusBarState.SHADE_LOCKED) runCurrent() keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.AOD, - to = KeyguardState.LOCKSCREEN, + from = AOD, + to = LOCKSCREEN, testScope, ) } @@ -1219,8 +1276,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S kosmos.keyguardBouncerRepository.setPrimaryShow(true) runCurrent() keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.GLANCEABLE_HUB, - to = KeyguardState.PRIMARY_BOUNCER, + from = GLANCEABLE_HUB, + to = PRIMARY_BOUNCER, testScope, ) } @@ -1234,8 +1291,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S kosmos.keyguardBouncerRepository.setPrimaryShow(false) runCurrent() keyguardTransitionRepository.sendTransitionSteps( - from = KeyguardState.GLANCEABLE_HUB, - to = KeyguardState.ALTERNATE_BOUNCER, + from = GLANCEABLE_HUB, + to = ALTERNATE_BOUNCER, testScope, ) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt index 6ff369ec8711..cc413cd1a6de 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt @@ -29,7 +29,10 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER import com.android.systemui.keyguard.shared.model.KeyguardState.AOD import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING +import com.android.systemui.keyguard.shared.model.KeyguardState.GONE import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN +import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED +import com.android.systemui.keyguard.shared.model.KeyguardState.OFF import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER import com.android.systemui.keyguard.shared.model.KeyguardState.UNDEFINED import com.android.systemui.keyguard.shared.model.TransitionState @@ -126,8 +129,10 @@ constructor( repository.transitions .filter { it.transitionState != TransitionState.CANCELED } .collect { step -> - getTransitionValueFlow(step.from).emit(1f - step.value) - getTransitionValueFlow(step.to).emit(step.value) + val value = + if (step.transitionState == TransitionState.FINISHED) 1f else step.value + getTransitionValueFlow(step.from).emit(1f - value) + getTransitionValueFlow(step.to).emit(value) } } @@ -183,8 +188,14 @@ constructor( } } - fun transition(edge: Edge, edgeWithoutSceneContainer: Edge): Flow<TransitionStep> { - return transition(if (SceneContainerFlag.isEnabled) edge else edgeWithoutSceneContainer) + fun transition(edge: Edge, edgeWithoutSceneContainer: Edge? = null): Flow<TransitionStep> { + return transition( + if (SceneContainerFlag.isEnabled || edgeWithoutSceneContainer == null) { + edge + } else { + edgeWithoutSceneContainer + } + ) } /** Given an [edge], return a Flow to collect only relevant [TransitionStep]s. */ @@ -250,10 +261,10 @@ constructor( } fun transitionValue( - scene: SceneKey, + scene: SceneKey? = null, stateWithoutSceneContainer: KeyguardState, ): Flow<Float> { - return if (SceneContainerFlag.isEnabled) { + return if (SceneContainerFlag.isEnabled && scene != null) { sceneInteractor.transitionProgress(scene) } else { transitionValue(stateWithoutSceneContainer) @@ -410,7 +421,7 @@ constructor( } } .distinctUntilChanged() - .stateIn(scope, SharingStarted.Eagerly, KeyguardState.OFF) + .stateIn(scope, SharingStarted.Eagerly, OFF) val isInTransition = combine( @@ -438,8 +449,8 @@ constructor( fromAlternateBouncerTransitionInteractor.get().dismissAlternateBouncer() AOD -> fromAodTransitionInteractor.get().dismissAod() DOZING -> fromDozingTransitionInteractor.get().dismissFromDozing() - KeyguardState.OCCLUDED -> fromOccludedTransitionInteractor.get().dismissFromOccluded() - KeyguardState.GONE -> + OCCLUDED -> fromOccludedTransitionInteractor.get().dismissFromOccluded() + GONE -> Log.i( TAG, "Already transitioning to GONE; ignoring startDismissKeyguardTransition." diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt index f63ee7b9520d..aed00d8cd5be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt @@ -20,6 +20,7 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import androidx.annotation.VisibleForTesting +import com.android.compose.animation.scene.SceneKey import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor import com.android.systemui.dagger.SysUISingleton @@ -141,10 +142,6 @@ constructor( private val communalSceneInteractor: CommunalSceneInteractor, unfoldTransitionInteractor: UnfoldTransitionInteractor, ) : FlowDumperImpl(dumpManager) { - // TODO(b/349784682): Transform deprecated states for Flexiglass - private val statesForConstrainedNotifications: Set<KeyguardState> = - setOf(AOD, LOCKSCREEN, DOZING, ALTERNATE_BOUNCER, PRIMARY_BOUNCER) - private val statesForHiddenKeyguard: Set<KeyguardState> = setOf(GONE, OCCLUDED) /** * Is either shade/qs expanded? This intentionally does not use the [ShadeInteractor] version, @@ -217,14 +214,16 @@ constructor( /** If the user is visually on one of the unoccluded lockscreen states. */ val isOnLockscreen: Flow<Boolean> = - combine( - keyguardTransitionInteractor.finishedKeyguardState.map { - statesForConstrainedNotifications.contains(it) - }, + anyOf( + keyguardTransitionInteractor.isFinishedIn(AOD), + keyguardTransitionInteractor.isFinishedIn(DOZING), + keyguardTransitionInteractor.isFinishedIn(ALTERNATE_BOUNCER), + keyguardTransitionInteractor.isFinishedIn( + scene = Scenes.Bouncer, + stateWithoutSceneContainer = PRIMARY_BOUNCER + ), keyguardTransitionInteractor.transitionValue(LOCKSCREEN).map { it > 0f }, - ) { constrainedNotificationState, transitioningToOrFromLockscreen -> - constrainedNotificationState || transitioningToOrFromLockscreen - } + ) .stateIn( scope = applicationScope, started = SharingStarted.Eagerly, @@ -250,9 +249,10 @@ constructor( /** If the user is visually on the glanceable hub or transitioning to/from it */ private val isOnGlanceableHub: Flow<Boolean> = combine( - keyguardTransitionInteractor.finishedKeyguardState.map { state -> - state == GLANCEABLE_HUB - }, + keyguardTransitionInteractor.isFinishedIn( + scene = Scenes.Communal, + stateWithoutSceneContainer = GLANCEABLE_HUB + ), anyOf( keyguardTransitionInteractor.isInTransition( edge = Edge.create(to = Scenes.Communal), @@ -424,32 +424,19 @@ constructor( .onStart { emit(1f) } .dumpWhileCollecting("alphaForShadeAndQsExpansion") - private fun toFlowArray( - states: Set<KeyguardState>, - flow: (KeyguardState) -> Flow<Boolean> - ): Array<Flow<Boolean>> { - return states.map { flow(it) }.toTypedArray() - } - private val isTransitioningToHiddenKeyguard: Flow<Boolean> = flow { while (currentCoroutineContext().isActive) { emit(false) // Ensure states are inactive to start - allOf( - *toFlowArray(statesForHiddenKeyguard) { state -> - keyguardTransitionInteractor.transitionValue(state).map { it == 0f } - } - ) - .first { it } + allOf(isNotOnState(OCCLUDED), isNotOnState(GONE, Scenes.Gone)).first { it } // Wait for a qualifying transition to begin anyOf( - *toFlowArray(statesForHiddenKeyguard) { state -> - keyguardTransitionInteractor - .transition(Edge.create(to = state)) - .map { it.value > 0f && it.transitionState == RUNNING } - .onStart { emit(false) } - } + transitionToIsRunning(Edge.create(to = OCCLUDED)), + transitionToIsRunning( + edge = Edge.create(to = Scenes.Gone), + edgeWithoutSceneContainer = Edge.create(to = GONE) + ) ) .first { it } emit(true) @@ -458,13 +445,7 @@ constructor( // it is considered safe to reset alpha to 1f for HUNs. combine( keyguardInteractor.statusBarState, - allOf( - *toFlowArray(statesForHiddenKeyguard) { state -> - keyguardTransitionInteractor.transitionValue(state).map { - it == 0f - } - } - ) + allOf(isNotOnState(OCCLUDED), isNotOnState(GONE, Scenes.Gone)) ) { statusBarState, stateIsReversed -> statusBarState == SHADE || stateIsReversed } @@ -473,6 +454,17 @@ constructor( } .dumpWhileCollecting("isTransitioningToHiddenKeyguard") + private fun isNotOnState(stateWithoutSceneContainer: KeyguardState, scene: SceneKey? = null) = + keyguardTransitionInteractor + .transitionValue(scene = scene, stateWithoutSceneContainer = stateWithoutSceneContainer) + .map { it == 0f } + + private fun transitionToIsRunning(edge: Edge, edgeWithoutSceneContainer: Edge? = null) = + keyguardTransitionInteractor + .transition(edge = edge, edgeWithoutSceneContainer = edgeWithoutSceneContainer) + .map { it.value > 0f && it.transitionState == RUNNING } + .onStart { emit(false) } + val panelAlpha = keyguardInteractor.panelAlpha private fun bouncerToGoneNotificationAlpha(viewState: ViewStateAccessor): Flow<Float> = diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt index 616f2b688746..a73c184a1ba8 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt @@ -102,6 +102,45 @@ class FakeKeyguardTransitionRepository( } /** + * Sends the provided [step] and makes sure that all previous [TransitionState]'s are sent when + * [fillInSteps] is true. e.g. when a step FINISHED is provided, a step with STARTED and RUNNING + * is also sent. + */ + suspend fun sendTransitionSteps( + step: TransitionStep, + testScope: TestScope, + fillInSteps: Boolean = true, + ) { + if (fillInSteps && step.transitionState != TransitionState.STARTED) { + sendTransitionStep( + step = + TransitionStep( + transitionState = TransitionState.STARTED, + from = step.from, + to = step.to, + value = 0f, + ) + ) + testScope.testScheduler.runCurrent() + + if (step.transitionState != TransitionState.RUNNING) { + sendTransitionStep( + step = + TransitionStep( + transitionState = TransitionState.RUNNING, + from = step.from, + to = step.to, + value = 0.6f, + ) + ) + testScope.testScheduler.runCurrent() + } + } + sendTransitionStep(step = step) + testScope.testScheduler.runCurrent() + } + + /** * Sends TransitionSteps between [from] and [to], calling [runCurrent] after each step. * * By default, sends steps through FINISHED (STARTED, RUNNING, FINISHED) but can be halted part diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryUtil.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryUtil.kt index 53d3c0121b1f..59f2b9412413 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryUtil.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryUtil.kt @@ -19,6 +19,7 @@ package com.android.systemui.scene.data.repository import com.android.compose.animation.scene.ObservableTransitionState import com.android.compose.animation.scene.SceneKey import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository +import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionStep import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope @@ -36,20 +37,26 @@ private val mutableTransitionState = suspend fun Kosmos.setTransition( sceneTransition: ObservableTransitionState, stateTransition: TransitionStep? = null, + fillInStateSteps: Boolean = true, scope: TestScope = testScope, repository: SceneContainerRepository = sceneContainerRepository ) { + var state: TransitionStep? = stateTransition if (SceneContainerFlag.isEnabled) { setSceneTransition(sceneTransition, scope, repository) - } else { - if (stateTransition == null) throw IllegalArgumentException("No transitionStep provided") - fakeKeyguardTransitionRepository.sendTransitionSteps( - from = stateTransition.from, - to = stateTransition.to, - testScope = scope, - throughTransitionState = stateTransition.transitionState - ) + + if (state != null) { + state = getStateWithUndefined(sceneTransition, state) + } } + + if (state == null) return + fakeKeyguardTransitionRepository.sendTransitionSteps( + step = state, + testScope = scope, + fillInSteps = fillInStateSteps, + ) + scope.testScheduler.runCurrent() } fun Kosmos.setSceneTransition( @@ -59,7 +66,7 @@ fun Kosmos.setSceneTransition( ) { repository.setTransitionState(mutableTransitionState) mutableTransitionState.value = transition - scope.runCurrent() + scope.testScheduler.runCurrent() } fun Transition( @@ -87,3 +94,43 @@ fun Transition( fun Idle(currentScene: SceneKey): ObservableTransitionState.Idle { return ObservableTransitionState.Idle(currentScene) } + +private fun getStateWithUndefined( + sceneTransition: ObservableTransitionState, + state: TransitionStep +): TransitionStep { + return when (sceneTransition) { + is ObservableTransitionState.Idle -> { + TransitionStep( + from = state.from, + to = + if (sceneTransition.currentScene != Scenes.Lockscreen) { + KeyguardState.UNDEFINED + } else { + state.to + }, + value = state.value, + transitionState = state.transitionState + ) + } + is ObservableTransitionState.Transition -> { + TransitionStep( + from = + if (sceneTransition.fromScene != Scenes.Lockscreen) { + KeyguardState.UNDEFINED + } else { + state.from + }, + to = + if (sceneTransition.toScene != Scenes.Lockscreen) { + KeyguardState.UNDEFINED + } else { + state.from + }, + value = state.value, + transitionState = state.transitionState + ) + } + else -> state + } +} |