Loading packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt +26 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnable import com.android.systemui.communal.shared.model.CommunalScenes import com.android.systemui.coroutines.collectValues import com.android.systemui.flags.DisableSceneContainer import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository Loading Loading @@ -247,6 +248,31 @@ class FromPrimaryBouncerTransitionInteractorTest(flags: FlagsParameterization) : ) } @Test fun testTransitionToDreaming() = kosmos.runTest { underTest.start() bouncerRepository.setPrimaryShow(true) transitionRepository.sendTransitionSteps( from = KeyguardState.LOCKSCREEN, to = KeyguardState.PRIMARY_BOUNCER, testScope, ) reset(transitionRepository) // Dream shows up. fakeKeyguardRepository.setDreaming(true) runCurrent() // Dream transition starts. assertThat(transitionRepository) .startedTransition( from = KeyguardState.PRIMARY_BOUNCER, to = KeyguardState.DREAMING, ) } @Test @EnableFlags(FLAG_GLANCEABLE_HUB_V2) fun testTransitionToDozing_bouncerShowingOnTopOfGlanceableHub() = Loading packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerViewBinder.kt +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToDreamingTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.log.BouncerLogger import com.android.systemui.user.domain.interactor.SelectedUserInteractor Loading @@ -33,6 +34,7 @@ data class LegacyBouncerDependencies constructor( @Main val mainDispatcher: CoroutineDispatcher, val viewModel: KeyguardBouncerViewModel, val primaryBouncerToDreamingTransitionViewModel: PrimaryBouncerToDreamingTransitionViewModel, val primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel, val glanceableHubToPrimaryBouncerTransitionViewModel: GlanceableHubToPrimaryBouncerTransitionViewModel, Loading Loading @@ -88,6 +90,7 @@ constructor( deps.mainDispatcher, view, deps.viewModel, deps.primaryBouncerToDreamingTransitionViewModel, deps.primaryBouncerToGoneTransitionViewModel, deps.glanceableHubToPrimaryBouncerTransitionViewModel, deps.componentFactory, Loading packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt +8 −3 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.EX import com.android.systemui.bouncer.ui.BouncerViewDelegate import com.android.systemui.bouncer.ui.viewmodel.KeyguardBouncerViewModel import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToDreamingTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.log.BouncerLogger Loading @@ -42,6 +43,7 @@ import com.android.systemui.plugins.AuthContextPlugin import com.android.systemui.user.domain.interactor.SelectedUserInteractor import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.merge /** Binds the bouncer container to its view model. */ object KeyguardBouncerViewBinder { Loading @@ -50,6 +52,7 @@ object KeyguardBouncerViewBinder { mainImmediateDispatcher: CoroutineDispatcher, view: ViewGroup, viewModel: KeyguardBouncerViewModel, primaryBouncerToDreamingTransitionViewModel: PrimaryBouncerToDreamingTransitionViewModel, primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel, glanceableHubToPrimaryBouncerTransitionViewModel: GlanceableHubToPrimaryBouncerTransitionViewModel, Loading Loading @@ -131,9 +134,11 @@ object KeyguardBouncerViewBinder { } launch { primaryBouncerToGoneTransitionViewModel.bouncerAlpha.collect { alpha -> securityContainerController.setAlpha(alpha) } merge( primaryBouncerToDreamingTransitionViewModel.bouncerAlpha, primaryBouncerToGoneTransitionViewModel.bouncerAlpha, ) .collect { alpha -> securityContainerController.setAlpha(alpha) } } launch { Loading packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt +21 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ constructor( ) { override fun start() { listenForBouncerToDreaming() listenForPrimaryBouncerToGone() listenForPrimaryBouncerToAsleep() listenForPrimaryBouncerNotShowing() Loading Loading @@ -102,6 +103,26 @@ constructor( } } /** * The dream can start underneath the bouncer if the user presses the power button or the screen * times out while their "When to show" condition for dreams is active. Since the dream is an * activity that starts under the bouncer, we want to start the transition to dreaming * immediately so that we can fade the bouncer away as it starts. */ private fun listenForBouncerToDreaming() { scope.launch { keyguardInteractor.isDreaming .filterRelevantKeyguardStateAnd { isDreaming -> isDreaming } .collect { if (!communalSceneInteractor.isIdleOnCommunal.value) { // If the widgets on lockscreen feature is showing underneath the bouncer, // don't start the dream transition as the dream is not visible. startTransitionTo(KeyguardState.DREAMING) } } } } private fun listenForPrimaryBouncerNotShowing() { if (SceneContainerFlag.isEnabled) return if (KeyguardWmStateRefactor.isEnabled) { Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDreamingTransitionViewModel.kt +10 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,16 @@ constructor(blurConfig: BlurConfig, animationFlow: KeyguardTransitionAnimationFl ) .setupWithoutSceneContainer(edge = Edge.create(from = PRIMARY_BOUNCER, to = DREAMING)) /** * Bouncer container alpha. The dream starts underneath the bouncer so we want to fade the * bouncer away as the dream launches. */ val bouncerAlpha: Flow<Float> = transitionAnimation.sharedFlow( duration = FromPrimaryBouncerTransitionInteractor.TO_DREAMING_DURATION, onStep = { 1f - it }, ) override val windowBlurRadius: Flow<Float> = transitionAnimation.sharedFlowWithShade( onStep = { progress, isShadeExpanded -> Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt +26 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.communal.domain.interactor.setCommunalV2ConfigEnable import com.android.systemui.communal.shared.model.CommunalScenes import com.android.systemui.coroutines.collectValues import com.android.systemui.flags.DisableSceneContainer import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepositorySpy import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository Loading Loading @@ -247,6 +248,31 @@ class FromPrimaryBouncerTransitionInteractorTest(flags: FlagsParameterization) : ) } @Test fun testTransitionToDreaming() = kosmos.runTest { underTest.start() bouncerRepository.setPrimaryShow(true) transitionRepository.sendTransitionSteps( from = KeyguardState.LOCKSCREEN, to = KeyguardState.PRIMARY_BOUNCER, testScope, ) reset(transitionRepository) // Dream shows up. fakeKeyguardRepository.setDreaming(true) runCurrent() // Dream transition starts. assertThat(transitionRepository) .startedTransition( from = KeyguardState.PRIMARY_BOUNCER, to = KeyguardState.DREAMING, ) } @Test @EnableFlags(FLAG_GLANCEABLE_HUB_V2) fun testTransitionToDozing_bouncerShowingOnTopOfGlanceableHub() = Loading
packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerViewBinder.kt +3 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToDreamingTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.log.BouncerLogger import com.android.systemui.user.domain.interactor.SelectedUserInteractor Loading @@ -33,6 +34,7 @@ data class LegacyBouncerDependencies constructor( @Main val mainDispatcher: CoroutineDispatcher, val viewModel: KeyguardBouncerViewModel, val primaryBouncerToDreamingTransitionViewModel: PrimaryBouncerToDreamingTransitionViewModel, val primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel, val glanceableHubToPrimaryBouncerTransitionViewModel: GlanceableHubToPrimaryBouncerTransitionViewModel, Loading Loading @@ -88,6 +90,7 @@ constructor( deps.mainDispatcher, view, deps.viewModel, deps.primaryBouncerToDreamingTransitionViewModel, deps.primaryBouncerToGoneTransitionViewModel, deps.glanceableHubToPrimaryBouncerTransitionViewModel, deps.componentFactory, Loading
packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt +8 −3 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.EX import com.android.systemui.bouncer.ui.BouncerViewDelegate import com.android.systemui.bouncer.ui.viewmodel.KeyguardBouncerViewModel import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToPrimaryBouncerTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToDreamingTransitionViewModel import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.log.BouncerLogger Loading @@ -42,6 +43,7 @@ import com.android.systemui.plugins.AuthContextPlugin import com.android.systemui.user.domain.interactor.SelectedUserInteractor import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.merge /** Binds the bouncer container to its view model. */ object KeyguardBouncerViewBinder { Loading @@ -50,6 +52,7 @@ object KeyguardBouncerViewBinder { mainImmediateDispatcher: CoroutineDispatcher, view: ViewGroup, viewModel: KeyguardBouncerViewModel, primaryBouncerToDreamingTransitionViewModel: PrimaryBouncerToDreamingTransitionViewModel, primaryBouncerToGoneTransitionViewModel: PrimaryBouncerToGoneTransitionViewModel, glanceableHubToPrimaryBouncerTransitionViewModel: GlanceableHubToPrimaryBouncerTransitionViewModel, Loading Loading @@ -131,9 +134,11 @@ object KeyguardBouncerViewBinder { } launch { primaryBouncerToGoneTransitionViewModel.bouncerAlpha.collect { alpha -> securityContainerController.setAlpha(alpha) } merge( primaryBouncerToDreamingTransitionViewModel.bouncerAlpha, primaryBouncerToGoneTransitionViewModel.bouncerAlpha, ) .collect { alpha -> securityContainerController.setAlpha(alpha) } } launch { Loading
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt +21 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ constructor( ) { override fun start() { listenForBouncerToDreaming() listenForPrimaryBouncerToGone() listenForPrimaryBouncerToAsleep() listenForPrimaryBouncerNotShowing() Loading Loading @@ -102,6 +103,26 @@ constructor( } } /** * The dream can start underneath the bouncer if the user presses the power button or the screen * times out while their "When to show" condition for dreams is active. Since the dream is an * activity that starts under the bouncer, we want to start the transition to dreaming * immediately so that we can fade the bouncer away as it starts. */ private fun listenForBouncerToDreaming() { scope.launch { keyguardInteractor.isDreaming .filterRelevantKeyguardStateAnd { isDreaming -> isDreaming } .collect { if (!communalSceneInteractor.isIdleOnCommunal.value) { // If the widgets on lockscreen feature is showing underneath the bouncer, // don't start the dream transition as the dream is not visible. startTransitionTo(KeyguardState.DREAMING) } } } } private fun listenForPrimaryBouncerNotShowing() { if (SceneContainerFlag.isEnabled) return if (KeyguardWmStateRefactor.isEnabled) { Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToDreamingTransitionViewModel.kt +10 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,16 @@ constructor(blurConfig: BlurConfig, animationFlow: KeyguardTransitionAnimationFl ) .setupWithoutSceneContainer(edge = Edge.create(from = PRIMARY_BOUNCER, to = DREAMING)) /** * Bouncer container alpha. The dream starts underneath the bouncer so we want to fade the * bouncer away as the dream launches. */ val bouncerAlpha: Flow<Float> = transitionAnimation.sharedFlow( duration = FromPrimaryBouncerTransitionInteractor.TO_DREAMING_DURATION, onStep = { 1f - it }, ) override val windowBlurRadius: Flow<Float> = transitionAnimation.sharedFlowWithShade( onStep = { progress, isShadeExpanded -> Loading