From 111b073ca96ef77ffa94c814314ce32e1d63d2fa Mon Sep 17 00:00:00 2001 From: Oli Thompson Date: Thu, 29 Jun 2023 13:25:57 +0000 Subject: [PATCH] Add show emergency button call to biometric prompt useDefaultSubtitle has to be set explicitly from promptInfo rather than being assumed true remove subtext for managed profile challenge screen to create space for emergency call button Test: manually tested Bug: 286391641 Bug: 286422726 Change-Id: I848e00dcd0013124e59ef711c3615e6773c3d210 --- src/com/android/settings/Utils.java | 30 ++---------------- .../settings/password/BiometricFragment.java | 13 +++++--- .../ConfirmDeviceCredentialActivity.java | 8 +++++ .../settings/wifi/dpp/WifiDppUtils.java | 3 +- .../src/com/android/settings/UtilsTest.java | 31 ++++--------------- 5 files changed, 27 insertions(+), 58 deletions(-) diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index dda5b24b310..c20529bbe3e 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -16,9 +16,6 @@ package com.android.settings; -import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PASSWORD; -import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN; -import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN; import static android.content.Intent.EXTRA_USER; import static android.content.Intent.EXTRA_USER_ID; import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH; @@ -791,36 +788,15 @@ public final class Utils extends com.android.settingslib.Utils { @Nullable public static String getConfirmCredentialStringForUser(@NonNull Context context, int userId, @LockPatternUtils.CredentialType int credentialType) { final int effectiveUserId = UserManager.get(context).getCredentialOwnerProfile(userId); - final boolean isEffectiveUserManagedProfile = UserManager.get(context) - .isManagedProfile(effectiveUserId); - final DevicePolicyManager devicePolicyManager = context - .getSystemService(DevicePolicyManager.class); + if (UserManager.get(context).isManagedProfile(effectiveUserId)) { + return null; + } switch (credentialType) { case LockPatternUtils.CREDENTIAL_TYPE_PIN: - if (isEffectiveUserManagedProfile) { - return devicePolicyManager.getResources().getString(WORK_PROFILE_CONFIRM_PIN, - () -> context.getString( - R.string.lockpassword_confirm_your_pin_generic_profile)); - } - return context.getString(R.string.lockpassword_confirm_your_pin_generic); case LockPatternUtils.CREDENTIAL_TYPE_PATTERN: - if (isEffectiveUserManagedProfile) { - return devicePolicyManager.getResources().getString( - WORK_PROFILE_CONFIRM_PATTERN, - () -> context.getString( - R.string.lockpassword_confirm_your_pattern_generic_profile)); - } - return context.getString(R.string.lockpassword_confirm_your_pattern_generic); case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD: - if (isEffectiveUserManagedProfile) { - return devicePolicyManager.getResources().getString( - WORK_PROFILE_CONFIRM_PASSWORD, - () -> context.getString( - R.string.lockpassword_confirm_your_password_generic_profile)); - } - return context.getString(R.string.lockpassword_confirm_your_password_generic); } return null; diff --git a/src/com/android/settings/password/BiometricFragment.java b/src/com/android/settings/password/BiometricFragment.java index 4ad04a1a903..379ce80ad6d 100644 --- a/src/com/android/settings/password/BiometricFragment.java +++ b/src/com/android/settings/password/BiometricFragment.java @@ -126,10 +126,9 @@ public class BiometricFragment extends InstrumentedFragment { final Bundle bundle = getArguments(); final PromptInfo promptInfo = bundle.getParcelable(KEY_PROMPT_INFO); - mBiometricPrompt = new BiometricPrompt.Builder(getContext()) + BiometricPrompt.Builder promptBuilder = new BiometricPrompt.Builder(getContext()) .setTitle(promptInfo.getTitle()) .setUseDefaultTitle() // use default title if title is null/empty - .setUseDefaultSubtitle() // use default subtitle if subtitle is null/empty .setDeviceCredentialAllowed(true) .setSubtitle(promptInfo.getSubtitle()) .setDescription(promptInfo.getDescription()) @@ -140,9 +139,15 @@ public class BiometricFragment extends InstrumentedFragment { .setConfirmationRequired(promptInfo.isConfirmationRequested()) .setDisallowBiometricsIfPolicyExists( promptInfo.isDisallowBiometricsIfPolicyExists()) + .setShowEmergencyCallButton(promptInfo.isShowEmergencyCallButton()) .setReceiveSystemEvents(true) - .setAllowBackgroundAuthentication(true) - .build(); + .setAllowBackgroundAuthentication(true); + + // Check if the default subtitle should be used if subtitle is null/empty + if (promptInfo.isUseDefaultSubtitle()) { + promptBuilder.setUseDefaultSubtitle(); + } + mBiometricPrompt = promptBuilder.build(); } @Override diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java index e4ebad7ce79..70d4d7dfa68 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java @@ -26,6 +26,7 @@ import android.app.Activity; import android.app.KeyguardManager; import android.app.RemoteLockscreenValidationSession; import android.app.admin.DevicePolicyManager; +import android.app.admin.ManagedSubscriptionsPolicy; import android.app.trust.TrustManager; import android.content.ComponentName; import android.content.Context; @@ -200,6 +201,13 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { promptInfo.setDescription(mDetails); promptInfo.setDisallowBiometricsIfPolicyExists(mCheckDevicePolicyManager); + final int policyType = mDevicePolicyManager.getManagedSubscriptionsPolicy().getPolicyType(); + + if (isEffectiveUserManagedProfile + && (policyType == ManagedSubscriptionsPolicy.TYPE_ALL_MANAGED_SUBSCRIPTIONS)) { + promptInfo.setShowEmergencyCallButton(true); + } + final @LockPatternUtils.CredentialType int credentialType = Utils.getCredentialType( mContext, effectiveUserId); if (mTitle == null) { diff --git a/src/com/android/settings/wifi/dpp/WifiDppUtils.java b/src/com/android/settings/wifi/dpp/WifiDppUtils.java index c336c623026..83a1571eec0 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java +++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java @@ -396,8 +396,7 @@ public class WifiDppUtils { final int userId = UserHandle.myUserId(); final BiometricPrompt.Builder builder = new BiometricPrompt.Builder(context) - .setTitle(context.getText(R.string.wifi_dpp_lockscreen_title)) - .setUseDefaultSubtitle(); + .setTitle(context.getText(R.string.wifi_dpp_lockscreen_title)); if (keyguardManager.isDeviceSecure()) { builder.setDeviceCredentialAllowed(true); diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java index 733a5e6043f..0c555da2075 100644 --- a/tests/robotests/src/com/android/settings/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/UtilsTest.java @@ -16,15 +16,10 @@ package com.android.settings; -import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PASSWORD; -import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN; -import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN; - import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -399,45 +394,33 @@ public class UtilsTest { } @Test - public void getConfirmCredentialStringForUser_workPin_shouldReturnCorrectString() { + public void getConfirmCredentialStringForUser_workPin_shouldReturnNull() { setUpForConfirmCredentialString(true /* isEffectiveUserManagedProfile */); - when(mDevicePolicyResourcesManager - .getString(eq(WORK_PROFILE_CONFIRM_PIN), any())) - .thenReturn("WORK PIN"); - String confirmCredentialString = Utils.getConfirmCredentialStringForUser(mContext, USER_ID, LockPatternUtils.CREDENTIAL_TYPE_PIN); - assertThat(confirmCredentialString).isEqualTo("WORK PIN"); + assertNull(confirmCredentialString); } @Test - public void getConfirmCredentialStringForUser_workPattern_shouldReturnCorrectString() { + public void getConfirmCredentialStringForUser_workPattern_shouldReturnNull() { setUpForConfirmCredentialString(true /* isEffectiveUserManagedProfile */); - when(mDevicePolicyResourcesManager - .getString(eq(WORK_PROFILE_CONFIRM_PATTERN), any())) - .thenReturn("WORK PATTERN"); - String confirmCredentialString = Utils.getConfirmCredentialStringForUser(mContext, USER_ID, LockPatternUtils.CREDENTIAL_TYPE_PATTERN); - assertThat(confirmCredentialString).isEqualTo("WORK PATTERN"); + assertNull(confirmCredentialString); } @Test - public void getConfirmCredentialStringForUser_workPassword_shouldReturnCorrectString() { + public void getConfirmCredentialStringForUser_workPassword_shouldReturnNull() { setUpForConfirmCredentialString(true /* isEffectiveUserManagedProfile */); - when(mDevicePolicyResourcesManager - .getString(eq(WORK_PROFILE_CONFIRM_PASSWORD), any())) - .thenReturn("WORK PASSWORD"); - String confirmCredentialString = Utils.getConfirmCredentialStringForUser(mContext, USER_ID, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD); - assertThat(confirmCredentialString).isEqualTo("WORK PASSWORD"); + assertNull(confirmCredentialString); } @Test @@ -454,7 +437,5 @@ public class UtilsTest { when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mMockUserManager); when(mMockUserManager.getCredentialOwnerProfile(USER_ID)).thenReturn(USER_ID); when(mMockUserManager.isManagedProfile(USER_ID)).thenReturn(isEffectiveUserManagedProfile); - when(mContext.getSystemService(DevicePolicyManager.class)).thenReturn(mDevicePolicyManager); - when(mDevicePolicyManager.getResources()).thenReturn(mDevicePolicyResourcesManager); } }