Loading packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractorTest.kt +30 −2 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import androidx.test.filters.SmallTest import com.android.internal.widget.LockPatternUtils import com.android.keyguard.KeyguardSecurityModel import com.android.keyguard.KeyguardSecurityModel.SecurityMode.PIN import com.android.keyguard.KeyguardSecurityModel.SecurityMode.Pattern import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.Flags import com.android.systemui.SysuiTestCase Loading Loading @@ -88,7 +89,9 @@ class BouncerMessageInteractorTest : SysuiTestCase() { overrideResource(kg_trust_agent_disabled, "Trust agent is unavailable") } suspend fun TestScope.init() { suspend fun TestScope.init( fingerprintAuthCurrentlyAllowed: Boolean = true, ) { kosmos.fakeUserRepository.setSelectedUserInfo(PRIMARY_USER) mSetFlagsRule.enableFlags(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES) underTest = Loading @@ -107,13 +110,38 @@ class BouncerMessageInteractorTest : SysuiTestCase() { faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository, securityModel = securityModel ) biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true) biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed( fingerprintAuthCurrentlyAllowed ) kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false) kosmos.fakeFingerprintPropertyRepository.supportsSideFps() kosmos.fakeKeyguardBouncerRepository.setPrimaryShow(true) runCurrent() } @Test fun initialMessage_pin() = testScope.runTest { init(fingerprintAuthCurrentlyAllowed = false) val bouncerMessage by collectLastValue(underTest.bouncerMessage) kosmos.fakeKeyguardBouncerRepository.setLastShownSecurityMode( KeyguardSecurityModel.SecurityMode.PIN ) assertThat(bouncerMessage).isNotNull() assertThat(primaryResMessage(bouncerMessage)).isEqualTo("Enter PIN") } @Test fun onPrimaryAuthMethodChangeFromPinToPattern_initialMessageUpdates() = testScope.runTest { init(fingerprintAuthCurrentlyAllowed = false) val bouncerMessage by collectLastValue(underTest.bouncerMessage) whenever(securityModel.getSecurityMode(PRIMARY_USER_ID)).thenReturn(Pattern) kosmos.fakeKeyguardBouncerRepository.setLastShownSecurityMode(Pattern) assertThat(bouncerMessage).isNotNull() assertThat(primaryResMessage(bouncerMessage)).isEqualTo("Draw pattern") } @Test fun onIncorrectSecurityInput_providesTheAppropriateValueForBouncerMessage() = testScope.runTest { Loading packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +1 −0 Original line number Diff line number Diff line Loading @@ -577,6 +577,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard SecurityMode securityMode = whitelistIpcs(() -> mSecurityModel.getSecurityMode( mSelectedUserInteractor.getSelectedUserId())); if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")"); mPrimaryBouncerInteractor.get().setLastShownPrimarySecurityScreen(securityMode); showSecurityScreen(securityMode); } Loading packages/SystemUI/src/com/android/systemui/bouncer/data/repository/KeyguardBouncerRepository.kt +19 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.bouncer.data.repository import android.os.Build import android.util.Log import com.android.keyguard.KeyguardSecurityModel import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.EXPANSION_HIDDEN import com.android.systemui.bouncer.shared.model.BouncerDismissActionModel import com.android.systemui.bouncer.shared.model.BouncerShowMessageModel Loading Loading @@ -89,6 +90,9 @@ interface KeyguardBouncerRepository { val alternateBouncerVisible: StateFlow<Boolean> val alternateBouncerUIAvailable: StateFlow<Boolean> /** Last shown security mode of the primary bouncer (ie: pin/pattern/password/SIM) */ val lastShownSecurityMode: StateFlow<KeyguardSecurityModel.SecurityMode> /** Action that should be run right after the bouncer is dismissed. */ var bouncerDismissActionModel: BouncerDismissActionModel? Loading Loading @@ -123,6 +127,8 @@ interface KeyguardBouncerRepository { fun setAlternateVisible(isVisible: Boolean) fun setAlternateBouncerUIAvailable(isAvailable: Boolean) fun setLastShownSecurityMode(securityMode: KeyguardSecurityModel.SecurityMode) } @SysUISingleton Loading Loading @@ -181,6 +187,11 @@ constructor( private val _showMessage = MutableStateFlow<BouncerShowMessageModel?>(null) override val showMessage = _showMessage.asStateFlow() private val _lastShownSecurityMode = MutableStateFlow(KeyguardSecurityModel.SecurityMode.Invalid) override val lastShownSecurityMode: StateFlow<KeyguardSecurityModel.SecurityMode> = _lastShownSecurityMode.asStateFlow() private val _resourceUpdateRequests = MutableStateFlow(false) override val resourceUpdateRequests = _resourceUpdateRequests.asStateFlow() Loading Loading @@ -262,6 +273,10 @@ constructor( _isBackButtonEnabled.value = isBackButtonEnabled } override fun setLastShownSecurityMode(securityMode: KeyguardSecurityModel.SecurityMode) { _lastShownSecurityMode.value = securityMode } /** Sets up logs for state flows. */ private fun setUpLogging() { if (!Build.IS_DEBUGGABLE) { Loading Loading @@ -308,6 +323,10 @@ constructor( alternateBouncerUIAvailable .logDiffsForTable(buffer, "", "IsAlternateBouncerUIAvailable", false) .launchIn(applicationScope) lastShownSecurityMode .map { it.name } .logDiffsForTable(buffer, "", "lastShownSecurityMode", null) .launchIn(applicationScope) } companion object { Loading packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractor.kt +4 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ import com.android.systemui.flags.SystemPropertiesHelper import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository import com.android.systemui.keyguard.data.repository.TrustRepository import com.android.systemui.user.data.repository.UserRepository import com.android.systemui.util.kotlin.Sextuple import com.android.systemui.util.kotlin.Septuple import com.android.systemui.util.kotlin.combine import javax.inject.Inject import kotlin.math.roundToInt Loading Loading @@ -145,15 +145,16 @@ constructor( private val initialBouncerMessage: Flow<BouncerMessageModel> = combine( primaryBouncerInteractor.lastShownSecurityMode, // required to update defaultMessage biometricSettingsRepository.authenticationFlags, trustRepository.isCurrentUserTrustManaged, isAnyBiometricsEnabledAndEnrolled, deviceEntryFingerprintAuthInteractor.isLockedOut, faceAuthRepository.isLockedOut, isFingerprintAuthCurrentlyAllowedOnBouncer, ::Sextuple ::Septuple ) .map { (flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut, _) -> .map { (_, flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut, _) -> val isTrustUsuallyManaged = trustRepository.isCurrentUserTrustUsuallyManaged.value val trustOrBiometricsAvailable = (isTrustUsuallyManaged || biometricsEnrolledAndEnabled) Loading packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt +6 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,8 @@ constructor( val resourceUpdateRequests: Flow<Boolean> = repository.resourceUpdateRequests.filter { it } val keyguardPosition: Flow<Float> = repository.keyguardPosition.filterNotNull() val panelExpansionAmount: Flow<Float> = repository.panelExpansionAmount val lastShownSecurityMode: Flow<KeyguardSecurityModel.SecurityMode> = repository.lastShownSecurityMode /** 0f = bouncer fully hidden. 1f = bouncer fully visible. */ val bouncerExpansion: Flow<Float> = Loading Loading @@ -384,6 +386,10 @@ constructor( return isShowing.value } fun setLastShownPrimarySecurityScreen(securityMode: KeyguardSecurityModel.SecurityMode) { repository.setLastShownSecurityMode(securityMode) } /** Whether we want to wait to show the bouncer in case passive auth succeeds. */ private fun usePrimaryBouncerPassiveAuthDelay(): Boolean { val canRunActiveUnlock = Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractorTest.kt +30 −2 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import androidx.test.filters.SmallTest import com.android.internal.widget.LockPatternUtils import com.android.keyguard.KeyguardSecurityModel import com.android.keyguard.KeyguardSecurityModel.SecurityMode.PIN import com.android.keyguard.KeyguardSecurityModel.SecurityMode.Pattern import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.Flags import com.android.systemui.SysuiTestCase Loading Loading @@ -88,7 +89,9 @@ class BouncerMessageInteractorTest : SysuiTestCase() { overrideResource(kg_trust_agent_disabled, "Trust agent is unavailable") } suspend fun TestScope.init() { suspend fun TestScope.init( fingerprintAuthCurrentlyAllowed: Boolean = true, ) { kosmos.fakeUserRepository.setSelectedUserInfo(PRIMARY_USER) mSetFlagsRule.enableFlags(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES) underTest = Loading @@ -107,13 +110,38 @@ class BouncerMessageInteractorTest : SysuiTestCase() { faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository, securityModel = securityModel ) biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true) biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed( fingerprintAuthCurrentlyAllowed ) kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false) kosmos.fakeFingerprintPropertyRepository.supportsSideFps() kosmos.fakeKeyguardBouncerRepository.setPrimaryShow(true) runCurrent() } @Test fun initialMessage_pin() = testScope.runTest { init(fingerprintAuthCurrentlyAllowed = false) val bouncerMessage by collectLastValue(underTest.bouncerMessage) kosmos.fakeKeyguardBouncerRepository.setLastShownSecurityMode( KeyguardSecurityModel.SecurityMode.PIN ) assertThat(bouncerMessage).isNotNull() assertThat(primaryResMessage(bouncerMessage)).isEqualTo("Enter PIN") } @Test fun onPrimaryAuthMethodChangeFromPinToPattern_initialMessageUpdates() = testScope.runTest { init(fingerprintAuthCurrentlyAllowed = false) val bouncerMessage by collectLastValue(underTest.bouncerMessage) whenever(securityModel.getSecurityMode(PRIMARY_USER_ID)).thenReturn(Pattern) kosmos.fakeKeyguardBouncerRepository.setLastShownSecurityMode(Pattern) assertThat(bouncerMessage).isNotNull() assertThat(primaryResMessage(bouncerMessage)).isEqualTo("Draw pattern") } @Test fun onIncorrectSecurityInput_providesTheAppropriateValueForBouncerMessage() = testScope.runTest { Loading
packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java +1 −0 Original line number Diff line number Diff line Loading @@ -577,6 +577,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard SecurityMode securityMode = whitelistIpcs(() -> mSecurityModel.getSecurityMode( mSelectedUserInteractor.getSelectedUserId())); if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")"); mPrimaryBouncerInteractor.get().setLastShownPrimarySecurityScreen(securityMode); showSecurityScreen(securityMode); } Loading
packages/SystemUI/src/com/android/systemui/bouncer/data/repository/KeyguardBouncerRepository.kt +19 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.bouncer.data.repository import android.os.Build import android.util.Log import com.android.keyguard.KeyguardSecurityModel import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants.EXPANSION_HIDDEN import com.android.systemui.bouncer.shared.model.BouncerDismissActionModel import com.android.systemui.bouncer.shared.model.BouncerShowMessageModel Loading Loading @@ -89,6 +90,9 @@ interface KeyguardBouncerRepository { val alternateBouncerVisible: StateFlow<Boolean> val alternateBouncerUIAvailable: StateFlow<Boolean> /** Last shown security mode of the primary bouncer (ie: pin/pattern/password/SIM) */ val lastShownSecurityMode: StateFlow<KeyguardSecurityModel.SecurityMode> /** Action that should be run right after the bouncer is dismissed. */ var bouncerDismissActionModel: BouncerDismissActionModel? Loading Loading @@ -123,6 +127,8 @@ interface KeyguardBouncerRepository { fun setAlternateVisible(isVisible: Boolean) fun setAlternateBouncerUIAvailable(isAvailable: Boolean) fun setLastShownSecurityMode(securityMode: KeyguardSecurityModel.SecurityMode) } @SysUISingleton Loading Loading @@ -181,6 +187,11 @@ constructor( private val _showMessage = MutableStateFlow<BouncerShowMessageModel?>(null) override val showMessage = _showMessage.asStateFlow() private val _lastShownSecurityMode = MutableStateFlow(KeyguardSecurityModel.SecurityMode.Invalid) override val lastShownSecurityMode: StateFlow<KeyguardSecurityModel.SecurityMode> = _lastShownSecurityMode.asStateFlow() private val _resourceUpdateRequests = MutableStateFlow(false) override val resourceUpdateRequests = _resourceUpdateRequests.asStateFlow() Loading Loading @@ -262,6 +273,10 @@ constructor( _isBackButtonEnabled.value = isBackButtonEnabled } override fun setLastShownSecurityMode(securityMode: KeyguardSecurityModel.SecurityMode) { _lastShownSecurityMode.value = securityMode } /** Sets up logs for state flows. */ private fun setUpLogging() { if (!Build.IS_DEBUGGABLE) { Loading Loading @@ -308,6 +323,10 @@ constructor( alternateBouncerUIAvailable .logDiffsForTable(buffer, "", "IsAlternateBouncerUIAvailable", false) .launchIn(applicationScope) lastShownSecurityMode .map { it.name } .logDiffsForTable(buffer, "", "lastShownSecurityMode", null) .launchIn(applicationScope) } companion object { Loading
packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageInteractor.kt +4 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ import com.android.systemui.flags.SystemPropertiesHelper import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository import com.android.systemui.keyguard.data.repository.TrustRepository import com.android.systemui.user.data.repository.UserRepository import com.android.systemui.util.kotlin.Sextuple import com.android.systemui.util.kotlin.Septuple import com.android.systemui.util.kotlin.combine import javax.inject.Inject import kotlin.math.roundToInt Loading Loading @@ -145,15 +145,16 @@ constructor( private val initialBouncerMessage: Flow<BouncerMessageModel> = combine( primaryBouncerInteractor.lastShownSecurityMode, // required to update defaultMessage biometricSettingsRepository.authenticationFlags, trustRepository.isCurrentUserTrustManaged, isAnyBiometricsEnabledAndEnrolled, deviceEntryFingerprintAuthInteractor.isLockedOut, faceAuthRepository.isLockedOut, isFingerprintAuthCurrentlyAllowedOnBouncer, ::Sextuple ::Septuple ) .map { (flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut, _) -> .map { (_, flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut, _) -> val isTrustUsuallyManaged = trustRepository.isCurrentUserTrustUsuallyManaged.value val trustOrBiometricsAvailable = (isTrustUsuallyManaged || biometricsEnrolledAndEnabled) Loading
packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt +6 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,8 @@ constructor( val resourceUpdateRequests: Flow<Boolean> = repository.resourceUpdateRequests.filter { it } val keyguardPosition: Flow<Float> = repository.keyguardPosition.filterNotNull() val panelExpansionAmount: Flow<Float> = repository.panelExpansionAmount val lastShownSecurityMode: Flow<KeyguardSecurityModel.SecurityMode> = repository.lastShownSecurityMode /** 0f = bouncer fully hidden. 1f = bouncer fully visible. */ val bouncerExpansion: Flow<Float> = Loading Loading @@ -384,6 +386,10 @@ constructor( return isShowing.value } fun setLastShownPrimarySecurityScreen(securityMode: KeyguardSecurityModel.SecurityMode) { repository.setLastShownSecurityMode(securityMode) } /** Whether we want to wait to show the bouncer in case passive auth succeeds. */ private fun usePrimaryBouncerPassiveAuthDelay(): Boolean { val canRunActiveUnlock = Loading