Add mandatory biometric prompt to platform surfaces (1/N)

1. Face settings
2. Fingerprint settings
3. Change device credential

Flag: android.hardware.biometrics.Flags.MANDATORY_BIOMETRICS
Bug: 339910718
Test: atest UtilsTest

Change-Id: I69778d1733ea9fb312e7c26ae0fa23b6008dde5d
This commit is contained in:
Diya Bera
2024-06-28 16:55:57 +00:00
parent b67c157e2f
commit 049de84f2d
10 changed files with 275 additions and 3 deletions

View File

@@ -16,8 +16,11 @@
package com.android.settings.password;
import static android.hardware.biometrics.BiometricConstants.BIOMETRIC_ERROR_USER_CANCELED;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.BiometricPrompt.AuthenticationCallback;
import android.hardware.biometrics.BiometricPrompt.AuthenticationResult;
@@ -137,7 +140,7 @@ public class BiometricFragment extends InstrumentedFragment {
BiometricPrompt.Builder promptBuilder = new BiometricPrompt.Builder(getContext())
.setTitle(promptInfo.getTitle())
.setUseDefaultTitle() // use default title if title is null/empty
.setDeviceCredentialAllowed(true)
.setAllowedAuthenticators(promptInfo.getAuthenticators())
.setSubtitle(promptInfo.getSubtitle())
.setDescription(promptInfo.getDescription())
.setTextForDeviceCredential(
@@ -170,6 +173,15 @@ public class BiometricFragment extends InstrumentedFragment {
if (promptInfo.isUseDefaultSubtitle()) {
promptBuilder.setUseDefaultSubtitle();
}
if ((promptInfo.getAuthenticators()
& BiometricManager.Authenticators.DEVICE_CREDENTIAL) == 0) {
promptBuilder.setNegativeButton(promptInfo.getNegativeButtonText(),
getContext().getMainExecutor(),
(dialog, which) -> mAuthenticationCallback.onAuthenticationError(
BIOMETRIC_ERROR_USER_CANCELED,
null /* errString */));
}
mBiometricPrompt = promptBuilder.build();
}

View File

@@ -160,11 +160,13 @@ public class ChooseLockGeneric extends SettingsActivity {
static final int CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST = 103;
@VisibleForTesting
static final int SKIP_FINGERPRINT_REQUEST = 104;
private static final int BIOMETRIC_AUTH_REQUEST = 105;
private LockPatternUtils mLockPatternUtils;
private DevicePolicyManager mDpm;
private boolean mRequestGatekeeperPasswordHandle = false;
private boolean mPasswordConfirmed = false;
private boolean mBiometricsAuthSuccessful = false;
private boolean mWaitingForConfirmation = false;
private boolean mWaitingForActivityResult = false;
private LockscreenCredential mUserPassword;
@@ -488,6 +490,17 @@ public class ChooseLockGeneric extends SettingsActivity {
? data.getParcelableExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD)
: null;
updatePreferencesOrFinish(false /* isRecreatingActivity */);
if (Utils.requestBiometricAuthenticationForMandatoryBiometrics(getContext(),
mBiometricsAuthSuccessful, mWaitingForConfirmation)) {
mWaitingForConfirmation = true;
Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST);
}
} else if (requestCode == BIOMETRIC_AUTH_REQUEST) {
if (resultCode == Activity.RESULT_OK) {
mBiometricsAuthSuccessful = true;
} else {
finish();
}
} else if (requestCode == CHOOSE_LOCK_REQUEST) {
if (resultCode != RESULT_CANCELED) {
getActivity().setResult(resultCode, data);

View File

@@ -17,10 +17,10 @@
package com.android.settings.password;
import static android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PASSWORD_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PATTERN_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PIN_HEADER;
import static android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
import static com.android.systemui.biometrics.Utils.toBitmap;
@@ -40,6 +40,7 @@ import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.BiometricPrompt.AuthenticationCallback;
import android.hardware.biometrics.PromptInfo;
@@ -76,6 +77,9 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
/** Use this extra value to provide a custom logo description for the biometric prompt. **/
public static final String CUSTOM_BIOMETRIC_PROMPT_LOGO_DESCRIPTION_KEY =
"custom_logo_description";
public static final String BIOMETRIC_PROMPT_AUTHENTICATORS = "biometric_prompt_authenticators";
public static final String BIOMETRIC_PROMPT_NEGATIVE_BUTTON_TEXT =
"biometric_prompt_negative_button_text";
public static class InternalActivity extends ConfirmDeviceCredentialActivity {
}
@@ -177,6 +181,11 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
mDetails = intent.getCharSequenceExtra(KeyguardManager.EXTRA_DESCRIPTION);
String alternateButton = intent.getStringExtra(
KeyguardManager.EXTRA_ALTERNATE_BUTTON_LABEL);
final int authenticators = intent.getIntExtra(BIOMETRIC_PROMPT_AUTHENTICATORS,
BiometricManager.Authenticators.DEVICE_CREDENTIAL
| BiometricManager.Authenticators.BIOMETRIC_WEAK);
final String negativeButtonText = intent.getStringExtra(
BIOMETRIC_PROMPT_NEGATIVE_BUTTON_TEXT);
final boolean frp =
KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction());
final boolean repairMode =
@@ -213,6 +222,8 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
promptInfo.setTitle(mTitle);
promptInfo.setDescription(mDetails);
promptInfo.setDisallowBiometricsIfPolicyExists(mCheckDevicePolicyManager);
promptInfo.setAuthenticators(authenticators);
promptInfo.setNegativeButtonText(negativeButtonText);
if (android.multiuser.Flags.enablePrivateSpaceFeatures()
&& android.multiuser.Flags.usePrivateSpaceIconInBiometricPrompt()