diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java index 6c3233c465980..fa678fc5ee1a3 100644 --- a/core/java/android/hardware/biometrics/BiometricPrompt.java +++ b/core/java/android/hardware/biometrics/BiometricPrompt.java @@ -187,6 +187,19 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan return this; } + /** + * Shows a default subtitle for the prompt if the subtitle would otherwise be + * null or empty. Currently for internal use only. + * @return This builder. + * @hide + */ + @RequiresPermission(USE_BIOMETRIC_INTERNAL) + @NonNull + public Builder setUseDefaultSubtitle() { + mPromptInfo.setUseDefaultSubtitle(true); + return this; + } + /** * Optional: Sets a description that will be shown on the prompt. * @param description The description to display. @@ -628,6 +641,16 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan return mPromptInfo.getSubtitle(); } + /** + * Whether to use a default subtitle. For internal use only. + * @return See {@link Builder#setUseDefaultSubtitle()}. + * @hide + */ + @RequiresPermission(USE_BIOMETRIC_INTERNAL) + public boolean shouldUseDefaultSubtitle() { + return mPromptInfo.isUseDefaultSubtitle(); + } + /** * Gets the description for the prompt, as set by {@link Builder#setDescription(CharSequence)}. * @return The description for the prompt, or null if the prompt has no description. diff --git a/core/java/android/hardware/biometrics/PromptInfo.java b/core/java/android/hardware/biometrics/PromptInfo.java index a6b8096e6d4f2..02aad1dc4b4b0 100644 --- a/core/java/android/hardware/biometrics/PromptInfo.java +++ b/core/java/android/hardware/biometrics/PromptInfo.java @@ -33,6 +33,7 @@ public class PromptInfo implements Parcelable { @NonNull private CharSequence mTitle; private boolean mUseDefaultTitle; @Nullable private CharSequence mSubtitle; + private boolean mUseDefaultSubtitle; @Nullable private CharSequence mDescription; @Nullable private CharSequence mDeviceCredentialTitle; @Nullable private CharSequence mDeviceCredentialSubtitle; @@ -56,6 +57,7 @@ public class PromptInfo implements Parcelable { mTitle = in.readCharSequence(); mUseDefaultTitle = in.readBoolean(); mSubtitle = in.readCharSequence(); + mUseDefaultSubtitle = in.readBoolean(); mDescription = in.readCharSequence(); mDeviceCredentialTitle = in.readCharSequence(); mDeviceCredentialSubtitle = in.readCharSequence(); @@ -94,6 +96,7 @@ public class PromptInfo implements Parcelable { dest.writeCharSequence(mTitle); dest.writeBoolean(mUseDefaultTitle); dest.writeCharSequence(mSubtitle); + dest.writeBoolean(mUseDefaultSubtitle); dest.writeCharSequence(mDescription); dest.writeCharSequence(mDeviceCredentialTitle); dest.writeCharSequence(mDeviceCredentialSubtitle); @@ -128,6 +131,8 @@ public class PromptInfo implements Parcelable { return true; } else if (mUseDefaultTitle) { return true; + } else if (mUseDefaultSubtitle) { + return true; } else if (mDeviceCredentialTitle != null) { return true; } else if (mDeviceCredentialSubtitle != null) { @@ -154,6 +159,10 @@ public class PromptInfo implements Parcelable { mSubtitle = subtitle; } + public void setUseDefaultSubtitle(boolean useDefaultSubtitle) { + mUseDefaultSubtitle = useDefaultSubtitle; + } + public void setDescription(CharSequence description) { mDescription = description; } @@ -227,6 +236,10 @@ public class PromptInfo implements Parcelable { return mSubtitle; } + public boolean isUseDefaultSubtitle() { + return mUseDefaultSubtitle; + } + public CharSequence getDescription() { return mDescription; } diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index c8d43e4c40c63..ffa5d2055e927 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -563,6 +563,14 @@ public class BiometricService extends SystemService { } } + // Set the default subtitle if necessary. + if (promptInfo.isUseDefaultSubtitle()) { + if (TextUtils.isEmpty(promptInfo.getSubtitle())) { + promptInfo.setSubtitle(getContext() + .getString(R.string.biometric_dialog_default_subtitle)); + } + } + final long requestId = mRequestCounter.get(); mHandler.post(() -> handleAuthenticate( token, requestId, operationId, userId, receiver, opPackageName, promptInfo));