diff --git a/res/values/strings.xml b/res/values/strings.xml
index da1c158b36f..276f28ce0b7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3964,8 +3964,12 @@
Loading\u2026
-
- Use alternate method
+
+ Use PIN
+
+ Use pattern
+
+ Use password
diff --git a/src/com/android/settings/password/BiometricFragment.java b/src/com/android/settings/password/BiometricFragment.java
index 7f0907181e1..bd5a10de464 100644
--- a/src/com/android/settings/password/BiometricFragment.java
+++ b/src/com/android/settings/password/BiometricFragment.java
@@ -17,6 +17,7 @@
package com.android.settings.password;
import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
import android.content.DialogInterface;
import android.hardware.biometrics.BiometricConstants;
@@ -32,8 +33,10 @@ import android.util.Log;
import androidx.annotation.NonNull;
+import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.overlay.FeatureFactory;
import java.util.concurrent.Executor;
@@ -137,18 +140,43 @@ public class BiometricFragment extends InstrumentedFragment {
setRetainInstance(true);
mBundle = getArguments();
- mBiometricPrompt = new BiometricPrompt.Builder(getContext())
- .setTitle(mBundle.getString(BiometricPrompt.KEY_TITLE))
- .setUseDefaultTitle() // use default title if title is null/empty
- .setFromConfirmDeviceCredential()
- .setSubtitle(mBundle.getString(BiometricPrompt.KEY_SUBTITLE))
- .setDescription(mBundle.getString(BiometricPrompt.KEY_DESCRIPTION))
- .setConfirmationRequired(
- mBundle.getBoolean(BiometricPrompt.KEY_REQUIRE_CONFIRMATION, true))
- .setNegativeButton(getResources().getString(
- R.string.confirm_device_credential_use_alternate_method),
- mClientExecutor, mNegativeButtonListener)
- .build();
+ final BiometricPrompt.Builder builder = new BiometricPrompt.Builder(getContext())
+ .setTitle(mBundle.getString(BiometricPrompt.KEY_TITLE))
+ .setUseDefaultTitle() // use default title if title is null/empty
+ .setFromConfirmDeviceCredential()
+ .setSubtitle(mBundle.getString(BiometricPrompt.KEY_SUBTITLE))
+ .setDescription(mBundle.getString(BiometricPrompt.KEY_DESCRIPTION))
+ .setConfirmationRequired(
+ mBundle.getBoolean(BiometricPrompt.KEY_REQUIRE_CONFIRMATION, true));
+
+ final LockPatternUtils lockPatternUtils = FeatureFactory.getFactory(
+ getContext())
+ .getSecurityFeatureProvider()
+ .getLockPatternUtils(getContext());
+
+ switch (lockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
+ case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
+ builder.setNegativeButton(getResources().getString(
+ R.string.confirm_device_credential_pattern),
+ mClientExecutor, mNegativeButtonListener);
+ break;
+ case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
+ case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
+ builder.setNegativeButton(getResources().getString(
+ R.string.confirm_device_credential_pin),
+ mClientExecutor, mNegativeButtonListener);
+ break;
+ case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
+ case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
+ case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
+ case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
+ builder.setNegativeButton(getResources().getString(
+ R.string.confirm_device_credential_password),
+ mClientExecutor, mNegativeButtonListener);
+ break;
+ }
+
+ mBiometricPrompt = builder.build();
mCancellationSignal = new CancellationSignal();
// TODO: CC doesn't use crypto for now