Split enabledForApp & enabledOnKeyguard settings for FP and Face
Make fingerprint & face have their own set of setting keys of
enablaedForApps and enabledForKeyguard.
Bug: 370940762
Test: atest AuthSessionTest
BiometricServiceTest
PreAuthInfoTest
KeyguardUpdateMonitorTest
BiometricSettingsRepositoryTest
SettingsBackupTest
Flag: com.android.settings.flags.biometrics_onboarding_education
Change-Id: Ia7156828d0bce2bbf0389431d3d5299f646bbffe
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index a935aac..67a9064 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -521,6 +521,7 @@
"androidx.compose.animation_animation-graphics",
"androidx.lifecycle_lifecycle-viewmodel-compose",
"kairos",
+ "aconfig_settings_flags_lib",
],
libs: [
"keepanno-annotations",
@@ -702,6 +703,7 @@
"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 69fb03d..4e8a2a3 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_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.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 @@
fun fingerprintEnrollmentChange() =
testScope.runTest {
createBiometricSettingsRepository()
- biometricsAreEnabledBySettings()
+ biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT)
val fingerprintAllowed = collectLastValue(underTest.isFingerprintEnrolledAndEnabled)
runCurrent()
@@ -173,7 +179,7 @@
fun fingerprintEnabledStateChange() =
testScope.runTest {
createBiometricSettingsRepository()
- biometricsAreEnabledBySettings()
+ biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT)
val fingerprintAllowed = collectLastValue(underTest.isFingerprintEnrolledAndEnabled)
runCurrent()
@@ -183,21 +189,59 @@
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
fun strongBiometricAllowedChange() =
testScope.runTest {
fingerprintIsEnrolled()
doNotDisableKeyguardAuthFeatures()
createBiometricSettingsRepository()
- biometricsAreEnabledBySettings()
+ biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT)
val strongBiometricAllowed by
collectLastValue(underTest.isFingerprintAuthCurrentlyAllowed)
@@ -220,7 +264,7 @@
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 @@
faceAuthIsEnrolled()
createBiometricSettingsRepository()
doNotDisableKeyguardAuthFeatures()
- biometricsAreEnabledBySettings()
+ biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE)
runCurrent()
val convenienceBiometricAllowed by
@@ -315,7 +359,7 @@
testScope.runTest {
fingerprintIsEnrolled(PRIMARY_USER_ID)
createBiometricSettingsRepository()
- biometricsAreEnabledBySettings()
+ biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT)
val fingerprintEnabledByDevicePolicy =
collectLastValue(underTest.isFingerprintEnrolledAndEnabled)
@@ -341,7 +385,7 @@
createBiometricSettingsRepository()
val faceAuthAllowed = collectLastValue(underTest.isFaceAuthEnrolledAndEnabled)
- biometricsAreEnabledBySettings()
+ biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE)
doNotDisableKeyguardAuthFeatures(PRIMARY_USER_ID)
@@ -376,16 +420,22 @@
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 @@
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 @@
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 @@
faceAuthIsEnrolled()
createBiometricSettingsRepository()
- biometricsAreEnabledBySettings()
+ biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FACE)
doNotDisableKeyguardAuthFeatures()
mobileConnectionsRepository.fake.isAnySimSecure.value = false
runCurrent()
@@ -485,7 +535,7 @@
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 @@
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 @@
.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 @@
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 @@
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 @@
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 @@
fun fpAuthCurrentlyAllowed_dependsOnNonStrongAuthBiometricSetting_ifFpIsNotStrong() =
testScope.runTest {
createBiometricSettingsRepository()
- biometricsAreEnabledBySettings()
+ biometricsAreEnabledBySettings(PRIMARY_USER_ID, TYPE_FINGERPRINT)
val isFingerprintCurrentlyAllowed by
collectLastValue(underTest.isFingerprintAuthCurrentlyAllowed)
@@ -779,7 +829,7 @@
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 7d291c3..61038ef 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -437,8 +437,12 @@
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 ab8cc71..4e7de5d 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.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 @@
) : 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 @@
}
}
- 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 @@
.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 @@
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 839a2bd..2645811 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 @@
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 @@
}
@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 @@
}
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() {