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
This commit is contained in:
Oli Thompson
2023-06-29 13:25:57 +00:00
parent 7dd94771bc
commit 111b073ca9
5 changed files with 27 additions and 58 deletions

View File

@@ -16,9 +16,6 @@
package com.android.settings; 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;
import static android.content.Intent.EXTRA_USER_ID; import static android.content.Intent.EXTRA_USER_ID;
import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH; 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, @Nullable public static String getConfirmCredentialStringForUser(@NonNull Context context,
int userId, @LockPatternUtils.CredentialType int credentialType) { int userId, @LockPatternUtils.CredentialType int credentialType) {
final int effectiveUserId = UserManager.get(context).getCredentialOwnerProfile(userId); final int effectiveUserId = UserManager.get(context).getCredentialOwnerProfile(userId);
final boolean isEffectiveUserManagedProfile = UserManager.get(context) if (UserManager.get(context).isManagedProfile(effectiveUserId)) {
.isManagedProfile(effectiveUserId); return null;
final DevicePolicyManager devicePolicyManager = context }
.getSystemService(DevicePolicyManager.class);
switch (credentialType) { switch (credentialType) {
case LockPatternUtils.CREDENTIAL_TYPE_PIN: 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); return context.getString(R.string.lockpassword_confirm_your_pin_generic);
case LockPatternUtils.CREDENTIAL_TYPE_PATTERN: 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); return context.getString(R.string.lockpassword_confirm_your_pattern_generic);
case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD: 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 context.getString(R.string.lockpassword_confirm_your_password_generic);
} }
return null; return null;

View File

@@ -126,10 +126,9 @@ public class BiometricFragment extends InstrumentedFragment {
final Bundle bundle = getArguments(); final Bundle bundle = getArguments();
final PromptInfo promptInfo = bundle.getParcelable(KEY_PROMPT_INFO); final PromptInfo promptInfo = bundle.getParcelable(KEY_PROMPT_INFO);
mBiometricPrompt = new BiometricPrompt.Builder(getContext()) BiometricPrompt.Builder promptBuilder = new BiometricPrompt.Builder(getContext())
.setTitle(promptInfo.getTitle()) .setTitle(promptInfo.getTitle())
.setUseDefaultTitle() // use default title if title is null/empty .setUseDefaultTitle() // use default title if title is null/empty
.setUseDefaultSubtitle() // use default subtitle if subtitle is null/empty
.setDeviceCredentialAllowed(true) .setDeviceCredentialAllowed(true)
.setSubtitle(promptInfo.getSubtitle()) .setSubtitle(promptInfo.getSubtitle())
.setDescription(promptInfo.getDescription()) .setDescription(promptInfo.getDescription())
@@ -140,9 +139,15 @@ public class BiometricFragment extends InstrumentedFragment {
.setConfirmationRequired(promptInfo.isConfirmationRequested()) .setConfirmationRequired(promptInfo.isConfirmationRequested())
.setDisallowBiometricsIfPolicyExists( .setDisallowBiometricsIfPolicyExists(
promptInfo.isDisallowBiometricsIfPolicyExists()) promptInfo.isDisallowBiometricsIfPolicyExists())
.setShowEmergencyCallButton(promptInfo.isShowEmergencyCallButton())
.setReceiveSystemEvents(true) .setReceiveSystemEvents(true)
.setAllowBackgroundAuthentication(true) .setAllowBackgroundAuthentication(true);
.build();
// Check if the default subtitle should be used if subtitle is null/empty
if (promptInfo.isUseDefaultSubtitle()) {
promptBuilder.setUseDefaultSubtitle();
}
mBiometricPrompt = promptBuilder.build();
} }
@Override @Override

View File

@@ -26,6 +26,7 @@ import android.app.Activity;
import android.app.KeyguardManager; import android.app.KeyguardManager;
import android.app.RemoteLockscreenValidationSession; import android.app.RemoteLockscreenValidationSession;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.admin.ManagedSubscriptionsPolicy;
import android.app.trust.TrustManager; import android.app.trust.TrustManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
@@ -200,6 +201,13 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
promptInfo.setDescription(mDetails); promptInfo.setDescription(mDetails);
promptInfo.setDisallowBiometricsIfPolicyExists(mCheckDevicePolicyManager); 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( final @LockPatternUtils.CredentialType int credentialType = Utils.getCredentialType(
mContext, effectiveUserId); mContext, effectiveUserId);
if (mTitle == null) { if (mTitle == null) {

View File

@@ -396,8 +396,7 @@ public class WifiDppUtils {
final int userId = UserHandle.myUserId(); final int userId = UserHandle.myUserId();
final BiometricPrompt.Builder builder = new BiometricPrompt.Builder(context) final BiometricPrompt.Builder builder = new BiometricPrompt.Builder(context)
.setTitle(context.getText(R.string.wifi_dpp_lockscreen_title)) .setTitle(context.getText(R.string.wifi_dpp_lockscreen_title));
.setUseDefaultSubtitle();
if (keyguardManager.isDeviceSecure()) { if (keyguardManager.isDeviceSecure()) {
builder.setDeviceCredentialAllowed(true); builder.setDeviceCredentialAllowed(true);

View File

@@ -16,15 +16,10 @@
package com.android.settings; 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 com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
@@ -399,45 +394,33 @@ public class UtilsTest {
} }
@Test @Test
public void getConfirmCredentialStringForUser_workPin_shouldReturnCorrectString() { public void getConfirmCredentialStringForUser_workPin_shouldReturnNull() {
setUpForConfirmCredentialString(true /* isEffectiveUserManagedProfile */); setUpForConfirmCredentialString(true /* isEffectiveUserManagedProfile */);
when(mDevicePolicyResourcesManager
.getString(eq(WORK_PROFILE_CONFIRM_PIN), any()))
.thenReturn("WORK PIN");
String confirmCredentialString = Utils.getConfirmCredentialStringForUser(mContext, String confirmCredentialString = Utils.getConfirmCredentialStringForUser(mContext,
USER_ID, LockPatternUtils.CREDENTIAL_TYPE_PIN); USER_ID, LockPatternUtils.CREDENTIAL_TYPE_PIN);
assertThat(confirmCredentialString).isEqualTo("WORK PIN"); assertNull(confirmCredentialString);
} }
@Test @Test
public void getConfirmCredentialStringForUser_workPattern_shouldReturnCorrectString() { public void getConfirmCredentialStringForUser_workPattern_shouldReturnNull() {
setUpForConfirmCredentialString(true /* isEffectiveUserManagedProfile */); setUpForConfirmCredentialString(true /* isEffectiveUserManagedProfile */);
when(mDevicePolicyResourcesManager
.getString(eq(WORK_PROFILE_CONFIRM_PATTERN), any()))
.thenReturn("WORK PATTERN");
String confirmCredentialString = Utils.getConfirmCredentialStringForUser(mContext, String confirmCredentialString = Utils.getConfirmCredentialStringForUser(mContext,
USER_ID, LockPatternUtils.CREDENTIAL_TYPE_PATTERN); USER_ID, LockPatternUtils.CREDENTIAL_TYPE_PATTERN);
assertThat(confirmCredentialString).isEqualTo("WORK PATTERN"); assertNull(confirmCredentialString);
} }
@Test @Test
public void getConfirmCredentialStringForUser_workPassword_shouldReturnCorrectString() { public void getConfirmCredentialStringForUser_workPassword_shouldReturnNull() {
setUpForConfirmCredentialString(true /* isEffectiveUserManagedProfile */); setUpForConfirmCredentialString(true /* isEffectiveUserManagedProfile */);
when(mDevicePolicyResourcesManager
.getString(eq(WORK_PROFILE_CONFIRM_PASSWORD), any()))
.thenReturn("WORK PASSWORD");
String confirmCredentialString = Utils.getConfirmCredentialStringForUser(mContext, String confirmCredentialString = Utils.getConfirmCredentialStringForUser(mContext,
USER_ID, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD); USER_ID, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD);
assertThat(confirmCredentialString).isEqualTo("WORK PASSWORD"); assertNull(confirmCredentialString);
} }
@Test @Test
@@ -454,7 +437,5 @@ public class UtilsTest {
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mMockUserManager); when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mMockUserManager);
when(mMockUserManager.getCredentialOwnerProfile(USER_ID)).thenReturn(USER_ID); when(mMockUserManager.getCredentialOwnerProfile(USER_ID)).thenReturn(USER_ID);
when(mMockUserManager.isManagedProfile(USER_ID)).thenReturn(isEffectiveUserManagedProfile); when(mMockUserManager.isManagedProfile(USER_ID)).thenReturn(isEffectiveUserManagedProfile);
when(mContext.getSystemService(DevicePolicyManager.class)).thenReturn(mDevicePolicyManager);
when(mDevicePolicyManager.getResources()).thenReturn(mDevicePolicyResourcesManager);
} }
} }