diff options
| author | 2024-05-16 16:14:55 +0000 | |
|---|---|---|
| committer | 2024-05-16 16:14:55 +0000 | |
| commit | 872822907e5de1b76ce304e718a82ea658ed0ec7 (patch) | |
| tree | ef83f27c90ea1436914596b91c89872a25a13ca9 | |
| parent | 0f12dc4cbb11f485378d27a7ccf2bf340787f9a9 (diff) | |
| parent | 9d805ddacb6cf9c1a43cff1be71dcf7da081ecc1 (diff) | |
Merge "Don't listen for alternateBouncerChanges if unnecessary" into main
2 files changed, 115 insertions, 14 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModel.kt index 5cf100e78e6e..4128c529644d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModel.kt @@ -34,8 +34,8 @@ constructor( alternateBouncerInteractor: AlternateBouncerInteractor, keyguardTransitionInteractor: KeyguardTransitionInteractor, ) { - private val deviceSupportsAlternateBouncer: Flow<Boolean> = - alternateBouncerInteractor.alternateBouncerSupported + val canShowAlternateBouncer: Flow<Boolean> = alternateBouncerInteractor.canShowAlternateBouncer + private val isTransitioningToOrFromOrShowingAlternateBouncer: Flow<Boolean> = keyguardTransitionInteractor .transitionValue(KeyguardState.ALTERNATE_BOUNCER) @@ -43,8 +43,8 @@ constructor( .distinctUntilChanged() val alternateBouncerWindowRequired: Flow<Boolean> = - deviceSupportsAlternateBouncer.flatMapLatest { deviceSupportsAlternateBouncer -> - if (deviceSupportsAlternateBouncer) { + canShowAlternateBouncer.flatMapLatest { canShowAlternateBouncer -> + if (canShowAlternateBouncer) { isTransitioningToOrFromOrShowingAlternateBouncer } else { flowOf(false) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelTest.kt index 1396b20a800d..391831a61579 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerWindowViewModelTest.kt @@ -18,15 +18,19 @@ package com.android.systemui.keyguard.ui.viewmodel import androidx.test.filters.SmallTest +import com.android.keyguard.keyguardUpdateMonitor import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.data.repository.fakeFingerprintPropertyRepository +import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.keyguard.data.repository.fakeBiometricSettingsRepository 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.statusbar.policy.keyguardStateController import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -34,6 +38,7 @@ import kotlinx.coroutines.test.runTest import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 +import org.mockito.kotlin.whenever @ExperimentalCoroutinesApi @RunWith(JUnit4::class) @@ -49,13 +54,35 @@ class AlternateBouncerWindowViewModelTest : SysuiTestCase() { fun alternateBouncerTransition_alternateBouncerWindowRequiredTrue() = testScope.runTest { mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) + val canShowAlternateBouncer by collectLastValue(underTest.canShowAlternateBouncer) val alternateBouncerWindowRequired by collectLastValue(underTest.alternateBouncerWindowRequired) + givenCanShowAlternateBouncer() fingerprintPropertyRepository.supportsUdfps() transitionRepository.sendTransitionSteps( listOf( + stepToLockscreen(0f, TransitionState.STARTED), + stepToLockscreen(.4f), + stepToLockscreen(1f, TransitionState.FINISHED), + ), + testScope, + ) + assertThat(canShowAlternateBouncer).isTrue() + transitionRepository.sendTransitionSteps( + listOf( + stepFromLockscreenToAlternateBouncer(0f, TransitionState.STARTED), + stepFromLockscreenToAlternateBouncer(.4f), + stepFromLockscreenToAlternateBouncer(.6f), + ), + testScope, + ) + assertThat(canShowAlternateBouncer).isTrue() + assertThat(alternateBouncerWindowRequired).isTrue() + + transitionRepository.sendTransitionSteps( + listOf( stepFromAlternateBouncer(0f, TransitionState.STARTED), - stepFromAlternateBouncer(.4f), + stepFromAlternateBouncer(.2f), stepFromAlternateBouncer(.6f), ), testScope, @@ -77,13 +104,21 @@ class AlternateBouncerWindowViewModelTest : SysuiTestCase() { mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) val alternateBouncerWindowRequired by collectLastValue(underTest.alternateBouncerWindowRequired) + givenCanShowAlternateBouncer() fingerprintPropertyRepository.supportsUdfps() transitionRepository.sendTransitionSteps( listOf( - stepFromAlternateBouncer(0f, TransitionState.STARTED), - stepFromAlternateBouncer(.4f), - stepFromAlternateBouncer(.6f), - stepFromAlternateBouncer(1f), + stepToLockscreen(0f, TransitionState.STARTED), + stepToLockscreen(.4f), + stepToLockscreen(1f, TransitionState.FINISHED), + ), + testScope, + ) + transitionRepository.sendTransitionSteps( + listOf( + stepFromLockscreenToAlternateBouncer(0f, TransitionState.STARTED), + stepFromLockscreenToAlternateBouncer(.4f), + stepFromLockscreenToAlternateBouncer(.6f), ), testScope, ) @@ -96,13 +131,23 @@ class AlternateBouncerWindowViewModelTest : SysuiTestCase() { mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) val alternateBouncerWindowRequired by collectLastValue(underTest.alternateBouncerWindowRequired) + givenCanShowAlternateBouncer() fingerprintPropertyRepository.supportsUdfps() transitionRepository.sendTransitionSteps( listOf( + stepFromLockscreenToDozing(0f, TransitionState.STARTED), + stepFromLockscreenToDozing(.4f), + stepFromLockscreenToDozing(.6f), + stepFromLockscreenToDozing(1f, TransitionState.FINISHED), + ), + testScope, + ) + assertThat(alternateBouncerWindowRequired).isFalse() + transitionRepository.sendTransitionSteps( + listOf( stepFromDozingToLockscreen(0f, TransitionState.STARTED), stepFromDozingToLockscreen(.4f), stepFromDozingToLockscreen(.6f), - stepFromDozingToLockscreen(1f), ), testScope, ) @@ -115,19 +160,39 @@ class AlternateBouncerWindowViewModelTest : SysuiTestCase() { mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) val alternateBouncerWindowRequired by collectLastValue(underTest.alternateBouncerWindowRequired) + givenCanShowAlternateBouncer() fingerprintPropertyRepository.supportsRearFps() transitionRepository.sendTransitionSteps( listOf( - stepFromAlternateBouncer(0f, TransitionState.STARTED), - stepFromAlternateBouncer(.4f), - stepFromAlternateBouncer(.6f), - stepFromAlternateBouncer(1f), + stepToLockscreen(0f, TransitionState.STARTED), + stepToLockscreen(.4f), + stepToLockscreen(1f, TransitionState.FINISHED), + ), + testScope, + ) + transitionRepository.sendTransitionSteps( + listOf( + stepFromLockscreenToAlternateBouncer(0f, TransitionState.STARTED), + stepFromLockscreenToAlternateBouncer(.4f), + stepFromLockscreenToAlternateBouncer(.6f), ), testScope, ) assertThat(alternateBouncerWindowRequired).isFalse() } + private fun stepToLockscreen( + value: Float, + state: TransitionState = TransitionState.RUNNING + ): TransitionStep { + return step( + from = KeyguardState.GONE, + to = KeyguardState.LOCKSCREEN, + value = value, + transitionState = state, + ) + } + private fun stepFromAlternateBouncer( value: Float, state: TransitionState = TransitionState.RUNNING @@ -140,6 +205,18 @@ class AlternateBouncerWindowViewModelTest : SysuiTestCase() { ) } + private fun stepFromLockscreenToAlternateBouncer( + value: Float, + state: TransitionState = TransitionState.RUNNING + ): TransitionStep { + return step( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.ALTERNATE_BOUNCER, + value = value, + transitionState = state, + ) + } + private fun stepFromDozingToLockscreen( value: Float, state: TransitionState = TransitionState.RUNNING @@ -152,6 +229,18 @@ class AlternateBouncerWindowViewModelTest : SysuiTestCase() { ) } + private fun stepFromLockscreenToDozing( + value: Float, + state: TransitionState = TransitionState.RUNNING + ): TransitionStep { + return step( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.DOZING, + value = value, + transitionState = state, + ) + } + private fun step( from: KeyguardState, to: KeyguardState, @@ -166,4 +255,16 @@ class AlternateBouncerWindowViewModelTest : SysuiTestCase() { ownerName = "AlternateBouncerViewModelTest" ) } + + /** + * Given the alternate bouncer parameters are set so that the alternate bouncer can show, aside + * from the fingerprint modality. + */ + private fun givenCanShowAlternateBouncer() { + kosmos.fakeKeyguardBouncerRepository.setPrimaryShow(false) + kosmos.fakeBiometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true) + kosmos.fakeBiometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true) + whenever(kosmos.keyguardUpdateMonitor.isFingerprintLockedOut).thenReturn(false) + whenever(kosmos.keyguardStateController.isUnlocked).thenReturn(false) + } } |