diff options
5 files changed, 74 insertions, 2 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt index ad2ae8b41af9..e6b30176d3ee 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt @@ -20,6 +20,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.bouncer.domain.interactor.mockPrimaryBouncerInteractor +import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectValues import com.android.systemui.flags.Flags import com.android.systemui.flags.fakeFeatureFlagsClassic @@ -149,6 +150,38 @@ class BouncerToGoneFlowsTest : SysuiTestCase() { } @Test + fun showAllNotifications_isTrue_whenLeaveShadeOpen() = + testScope.runTest { + val showAllNotifications by + collectLastValue(underTest.showAllNotifications(500.milliseconds, PRIMARY_BOUNCER)) + + sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(true) + + keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED)) + keyguardTransitionRepository.sendTransitionStep(step(0.1f)) + + assertThat(showAllNotifications).isTrue() + keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED)) + assertThat(showAllNotifications).isFalse() + } + + @Test + fun showAllNotifications_isFalse_whenLeaveShadeIsNotOpen() = + testScope.runTest { + val showAllNotifications by + collectLastValue(underTest.showAllNotifications(500.milliseconds, PRIMARY_BOUNCER)) + + sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(false) + + keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED)) + keyguardTransitionRepository.sendTransitionStep(step(0.1f)) + + assertThat(showAllNotifications).isFalse() + keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED)) + assertThat(showAllNotifications).isFalse() + } + + @Test fun scrimBehindAlpha_doNotLeaveShadeOpen() = testScope.runTest { val values by collectValues(underTest.scrimAlpha(500.milliseconds, PRIMARY_BOUNCER)) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModel.kt index c921fa7d7a19..8c6be989d8d9 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToGoneTransitionViewModel.kt @@ -81,6 +81,10 @@ constructor( ) } + /** See [BouncerToGoneFlows#showAllNotifications] */ + val showAllNotifications: Flow<Boolean> = + bouncerToGoneFlows.showAllNotifications(TO_GONE_DURATION, ALTERNATE_BOUNCER) + /** Scrim alpha values */ val scrimAlpha: Flow<ScrimAlpha> = bouncerToGoneFlows.scrimAlpha(TO_GONE_DURATION, ALTERNATE_BOUNCER) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt index 924fc5d0333f..fe88b8169c89 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt @@ -32,6 +32,7 @@ import javax.inject.Inject import kotlin.time.Duration import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map @@ -63,6 +64,31 @@ constructor( } } + /** + * When the shade is expanded, make sure that all notifications can be seen immediately during a + * transition to GONE. This matters especially when the user has chosen to not show + * notifications on the lockscreen and then pulls down the shade, which presents them with an + * immediate auth prompt, followed by a notification animation. + */ + fun showAllNotifications(duration: Duration, from: KeyguardState): Flow<Boolean> { + var leaveShadeOpen = false + return animationFlow + .setup( + duration = duration, + from = from, + to = GONE, + ) + .sharedFlow( + duration = duration, + onStart = { leaveShadeOpen = statusBarStateController.leaveOpenOnKeyguardHide() }, + onStep = { if (leaveShadeOpen) 1f else 0f }, + onFinish = { 0f }, + onCancel = { 0f }, + ) + .map { it == 1f } + .distinctUntilChanged() + } + private fun createScrimAlphaFlow( duration: Duration, fromState: KeyguardState, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt index 53f448826e80..05878265dd6d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt @@ -60,6 +60,10 @@ constructor( private var leaveShadeOpen: Boolean = false private var willRunDismissFromKeyguard: Boolean = false + /** See [BouncerToGoneFlows#showAllNotifications] */ + val showAllNotifications: Flow<Boolean> = + bouncerToGoneFlows.showAllNotifications(TO_GONE_DURATION, PRIMARY_BOUNCER) + val notificationAlpha: Flow<Float> = transitionAnimation.sharedFlow( duration = 200.milliseconds, 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 725c15333b04..9f576066cc98 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 @@ -589,8 +589,13 @@ constructor( combine( isOnLockscreen, keyguardInteractor.statusBarState, - ) { isOnLockscreen, statusBarState -> - statusBarState == SHADE_LOCKED || !isOnLockscreen + merge( + primaryBouncerToGoneTransitionViewModel.showAllNotifications, + alternateBouncerToGoneTransitionViewModel.showAllNotifications, + ) + .onStart { emit(false) } + ) { isOnLockscreen, statusBarState, showAllNotifications -> + statusBarState == SHADE_LOCKED || !isOnLockscreen || showAllNotifications } return combineTransform( |