Skip to content

Commit 0ea56b4

Browse files
author
Austin Delgado
committed
Hide enrollment options that don't match requested biometric strength
When calling biometric enroll intent with biometric_strong, don't include weak enrollments as options. Bug: 265898482 Test: Tested manually by calling enrollment and verifying correct options are shown Test: atest BiometricEnrollActivityTest Change-Id: I5fa650a593aee536955ae806f5963ffbdc135a2e
1 parent e346dc6 commit 0ea56b4

File tree

2 files changed

+78
-6
lines changed

2 files changed

+78
-6
lines changed

Diff for: src/com/android/settings/biometrics/BiometricEnrollActivity.java

+24-6
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import android.hardware.biometrics.BiometricManager;
3636
import android.hardware.biometrics.BiometricManager.Authenticators;
3737
import android.hardware.biometrics.BiometricManager.BiometricError;
38+
import android.hardware.biometrics.SensorProperties;
3839
import android.hardware.face.FaceManager;
3940
import android.hardware.face.FaceSensorPropertiesInternal;
4041
import android.hardware.fingerprint.FingerprintManager;
@@ -198,7 +199,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
198199
// Default behavior is to enroll BIOMETRIC_WEAK or above. See ACTION_BIOMETRIC_ENROLL.
199200
final int authenticators = getIntent().getIntExtra(
200201
EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, Authenticators.BIOMETRIC_WEAK);
201-
Log.d(TAG, "Authenticators: " + authenticators);
202+
Log.d(TAG, "Authenticators: " + BiometricManager.authenticatorToStr(authenticators));
202203

203204
mParentalOptionsRequired = intent.getBooleanExtra(EXTRA_REQUIRE_PARENTAL_CONSENT, false);
204205
mSkipReturnToParent = intent.getBooleanExtra(EXTRA_SKIP_RETURN_TO_PARENT, false);
@@ -222,9 +223,16 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
222223
final FaceSensorPropertiesInternal props = faceProperties.get(0);
223224
final int maxEnrolls =
224225
isSetupWizard ? maxFacesEnrollableIfSUW : props.maxEnrollmentsPerUser;
226+
final boolean isFaceStrong =
227+
props.sensorStrength == SensorProperties.STRENGTH_STRONG;
225228
mIsFaceEnrollable =
226229
faceManager.getEnrolledFaces(mUserId).size() < maxEnrolls;
227230

231+
// If we expect strong bio only, check if face is strong
232+
if (authenticators == Authenticators.BIOMETRIC_STRONG && !isFaceStrong) {
233+
mIsFaceEnrollable = false;
234+
}
235+
228236
final boolean parentalConsent = isSetupWizard || (mParentalOptionsRequired
229237
&& !WizardManagerHelper.isUserSetupComplete(this));
230238
if (parentalConsent && isMultiSensor && mIsFaceEnrollable) {
@@ -278,6 +286,9 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
278286

279287
private void updateFingerprintEnrollable(boolean isSetupWizard) {
280288
if (mHasFeatureFingerprint) {
289+
final int authenticators = getIntent().getIntExtra(
290+
EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, Authenticators.BIOMETRIC_WEAK);
291+
281292
final FingerprintManager fpManager = getSystemService(FingerprintManager.class);
282293
final List<FingerprintSensorPropertiesInternal> fpProperties =
283294
fpManager.getSensorPropertiesInternal();
@@ -287,8 +298,15 @@ private void updateFingerprintEnrollable(boolean isSetupWizard) {
287298
final int maxEnrolls =
288299
isSetupWizard ? maxFingerprintsEnrollableIfSUW
289300
: fpProperties.get(0).maxEnrollmentsPerUser;
301+
final boolean isFingerprintStrong =
302+
fpProperties.get(0).sensorStrength == SensorProperties.STRENGTH_STRONG;
290303
mIsFingerprintEnrollable =
291304
fpManager.getEnrolledFingerprints(mUserId).size() < maxEnrolls;
305+
306+
// If we expect strong bio only, check if fingerprint is strong
307+
if (authenticators == Authenticators.BIOMETRIC_STRONG && !isFingerprintStrong) {
308+
mIsFingerprintEnrollable = false;
309+
}
292310
}
293311
}
294312
}
@@ -308,8 +326,8 @@ private void startEnrollWith(@Authenticators.Types int authenticators, boolean s
308326
}
309327
}
310328

311-
boolean canUseFace = mHasFeatureFace;
312-
boolean canUseFingerprint = mHasFeatureFingerprint;
329+
boolean canUseFace = mIsFaceEnrollable;
330+
boolean canUseFingerprint = mIsFingerprintEnrollable;
313331
if (mParentalOptionsRequired) {
314332
if (mParentalOptions == null) {
315333
throw new IllegalStateException("consent options required, but not set");
@@ -612,11 +630,11 @@ private void launchChooseLock() {
612630
Intent intent = BiometricUtils.getChooseLockIntent(this, getIntent());
613631
intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_INSECURE_OPTIONS, true);
614632
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE, true);
615-
if (mHasFeatureFingerprint && mHasFeatureFace) {
633+
if (mIsFingerprintEnrollable && mIsFaceEnrollable) {
616634
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS, true);
617-
} else if (mHasFeatureFace) {
635+
} else if (mIsFaceEnrollable) {
618636
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, true);
619-
} else if (mHasFeatureFingerprint) {
637+
} else if (mIsFingerprintEnrollable) {
620638
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true);
621639
}
622640

Diff for: tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java

+54
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.android.settings.biometrics;
1818

19+
import static android.hardware.biometrics.BiometricManager.Authenticators.BIOMETRIC_STRONG;
1920
import static android.provider.Settings.ACTION_BIOMETRIC_ENROLL;
2021

2122
import static androidx.test.espresso.intent.Intents.intended;
@@ -33,7 +34,13 @@
3334
import android.content.Context;
3435
import android.content.Intent;
3536
import android.content.pm.PackageManager;
37+
import android.hardware.biometrics.SensorProperties;
38+
import android.hardware.face.FaceManager;
39+
import android.hardware.face.FaceSensorPropertiesInternal;
40+
import android.hardware.fingerprint.FingerprintManager;
41+
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
3642
import android.os.UserHandle;
43+
import android.provider.Settings;
3744

3845
import androidx.test.core.app.ActivityScenario;
3946
import androidx.test.core.app.ApplicationProvider;
@@ -56,6 +63,8 @@
5663
import org.junit.Test;
5764
import org.junit.runner.RunWith;
5865

66+
import java.util.List;
67+
5968
@RunWith(AndroidJUnit4.class)
6069
@MediumTest
6170
public class BiometricEnrollActivityTest {
@@ -67,13 +76,37 @@ public class BiometricEnrollActivityTest {
6776
private final Context mContext = ApplicationProvider.getApplicationContext();
6877
private boolean mHasFace;
6978
private boolean mHasFingerprint;
79+
private boolean mIsFaceStrong;
80+
private boolean mIsFingerprintStrong;
7081

7182
@Before
7283
public void setup() {
7384
Intents.init();
7485
final PackageManager pm = mContext.getPackageManager();
7586
mHasFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
7687
mHasFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE);
88+
89+
if (mHasFace) {
90+
final FaceManager faceManager = mContext.getSystemService(FaceManager.class);
91+
final List<FaceSensorPropertiesInternal> faceProperties =
92+
faceManager.getSensorPropertiesInternal();
93+
if (!faceProperties.isEmpty()) {
94+
final FaceSensorPropertiesInternal faceProp = faceProperties.get(0);
95+
mIsFaceStrong = faceProp.sensorStrength == SensorProperties.STRENGTH_STRONG;
96+
}
97+
}
98+
99+
if (mHasFingerprint) {
100+
final FingerprintManager fingerprintManager = mContext.getSystemService(
101+
FingerprintManager.class);
102+
final List<FingerprintSensorPropertiesInternal> fingerProperties =
103+
fingerprintManager.getSensorPropertiesInternal();
104+
if (!fingerProperties.isEmpty()) {
105+
final FingerprintSensorPropertiesInternal fingerProp = fingerProperties.get(0);
106+
mIsFingerprintStrong =
107+
fingerProp.sensorStrength == SensorProperties.STRENGTH_STRONG;
108+
}
109+
}
77110
}
78111

79112
@After
@@ -129,6 +162,27 @@ public void launchWithPinAndPwHandle_confirmsPin() throws Exception {
129162
}
130163
}
131164

165+
@Test
166+
public void launchWithStrongBiometricAllowed_doNotEnrollWeak() throws Exception {
167+
assumeTrue(mHasFace || mHasFingerprint);
168+
169+
// Allow only strong biometrics
170+
Intent intent = getIntent();
171+
intent.putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, BIOMETRIC_STRONG);
172+
173+
try (ActivityScenario<BiometricEnrollActivity> scenario =
174+
ActivityScenario.launch(intent)) {
175+
intended(hasComponent(ChooseLockGeneric.class.getName()));
176+
if (mIsFaceStrong && mIsFingerprintStrong) {
177+
intended(hasExtra(EXTRA_KEY_FOR_BIOMETRICS, true));
178+
} else if (mIsFaceStrong) {
179+
intended(hasExtra(EXTRA_KEY_FOR_FACE, true));
180+
} else if (mIsFingerprintStrong) {
181+
intended(hasExtra(EXTRA_KEY_FOR_FINGERPRINT, true));
182+
}
183+
}
184+
}
185+
132186
private Intent getIntent() {
133187
return getIntent(false /* useInternal */);
134188
}

0 commit comments

Comments
 (0)