diff options
| author | 2025-01-19 19:05:06 -0800 | |
|---|---|---|
| committer | 2025-01-19 19:05:06 -0800 | |
| commit | d4ad87bf60f3ea23fb0740713068241d15204b51 (patch) | |
| tree | 26546b56a73c944a2e9899690587c49046f10f5a /packages/SystemUI | |
| parent | 71378c186c95c4c4f3bea01625ed5ae5f10d2070 (diff) | |
| parent | 4998c5adcaf276cf7721496238c9798a775afc44 (diff) | |
Merge "Split enabledForApp & enabledOnKeyguard settings for FP and Face" into main
Diffstat (limited to 'packages/SystemUI')
5 files changed, 201 insertions, 39 deletions
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 30dcd09d35ab..0a7d880677d8 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -521,6 +521,7 @@ android_library { "androidx.compose.animation_animation-graphics", "androidx.lifecycle_lifecycle-viewmodel-compose", "kairos", + "aconfig_settings_flags_lib", ], libs: [ "keepanno-annotations", @@ -706,6 +707,7 @@ android_library { "androidx.lifecycle_lifecycle-viewmodel-compose", "TraceurCommon", "Traceur-res", + "aconfig_settings_flags_lib", ], } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt index 69fb03dc6433..4e8a2a349283 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt @@ -22,8 +22,12 @@ import android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FACE import android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT import android.content.Intent import android.content.pm.UserInfo +import android.hardware.biometrics.BiometricAuthenticator.TYPE_ANY_BIOMETRIC +import android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE +import android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT import android.hardware.biometrics.BiometricManager import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback +import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest @@ -75,6 +79,8 @@ import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.stub @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @@ -153,7 +159,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { fun fingerprintEnrollmentChange() = testScope.runTest { createBiometricSettingsRepository() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT) val fingerprintAllowed = collectLastValue(underTest.isFingerprintEnrolledAndEnabled) runCurrent() @@ -173,7 +179,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { fun fingerprintEnabledStateChange() = testScope.runTest { createBiometricSettingsRepository() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT) val fingerprintAllowed = collectLastValue(underTest.isFingerprintEnrolledAndEnabled) runCurrent() @@ -183,12 +189,50 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { assertThat(fingerprintAllowed()).isTrue() // when biometrics are not enabled by settings - biometricsAreNotEnabledBySettings() + biometricsAreNotEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT) assertThat(fingerprintAllowed()).isFalse() // when biometrics are enabled by settings - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT) + assertThat(fingerprintAllowed()).isTrue() + } + + @Test + @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION) + fun enabledStateChange_typeFingerprintEnabled_typeFaceDisabled() = + testScope.runTest { + createBiometricSettingsRepository() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT) + val fingerprintAllowed = collectLastValue(underTest.isFingerprintEnrolledAndEnabled) + val faceAllowed = collectLastValue(underTest.isFaceAuthEnrolledAndEnabled) + runCurrent() + + // start state + authController.stub { + on { isFingerprintEnrolled(anyInt()) } doReturn true + } + enrollmentChange(UNDER_DISPLAY_FINGERPRINT, PRIMARY_USER_ID, true) assertThat(fingerprintAllowed()).isTrue() + assertThat(faceAllowed()).isFalse() + } + + @Test + @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION) + fun enabledStateChange_typeFingerprintDisabled_typeFaceEnabled() = + testScope.runTest { + createBiometricSettingsRepository() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE) + val fingerprintAllowed = collectLastValue(underTest.isFingerprintEnrolledAndEnabled) + val faceAllowed = collectLastValue(underTest.isFaceAuthEnrolledAndEnabled) + runCurrent() + + // start state + authController.stub { + on { isFaceAuthEnrolled(anyInt()) } doReturn true + } + enrollmentChange(FACE, PRIMARY_USER_ID, true) + assertThat(fingerprintAllowed()).isFalse() + assertThat(faceAllowed()).isTrue() } @Test @@ -197,7 +241,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { fingerprintIsEnrolled() doNotDisableKeyguardAuthFeatures() createBiometricSettingsRepository() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT) val strongBiometricAllowed by collectLastValue(underTest.isFingerprintAuthCurrentlyAllowed) @@ -220,7 +264,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { createBiometricSettingsRepository() val convenienceFaceAuthAllowed by collectLastValue(underTest.isFaceAuthCurrentlyAllowed) doNotDisableKeyguardAuthFeatures() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE) onStrongAuthChanged(STRONG_AUTH_NOT_REQUIRED, PRIMARY_USER_ID) onNonStrongAuthChanged(true, PRIMARY_USER_ID) @@ -282,7 +326,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { faceAuthIsEnrolled() createBiometricSettingsRepository() doNotDisableKeyguardAuthFeatures() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE) runCurrent() val convenienceBiometricAllowed by @@ -315,7 +359,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { testScope.runTest { fingerprintIsEnrolled(PRIMARY_USER_ID) createBiometricSettingsRepository() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT) val fingerprintEnabledByDevicePolicy = collectLastValue(underTest.isFingerprintEnrolledAndEnabled) @@ -341,7 +385,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { createBiometricSettingsRepository() val faceAuthAllowed = collectLastValue(underTest.isFaceAuthEnrolledAndEnabled) - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE) doNotDisableKeyguardAuthFeatures(PRIMARY_USER_ID) @@ -376,16 +420,22 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { assertThat(faceAuthAllowed()).isTrue() } - private fun biometricsAreEnabledBySettings(userId: Int = PRIMARY_USER_ID) { + private fun biometricsAreEnabledBySettings( + userId: Int = PRIMARY_USER_ID, + modality: Int = TYPE_ANY_BIOMETRIC, + ) { verify(biometricManager, atLeastOnce()) .registerEnabledOnKeyguardCallback(biometricManagerCallback.capture()) - biometricManagerCallback.value.onChanged(true, userId) + biometricManagerCallback.value.onChanged(true, userId, modality) } - private fun biometricsAreNotEnabledBySettings(userId: Int = PRIMARY_USER_ID) { + private fun biometricsAreNotEnabledBySettings( + userId: Int = PRIMARY_USER_ID, + modality: Int = TYPE_ANY_BIOMETRIC, + ) { verify(biometricManager, atLeastOnce()) .registerEnabledOnKeyguardCallback(biometricManagerCallback.capture()) - biometricManagerCallback.value.onChanged(false, userId) + biometricManagerCallback.value.onChanged(false, userId, modality) } @Test @@ -413,7 +463,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { userRepository.setSelectedUserInfo(ANOTHER_USER) doNotDisableKeyguardAuthFeatures(ANOTHER_USER_ID) - biometricManagerCallback.value.onChanged(true, ANOTHER_USER_ID) + biometricManagerCallback.value.onChanged(true, ANOTHER_USER_ID, TYPE_FACE) onNonStrongAuthChanged(true, ANOTHER_USER_ID) whenever(authController.isFaceAuthEnrolled(ANOTHER_USER_ID)).thenReturn(true) enrollmentChange(FACE, ANOTHER_USER_ID, true) @@ -441,7 +491,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { assertThat(isFaceAuthAllowed()).isFalse() - biometricManagerCallback.value.onChanged(true, PRIMARY_USER_ID) + biometricManagerCallback.value.onChanged(true, PRIMARY_USER_ID, TYPE_FACE) runCurrent() assertThat(isFaceAuthAllowed()).isFalse() @@ -458,7 +508,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { faceAuthIsEnrolled() createBiometricSettingsRepository() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE) doNotDisableKeyguardAuthFeatures() mobileConnectionsRepository.fake.isAnySimSecure.value = false runCurrent() @@ -485,7 +535,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { deviceIsInPostureThatSupportsFaceAuth() doNotDisableKeyguardAuthFeatures() faceAuthIsStrongBiometric() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE) mobileConnectionsRepository.fake.isAnySimSecure.value = false onStrongAuthChanged(STRONG_AUTH_NOT_REQUIRED, PRIMARY_USER_ID) @@ -512,12 +562,12 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { assertThat(isFaceAuthAllowed()).isFalse() // Value changes for another user - biometricManagerCallback.value.onChanged(true, ANOTHER_USER_ID) + biometricManagerCallback.value.onChanged(true, ANOTHER_USER_ID, TYPE_FACE) assertThat(isFaceAuthAllowed()).isFalse() // Value changes for current user. - biometricManagerCallback.value.onChanged(true, PRIMARY_USER_ID) + biometricManagerCallback.value.onChanged(true, PRIMARY_USER_ID, TYPE_FACE) assertThat(isFaceAuthAllowed()).isTrue() } @@ -537,13 +587,13 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { .registerEnabledOnKeyguardCallback(biometricManagerCallback.capture()) val isFingerprintEnrolledAndEnabled = collectLastValue(underTest.isFingerprintEnrolledAndEnabled) - biometricManagerCallback.value.onChanged(true, ANOTHER_USER_ID) + biometricManagerCallback.value.onChanged(true, ANOTHER_USER_ID, TYPE_FINGERPRINT) runCurrent() userRepository.setSelectedUserInfo(ANOTHER_USER) runCurrent() assertThat(isFingerprintEnrolledAndEnabled()).isFalse() - biometricManagerCallback.value.onChanged(true, PRIMARY_USER_ID) + biometricManagerCallback.value.onChanged(true, PRIMARY_USER_ID, TYPE_FINGERPRINT) runCurrent() userRepository.setSelectedUserInfo(PRIMARY_USER) runCurrent() @@ -559,7 +609,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { verify(biometricManager) .registerEnabledOnKeyguardCallback(biometricManagerCallback.capture()) val isFaceAuthAllowed = collectLastValue(underTest.isFaceAuthEnrolledAndEnabled) - biometricManagerCallback.value.onChanged(true, ANOTHER_USER_ID) + biometricManagerCallback.value.onChanged(true, ANOTHER_USER_ID, TYPE_FACE) runCurrent() userRepository.setSelectedUserInfo(ANOTHER_USER) @@ -691,7 +741,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { deviceIsInPostureThatSupportsFaceAuth() doNotDisableKeyguardAuthFeatures() faceAuthIsStrongBiometric() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE) onStrongAuthChanged(STRONG_AUTH_NOT_REQUIRED, PRIMARY_USER_ID) onNonStrongAuthChanged(false, PRIMARY_USER_ID) @@ -715,7 +765,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { deviceIsInPostureThatSupportsFaceAuth() doNotDisableKeyguardAuthFeatures() faceAuthIsNonStrongBiometric() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE) onStrongAuthChanged(STRONG_AUTH_NOT_REQUIRED, PRIMARY_USER_ID) onNonStrongAuthChanged(false, PRIMARY_USER_ID) @@ -737,7 +787,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { fun fpAuthCurrentlyAllowed_dependsOnNonStrongAuthBiometricSetting_ifFpIsNotStrong() = testScope.runTest { createBiometricSettingsRepository() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT) val isFingerprintCurrentlyAllowed by collectLastValue(underTest.isFingerprintAuthCurrentlyAllowed) @@ -779,7 +829,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { fun fpAuthCurrentlyAllowed_dependsOnStrongAuthBiometricSetting_ifFpIsStrong() = testScope.runTest { createBiometricSettingsRepository() - biometricsAreEnabledBySettings() + biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT) val isFingerprintCurrentlyAllowed by collectLastValue(underTest.isFingerprintAuthCurrentlyAllowed) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 7d291c311ca3..61038ef1a72d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -437,8 +437,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private final IBiometricEnabledOnKeyguardCallback mBiometricEnabledCallback = new IBiometricEnabledOnKeyguardCallback.Stub() { @Override - public void onChanged(boolean enabled, int userId) { + public void onChanged(boolean enabled, int userId, int modality) { mHandler.post(() -> { + if (com.android.settings.flags.Flags.biometricsOnboardingEducation() + && modality != TYPE_FINGERPRINT) { + return; + } mBiometricEnabledForUser.put(userId, enabled); updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE); }); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt index ab8cc7125d6e..4e7de5dd8a9c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt @@ -20,6 +20,9 @@ import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED import android.content.Context import android.content.IntentFilter +import android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE +import android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT +import android.hardware.biometrics.BiometricAuthenticator.TYPE_NONE import android.hardware.biometrics.BiometricManager import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback import android.os.UserHandle @@ -141,6 +144,8 @@ constructor( ) : BiometricSettingsRepository, Dumpable { private val biometricsEnabledForUser = mutableMapOf<Int, Boolean>() + private val fingerprintEnabledForUser = mutableMapOf<Int, Boolean>() + private val faceEnabledForUser = mutableMapOf<Int, Boolean>() override val isFaceAuthSupportedInCurrentPosture: Flow<Boolean> @@ -246,10 +251,25 @@ constructor( } } - private val areBiometricsEnabledForCurrentUser: Flow<Boolean> = + private val isFingerprintEnabledForCurrentUser: Flow<Boolean> = userRepository.selectedUserInfo.flatMapLatest { userInfo -> areBiometricsEnabledForDeviceEntryFromUserSetting.map { - biometricsEnabledForUser[userInfo.id] ?: false + if (com.android.settings.flags.Flags.biometricsOnboardingEducation()) { + fingerprintEnabledForUser[userInfo.id] ?: false + } else { + biometricsEnabledForUser[userInfo.id] ?: false + } + } + } + + private val isFaceEnabledForCurrentUser: Flow<Boolean> = + userRepository.selectedUserInfo.flatMapLatest { userInfo -> + areBiometricsEnabledForDeviceEntryFromUserSetting.map { + if (com.android.settings.flags.Flags.biometricsOnboardingEducation()) { + faceEnabledForUser[userInfo.id] ?: false + } else { + biometricsEnabledForUser[userInfo.id] ?: false + } } } @@ -264,31 +284,44 @@ constructor( .distinctUntilChanged() private val isFaceAuthenticationEnabled: Flow<Boolean> = - combine(areBiometricsEnabledForCurrentUser, isFaceEnabledByDevicePolicy) { + combine(isFaceEnabledForCurrentUser, isFaceEnabledByDevicePolicy) { biometricsManagerSetting, devicePolicySetting -> biometricsManagerSetting && devicePolicySetting } - private val areBiometricsEnabledForDeviceEntryFromUserSetting: Flow<Pair<Int, Boolean>> = + private val areBiometricsEnabledForDeviceEntryFromUserSetting: Flow<Triple<Int, Boolean, Int>> = conflatedCallbackFlow { val callback = object : IBiometricEnabledOnKeyguardCallback.Stub() { - override fun onChanged(enabled: Boolean, userId: Int) { + override fun onChanged(enabled: Boolean, userId: Int, modality: Int) { trySendWithFailureLogging( - Pair(userId, enabled), + Triple(userId, enabled, modality), TAG, - "biometricsEnabled state changed" + "biometricsEnabled state changed", ) } } biometricManager?.registerEnabledOnKeyguardCallback(callback) awaitClose {} } - .onEach { biometricsEnabledForUser[it.first] = it.second } + .onEach { + if (com.android.settings.flags.Flags.biometricsOnboardingEducation()) { + when (it.third) { + TYPE_FACE -> { + faceEnabledForUser[it.first] = it.second + } + TYPE_FINGERPRINT -> { + fingerprintEnabledForUser[it.first] = it.second + } + } + } else { + biometricsEnabledForUser[it.first] = it.second + } + } // This is because the callback is binder-based and we want to avoid multiple callbacks // being registered. - .stateIn(scope, SharingStarted.Eagerly, Pair(0, false)) + .stateIn(scope, SharingStarted.Eagerly, Triple(0, false, TYPE_NONE)) private val isStrongBiometricAllowed: StateFlow<Boolean> = strongAuthTracker.isStrongBiometricAllowed.stateIn( @@ -333,7 +366,7 @@ constructor( override val isFingerprintEnrolledAndEnabled: StateFlow<Boolean> = isFingerprintEnrolled - .and(areBiometricsEnabledForCurrentUser) + .and(isFingerprintEnabledForCurrentUser) .and(isFingerprintEnabledByDevicePolicy) .stateIn(scope, SharingStarted.Eagerly, false) diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 839a2bdf5588..2645811fa4ad 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -18,6 +18,8 @@ package com.android.keyguard; import static android.app.StatusBarManager.SESSION_KEYGUARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_ANY_BIOMETRIC; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; import static android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_LOCKOUT; @@ -1507,6 +1509,72 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { } @Test + @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION) + public void listenForFingerprint_whenEnabledForUser_typeFingerprint() + throws RemoteException { + // GIVEN keyguard showing + mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON); + mKeyguardUpdateMonitor.setKeyguardShowing(true, false); + + biometricsEnabledForCurrentUser(true, TYPE_FINGERPRINT); + mTestableLooper.processAllMessages(); + + assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(true); + } + + @Test + @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION) + public void doNotListenForFingerprint_whenDisabledForUser_typeFingerprint() + throws RemoteException { + // GIVEN keyguard showing + mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON); + mKeyguardUpdateMonitor.setKeyguardShowing(true, false); + + biometricsEnabledForCurrentUser(false, TYPE_FINGERPRINT); + mTestableLooper.processAllMessages(); + + assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(false); + } + + @Test + @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION) + public void listenForFingerprint_typeFingerprintEnabled_typeFaceDisabled() + throws RemoteException { + // GIVEN keyguard showing + mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON); + mKeyguardUpdateMonitor.setKeyguardShowing(true, false); + + // Enable with fingerprint + biometricsEnabledForCurrentUser(true, TYPE_FINGERPRINT); + mTestableLooper.processAllMessages(); + + // Disable with face + biometricsEnabledForCurrentUser(false, TYPE_FACE); + mTestableLooper.processAllMessages(); + + assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(true); + } + + @Test + @EnableFlags(com.android.settings.flags.Flags.FLAG_BIOMETRICS_ONBOARDING_EDUCATION) + public void doNotListenForFingerprint_typeFingerprintDisabled_typeFaceEnabled() + throws RemoteException { + // GIVEN keyguard showing + mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON); + mKeyguardUpdateMonitor.setKeyguardShowing(true, false); + + // Enable with face + biometricsEnabledForCurrentUser(true, TYPE_FACE); + mTestableLooper.processAllMessages(); + + // Disable with fingerprint + biometricsEnabledForCurrentUser(false, TYPE_FINGERPRINT); + mTestableLooper.processAllMessages(); + + assertThat(mKeyguardUpdateMonitor.shouldListenForFingerprint(true)).isEqualTo(false); + } + + @Test public void testOccludingAppFingerprintListeningState() { // GIVEN keyguard isn't visible (app occluding) mKeyguardUpdateMonitor.dispatchStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON); @@ -2464,8 +2532,13 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { } private void biometricsEnabledForCurrentUser() throws RemoteException { - mBiometricEnabledOnKeyguardCallback.onChanged(true, - mSelectedUserInteractor.getSelectedUserId()); + biometricsEnabledForCurrentUser(true /* enabled */, TYPE_FINGERPRINT); + } + + private void biometricsEnabledForCurrentUser(boolean enabled, int modality) + throws RemoteException { + mBiometricEnabledOnKeyguardCallback.onChanged(enabled, + mSelectedUserInteractor.getSelectedUserId(), modality); } private void primaryAuthNotRequiredByStrongAuthTracker() { |