summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andreas Miko <amiko@google.com> 2024-08-14 19:56:41 +0200
committer Andreas Miko <amiko@google.com> 2024-08-28 14:57:35 +0200
commit5cce2ad0f10d8df5c29f4565bb25fcd2f042803a (patch)
treea7f900d757dd53fd62f53cabed6b1839ee39c68b
parent7fec56e0fd1378bcce5a0d237d96ee5da77e0727 (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
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/ObservableTransitionState.kt2
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt273
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt72
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt39
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/scene/data/repository/SceneContainerRepositoryUtil.kt65
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
+ }
+}