Support EXTRA_DEVICE_PASSWORD_REQUIREMENT_ONLY
When set, only enforce password requirement explicitly set device-wide. As part of the change, restructure the code such that ChooseLockGeneric becomes the central place for aggregating password requirements from different parties, while ChooseLockPassword only enforces whatever password reuirement it is told (by ChooseLockGeneric via intent extras) Bug: 169832516 Test: m RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.password Change-Id: I0acbea4819c13d4a8444c7b06928baccead18837
This commit is contained in:
@@ -26,14 +26,13 @@ import static com.google.common.truth.Truth.assertWithMessage;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.robolectric.RuntimeEnvironment.application;
|
||||
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.admin.DevicePolicyManager.PasswordComplexity;
|
||||
import android.content.ComponentName;
|
||||
import android.app.admin.PasswordPolicy;
|
||||
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.settings.R;
|
||||
@@ -60,9 +59,6 @@ public class ChooseLockGenericControllerTest {
|
||||
@Mock
|
||||
private ManagedLockPasswordProvider mManagedLockPasswordProvider;
|
||||
|
||||
@Mock
|
||||
private DevicePolicyManager mDevicePolicyManager;
|
||||
|
||||
@Mock
|
||||
private LockPatternUtils mLockPatternUtils;
|
||||
|
||||
@@ -71,6 +67,7 @@ public class ChooseLockGenericControllerTest {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
when(mLockPatternUtils.hasSecureLockScreen()).thenReturn(true);
|
||||
setDevicePolicyPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
|
||||
mController = createController(PASSWORD_COMPLEXITY_NONE);
|
||||
SettingsShadowResources.overrideResource(R.bool.config_hide_none_security_option, false);
|
||||
SettingsShadowResources.overrideResource(R.bool.config_hide_swipe_security_option, false);
|
||||
@@ -206,9 +203,7 @@ public class ChooseLockGenericControllerTest {
|
||||
|
||||
@Test
|
||||
public void upgradeQuality_noDpmRequirement_shouldReturnQuality() {
|
||||
doReturn(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED)
|
||||
.when(mDevicePolicyManager)
|
||||
.getPasswordQuality(nullable(ComponentName.class), anyInt());
|
||||
setDevicePolicyPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
|
||||
|
||||
final int upgradedQuality =
|
||||
mController.upgradeQuality(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC);
|
||||
@@ -218,9 +213,7 @@ public class ChooseLockGenericControllerTest {
|
||||
|
||||
@Test
|
||||
public void upgradeQuality_dpmRequirement_shouldReturnRequiredQuality() {
|
||||
doReturn(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC)
|
||||
.when(mDevicePolicyManager)
|
||||
.getPasswordQuality(nullable(ComponentName.class), anyInt());
|
||||
setDevicePolicyPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC);
|
||||
|
||||
final int upgradedQuality =
|
||||
mController.upgradeQuality(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
|
||||
@@ -230,8 +223,7 @@ public class ChooseLockGenericControllerTest {
|
||||
|
||||
@Test
|
||||
public void upgradeQuality_complexityHigh_minQualityNumericComplex() {
|
||||
when(mDevicePolicyManager.getPasswordQuality(nullable(ComponentName.class), anyInt()))
|
||||
.thenReturn(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
|
||||
setDevicePolicyPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
|
||||
ChooseLockGenericController controller = createController(PASSWORD_COMPLEXITY_HIGH);
|
||||
|
||||
assertThat(controller.upgradeQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED))
|
||||
@@ -240,8 +232,7 @@ public class ChooseLockGenericControllerTest {
|
||||
|
||||
@Test
|
||||
public void upgradeQuality_complexityMedium_minQualityNumericComplex() {
|
||||
when(mDevicePolicyManager.getPasswordQuality(nullable(ComponentName.class), anyInt()))
|
||||
.thenReturn(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
|
||||
setDevicePolicyPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
|
||||
ChooseLockGenericController controller = createController(PASSWORD_COMPLEXITY_MEDIUM);
|
||||
|
||||
assertThat(controller.upgradeQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED))
|
||||
@@ -250,21 +241,28 @@ public class ChooseLockGenericControllerTest {
|
||||
|
||||
@Test
|
||||
public void upgradeQuality_complexityLow_minQualitySomething() {
|
||||
when(mDevicePolicyManager.getPasswordQuality(nullable(ComponentName.class), anyInt()))
|
||||
.thenReturn(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
|
||||
setDevicePolicyPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
|
||||
ChooseLockGenericController controller = createController(PASSWORD_COMPLEXITY_LOW);
|
||||
|
||||
assertThat(controller.upgradeQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED))
|
||||
.isEqualTo(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
|
||||
}
|
||||
|
||||
private void setDevicePolicyPasswordQuality(int quality) {
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = quality;
|
||||
|
||||
when(mLockPatternUtils.getRequestedPasswordMetrics(anyInt(), anyBoolean()))
|
||||
.thenReturn(policy.getMinMetrics());
|
||||
}
|
||||
|
||||
private ChooseLockGenericController createController(
|
||||
@PasswordComplexity int minPasswordComplexity) {
|
||||
return new ChooseLockGenericController(
|
||||
application,
|
||||
0 /* userId */,
|
||||
minPasswordComplexity,
|
||||
mDevicePolicyManager,
|
||||
false,
|
||||
mManagedLockPasswordProvider,
|
||||
mLockPatternUtils);
|
||||
}
|
||||
|
@@ -21,10 +21,14 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_HIGH;
|
||||
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_LOW;
|
||||
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_MEDIUM;
|
||||
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
|
||||
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC;
|
||||
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
|
||||
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
|
||||
|
||||
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
|
||||
import static com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment.KEY_LOCK_SETTINGS_FOOTER;
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME;
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_DEVICE_PASSWORD_REQUIREMENT_ONLY;
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN;
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
|
||||
|
||||
@@ -35,6 +39,8 @@ import static org.robolectric.Shadows.shadowOf;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.admin.PasswordMetrics;
|
||||
import android.app.admin.PasswordPolicy;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
@@ -301,8 +307,8 @@ public class ChooseLockGenericTest {
|
||||
assertThat(result).isTrue();
|
||||
Intent actualIntent = shadowOf(mActivity).getNextStartedActivityForResult().intent;
|
||||
assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isTrue();
|
||||
assertThat(actualIntent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_NONE))
|
||||
.isEqualTo(PASSWORD_COMPLEXITY_HIGH);
|
||||
assertThat(actualIntent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY,
|
||||
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_HIGH);
|
||||
assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
|
||||
assertThat(actualIntent.getStringExtra(EXTRA_KEY_CALLER_APP_NAME))
|
||||
.isEqualTo("app name");
|
||||
@@ -322,8 +328,8 @@ public class ChooseLockGenericTest {
|
||||
assertThat(result).isTrue();
|
||||
Intent actualIntent = shadowOf(mActivity).getNextStartedActivityForResult().intent;
|
||||
assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isTrue();
|
||||
assertThat(actualIntent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_NONE))
|
||||
.isEqualTo(PASSWORD_COMPLEXITY_HIGH);
|
||||
assertThat(actualIntent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY,
|
||||
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_HIGH);
|
||||
assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
|
||||
assertThat(actualIntent.getStringExtra(EXTRA_KEY_CALLER_APP_NAME))
|
||||
.isEqualTo("app name");
|
||||
@@ -391,7 +397,7 @@ public class ChooseLockGenericTest {
|
||||
assertThat(footer.getTitle()).isEqualTo(null);
|
||||
|
||||
Intent intent = mFragment.getLockPasswordIntent(PASSWORD_QUALITY_COMPLEX);
|
||||
assertThat(intent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY,
|
||||
assertThat(intent.getIntExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY,
|
||||
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_HIGH);
|
||||
}
|
||||
|
||||
@@ -411,7 +417,7 @@ public class ChooseLockGenericTest {
|
||||
assertThat(footer.getTitle()).isEqualTo(null);
|
||||
|
||||
Intent passwordIntent = mFragment.getLockPasswordIntent(PASSWORD_QUALITY_COMPLEX);
|
||||
assertThat(passwordIntent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY,
|
||||
assertThat(passwordIntent.getIntExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY,
|
||||
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_HIGH);
|
||||
}
|
||||
|
||||
@@ -433,10 +439,66 @@ public class ChooseLockGenericTest {
|
||||
assertThat(footer.getTitle()).isEqualTo(expectedTitle);
|
||||
|
||||
Intent passwordIntent = mFragment.getLockPasswordIntent(PASSWORD_QUALITY_COMPLEX);
|
||||
assertThat(passwordIntent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY,
|
||||
assertThat(passwordIntent.getIntExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY,
|
||||
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_HIGH);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLockPasswordIntent_DevicePasswordRequirementOnly_PasswordComplexityPassedOn() {
|
||||
ShadowLockPatternUtils.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW);
|
||||
ShadowLockPatternUtils.setRequiredProfilePasswordComplexity(PASSWORD_COMPLEXITY_HIGH);
|
||||
|
||||
Intent intent = new Intent()
|
||||
.putExtra(EXTRA_KEY_DEVICE_PASSWORD_REQUIREMENT_ONLY, true);
|
||||
initActivity(intent);
|
||||
|
||||
Intent passwordIntent = mFragment.getLockPasswordIntent(PASSWORD_QUALITY_ALPHABETIC);
|
||||
assertThat(passwordIntent.getIntExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY,
|
||||
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_LOW);
|
||||
assertThat(passwordIntent.<PasswordMetrics>getParcelableExtra(
|
||||
ChooseLockPassword.EXTRA_KEY_MIN_METRICS)).isEqualTo(
|
||||
new PasswordMetrics(CREDENTIAL_TYPE_NONE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLockPasswordIntent_DevicePasswordRequirementOnly_PasswordQualityPassedOn() {
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_SOMETHING;
|
||||
ShadowLockPatternUtils.setRequestedPasswordMetrics(policy.getMinMetrics());
|
||||
PasswordPolicy profilePolicy = new PasswordPolicy();
|
||||
profilePolicy.quality = PASSWORD_QUALITY_ALPHABETIC;
|
||||
ShadowLockPatternUtils.setRequestedProfilePasswordMetrics(profilePolicy.getMinMetrics());
|
||||
|
||||
Intent intent = new Intent()
|
||||
.putExtra(EXTRA_KEY_DEVICE_PASSWORD_REQUIREMENT_ONLY, true);
|
||||
initActivity(intent);
|
||||
|
||||
Intent passwordIntent = mFragment.getLockPasswordIntent(PASSWORD_QUALITY_ALPHABETIC);
|
||||
assertThat(passwordIntent.getIntExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY,
|
||||
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_NONE);
|
||||
assertThat(passwordIntent.<PasswordMetrics>getParcelableExtra(
|
||||
ChooseLockPassword.EXTRA_KEY_MIN_METRICS)).isEqualTo(policy.getMinMetrics());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLockPasswordIntent_DevicePasswordRequirementOnly_ComplexityAndQualityPassedOn() {
|
||||
ShadowLockPatternUtils.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_ALPHABETIC;
|
||||
ShadowLockPatternUtils.setRequestedProfilePasswordMetrics(policy.getMinMetrics());
|
||||
|
||||
Intent intent = new Intent()
|
||||
.putExtra(EXTRA_KEY_DEVICE_PASSWORD_REQUIREMENT_ONLY, true);
|
||||
initActivity(intent);
|
||||
|
||||
Intent passwordIntent = mFragment.getLockPasswordIntent(PASSWORD_QUALITY_ALPHABETIC);
|
||||
assertThat(passwordIntent.getIntExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY,
|
||||
PASSWORD_COMPLEXITY_NONE)).isEqualTo(PASSWORD_COMPLEXITY_LOW);
|
||||
assertThat(passwordIntent.<PasswordMetrics>getParcelableExtra(
|
||||
ChooseLockPassword.EXTRA_KEY_MIN_METRICS)).isEqualTo(
|
||||
new PasswordMetrics(CREDENTIAL_TYPE_NONE));
|
||||
}
|
||||
|
||||
private void initActivity(@Nullable Intent intent) {
|
||||
if (intent == null) {
|
||||
intent = new Intent();
|
||||
|
@@ -30,7 +30,6 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED
|
||||
|
||||
import static com.android.internal.widget.LockPatternUtils.PASSWORD_TYPE_KEY;
|
||||
import static com.android.settings.password.ChooseLockGeneric.CONFIRM_CREDENTIALS;
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_UNIFICATION_PROFILE_ID;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
@@ -40,6 +39,8 @@ import static org.robolectric.RuntimeEnvironment.application;
|
||||
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.admin.DevicePolicyManager.PasswordComplexity;
|
||||
import android.app.admin.PasswordMetrics;
|
||||
import android.app.admin.PasswordPolicy;
|
||||
import android.content.Intent;
|
||||
import android.os.UserHandle;
|
||||
|
||||
@@ -93,7 +94,7 @@ public class ChooseLockPasswordTest {
|
||||
public void intentBuilder_setPassword_shouldAddExtras() {
|
||||
Intent intent = new IntentBuilder(application)
|
||||
.setPassword(LockscreenCredential.createPassword("password"))
|
||||
.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC)
|
||||
.setPasswordType(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC)
|
||||
.setUserId(123)
|
||||
.build();
|
||||
|
||||
@@ -114,7 +115,7 @@ public class ChooseLockPasswordTest {
|
||||
public void intentBuilder_setRequestGatekeeperPassword_shouldAddExtras() {
|
||||
Intent intent = new IntentBuilder(application)
|
||||
.setRequestGatekeeperPasswordHandle(true)
|
||||
.setPasswordQuality(PASSWORD_QUALITY_ALPHANUMERIC)
|
||||
.setPasswordType(PASSWORD_QUALITY_ALPHANUMERIC)
|
||||
.setUserId(123)
|
||||
.build();
|
||||
|
||||
@@ -131,11 +132,12 @@ public class ChooseLockPasswordTest {
|
||||
@Test
|
||||
public void intentBuilder_setMinComplexityMedium_hasMinComplexityExtraMedium() {
|
||||
Intent intent = new IntentBuilder(application)
|
||||
.setRequestedMinComplexity(PASSWORD_COMPLEXITY_MEDIUM)
|
||||
.setPasswordRequirement(PASSWORD_COMPLEXITY_MEDIUM, null)
|
||||
.build();
|
||||
|
||||
assertThat(intent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isTrue();
|
||||
assertThat(intent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_NONE))
|
||||
assertThat(intent.hasExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY)).isTrue();
|
||||
assertThat(intent.getIntExtra(
|
||||
ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_NONE))
|
||||
.isEqualTo(PASSWORD_COMPLEXITY_MEDIUM);
|
||||
}
|
||||
|
||||
@@ -143,7 +145,7 @@ public class ChooseLockPasswordTest {
|
||||
public void intentBuilder_setMinComplexityNotCalled() {
|
||||
Intent intent = new IntentBuilder(application).build();
|
||||
|
||||
assertThat(intent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
|
||||
assertThat(intent.hasExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -163,10 +165,12 @@ public class ChooseLockPasswordTest {
|
||||
|
||||
@Test
|
||||
public void processAndValidatePasswordRequirements_noMinPasswordComplexity() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_ALPHABETIC);
|
||||
mShadowDpm.setPasswordMinimumLength(10);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_ALPHABETIC;
|
||||
policy.length = 10;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_NONE,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createNone(),
|
||||
@@ -176,9 +180,11 @@ public class ChooseLockPasswordTest {
|
||||
|
||||
@Test
|
||||
public void processAndValidatePasswordRequirements_minPasswordComplexityStricter_pin() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_SOMETHING);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_SOMETHING;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
|
||||
/* passwordType= */ PASSWORD_QUALITY_NUMERIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createNone(),
|
||||
@@ -188,9 +194,11 @@ public class ChooseLockPasswordTest {
|
||||
@Test
|
||||
@Ignore
|
||||
public void processAndValidatePasswordRequirements_minPasswordComplexityStricter_password() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_SOMETHING);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_SOMETHING;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createNone(),
|
||||
@@ -200,10 +208,12 @@ public class ChooseLockPasswordTest {
|
||||
|
||||
@Test
|
||||
public void processAndValidatePasswordRequirements_dpmRestrictionsStricter_password() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_ALPHANUMERIC);
|
||||
mShadowDpm.setPasswordMinimumLength(9);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_ALPHANUMERIC;
|
||||
policy.length = 9;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_LOW,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createNone(),
|
||||
@@ -214,10 +224,12 @@ public class ChooseLockPasswordTest {
|
||||
|
||||
@Test
|
||||
public void processAndValidatePasswordRequirements_dpmLengthLonger_pin() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_NUMERIC);
|
||||
mShadowDpm.setPasswordMinimumLength(11);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_NUMERIC;
|
||||
policy.length = 11;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM,
|
||||
/* passwordType= */ PASSWORD_QUALITY_NUMERIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createNone(),
|
||||
@@ -226,10 +238,12 @@ public class ChooseLockPasswordTest {
|
||||
|
||||
@Test
|
||||
public void processAndValidatePasswordRequirements_dpmQualityComplex() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_COMPLEX);
|
||||
mShadowDpm.setPasswordMinimumSymbols(2);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_COMPLEX;
|
||||
policy.symbols = 2;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createNone(),
|
||||
@@ -242,9 +256,11 @@ public class ChooseLockPasswordTest {
|
||||
@Test
|
||||
@Config(shadows = ShadowLockPatternUtils.class)
|
||||
public void processAndValidatePasswordRequirements_numericComplexNoMinComplexity_pinRequested() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_NUMERIC_COMPLEX);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_NUMERIC_COMPLEX;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_NONE,
|
||||
/* passwordType= */ PASSWORD_QUALITY_NUMERIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createPassword("12345678"),
|
||||
@@ -254,9 +270,11 @@ public class ChooseLockPasswordTest {
|
||||
@Test
|
||||
@Config(shadows = ShadowLockPatternUtils.class)
|
||||
public void processAndValidatePasswordRequirements_numericComplexNoMinComplexity_passwordRequested() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_NUMERIC_COMPLEX);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_NUMERIC_COMPLEX;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_NONE,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createPassword("12345678"),
|
||||
@@ -266,9 +284,11 @@ public class ChooseLockPasswordTest {
|
||||
@Test
|
||||
@Config(shadows = ShadowLockPatternUtils.class)
|
||||
public void processAndValidatePasswordRequirements_numericComplexHighComplexity_pinRequested() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_NUMERIC_COMPLEX);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_NUMERIC_COMPLEX;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
|
||||
/* passwordType= */ PASSWORD_QUALITY_NUMERIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createPassword("12345678"),
|
||||
@@ -278,9 +298,11 @@ public class ChooseLockPasswordTest {
|
||||
@Test
|
||||
@Config(shadows = ShadowLockPatternUtils.class)
|
||||
public void processAndValidatePasswordRequirements_numericHighComplexity_pinRequested() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_NUMERIC);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_NUMERIC_COMPLEX;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
|
||||
/* passwordType= */ PASSWORD_QUALITY_NUMERIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createPassword("12345678"),
|
||||
@@ -290,9 +312,11 @@ public class ChooseLockPasswordTest {
|
||||
@Test
|
||||
@Config(shadows = ShadowLockPatternUtils.class)
|
||||
public void processAndValidatePasswordRequirements_numericComplexLowComplexity_passwordRequested() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_NUMERIC_COMPLEX);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_NUMERIC_COMPLEX;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_LOW,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createPassword("12345678"),
|
||||
@@ -302,9 +326,11 @@ public class ChooseLockPasswordTest {
|
||||
@Test
|
||||
@Ignore
|
||||
public void processAndValidatePasswordRequirements_requirementsUpdateAccordingToMinComplexityAndUserInput_empty() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createNone(),
|
||||
@@ -315,9 +341,11 @@ public class ChooseLockPasswordTest {
|
||||
@Test
|
||||
@Ignore
|
||||
public void processAndValidatePasswordRequirements_requirementsUpdateAccordingToMinComplexityAndUserInput_numeric() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createPassword("1"),
|
||||
@@ -327,9 +355,11 @@ public class ChooseLockPasswordTest {
|
||||
|
||||
@Test
|
||||
public void processAndValidatePasswordRequirements_requirementsUpdateAccordingToMinComplexityAndUserInput_alphabetic() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createPassword("b"),
|
||||
@@ -338,9 +368,11 @@ public class ChooseLockPasswordTest {
|
||||
|
||||
@Test
|
||||
public void processAndValidatePasswordRequirements_requirementsUpdateAccordingToMinComplexityAndUserInput_alphanumeric() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createPassword("b1"),
|
||||
@@ -349,9 +381,11 @@ public class ChooseLockPasswordTest {
|
||||
|
||||
@Test
|
||||
public void processAndValidatePasswordRequirements_defaultPinMinimumLength() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_NONE,
|
||||
/* passwordType= */ PASSWORD_QUALITY_NUMERIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createPassword("11"),
|
||||
@@ -360,9 +394,11 @@ public class ChooseLockPasswordTest {
|
||||
|
||||
@Test
|
||||
public void processAndValidatePasswordRequirements_maximumLength() {
|
||||
mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED);
|
||||
PasswordPolicy policy = new PasswordPolicy();
|
||||
policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ policy.getMinMetrics(),
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_NONE,
|
||||
/* passwordType= */ PASSWORD_QUALITY_ALPHABETIC,
|
||||
LockscreenCredential.createPassword("01234567890123456789"),
|
||||
@@ -386,6 +422,7 @@ public class ChooseLockPasswordTest {
|
||||
ShadowLockPatternUtils.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW);
|
||||
|
||||
assertPasswordValidationResult(
|
||||
/* minMetrics */ null,
|
||||
/* minComplexity= */ PASSWORD_COMPLEXITY_HIGH,
|
||||
/* passwordType= */ PASSWORD_QUALITY_NUMERIC,
|
||||
/* userEnteredPassword= */ LockscreenCredential.createNone(),
|
||||
@@ -397,7 +434,7 @@ public class ChooseLockPasswordTest {
|
||||
ShadowLockPatternUtils.setRequiredPasswordComplexity(PASSWORD_COMPLEXITY_LOW);
|
||||
ShadowLockPatternUtils.setRequiredPasswordComplexity(123, PASSWORD_COMPLEXITY_HIGH);
|
||||
|
||||
Intent intent = createIntentForPasswordValidation(PASSWORD_COMPLEXITY_NONE,
|
||||
Intent intent = createIntentForPasswordValidation(null, PASSWORD_COMPLEXITY_NONE,
|
||||
PASSWORD_QUALITY_NUMERIC);
|
||||
intent.putExtra(EXTRA_KEY_UNIFICATION_PROFILE_ID, 123);
|
||||
assertPasswordValidationResultForIntent(LockscreenCredential.createNone(), intent,
|
||||
@@ -423,10 +460,11 @@ public class ChooseLockPasswordTest {
|
||||
return Shadows.shadowOf(((GlifLayout) fragment.getView()).getIcon());
|
||||
}
|
||||
|
||||
private void assertPasswordValidationResult(@PasswordComplexity int minComplexity,
|
||||
private void assertPasswordValidationResult(PasswordMetrics minMetrics,
|
||||
@PasswordComplexity int minComplexity,
|
||||
int passwordType, LockscreenCredential userEnteredPassword,
|
||||
String... expectedValidationResult) {
|
||||
Intent intent = createIntentForPasswordValidation(minComplexity, passwordType);
|
||||
Intent intent = createIntentForPasswordValidation(minMetrics, minComplexity, passwordType);
|
||||
assertPasswordValidationResultForIntent(userEnteredPassword, intent,
|
||||
expectedValidationResult);
|
||||
}
|
||||
@@ -441,12 +479,14 @@ public class ChooseLockPasswordTest {
|
||||
}
|
||||
|
||||
private Intent createIntentForPasswordValidation(
|
||||
PasswordMetrics minMetrics,
|
||||
@PasswordComplexity int minComplexity,
|
||||
int passwordType) {
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra(CONFIRM_CREDENTIALS, false);
|
||||
intent.putExtra(PASSWORD_TYPE_KEY, passwordType);
|
||||
intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, minComplexity);
|
||||
intent.putExtra(ChooseLockPassword.EXTRA_KEY_MIN_METRICS, minMetrics);
|
||||
intent.putExtra(ChooseLockPassword.EXTRA_KEY_MIN_COMPLEXITY, minComplexity);
|
||||
return intent;
|
||||
}
|
||||
}
|
||||
|
@@ -24,6 +24,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_HIGH;
|
||||
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
|
||||
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME;
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_DEVICE_PASSWORD_REQUIREMENT_ONLY;
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN;
|
||||
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
|
||||
|
||||
@@ -300,6 +301,8 @@ public class SetNewPasswordActivityTest {
|
||||
Intent actualIntent = getLaunchChooseLockIntent(shadowActivity);
|
||||
assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PARENT_PROFILE_PASSWORD);
|
||||
assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
|
||||
assertThat(actualIntent.getBooleanExtra(
|
||||
EXTRA_KEY_DEVICE_PASSWORD_REQUIREMENT_ONLY, false)).isFalse();
|
||||
assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
|
||||
assertThat(actualIntent.getStringExtra(EXTRA_KEY_CALLER_APP_NAME)).isEqualTo(APP_LABEL);
|
||||
verify(mockMetricsProvider).action(
|
||||
@@ -309,6 +312,23 @@ public class SetNewPasswordActivityTest {
|
||||
PKG_NAME,
|
||||
Integer.MIN_VALUE);
|
||||
}
|
||||
@Test
|
||||
@Config(shadows = {ShadowPasswordUtils.class})
|
||||
public void launchChooseLock_setNewParentProfilePassword_DevicePasswordRequirementExtra() {
|
||||
Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
|
||||
Settings.Global.DEVICE_PROVISIONED, 1);
|
||||
|
||||
Intent intent = new Intent(ACTION_SET_NEW_PARENT_PROFILE_PASSWORD)
|
||||
.putExtra(DevicePolicyManager.EXTRA_DEVICE_PASSWORD_REQUIREMENT_ONLY, true);
|
||||
SetNewPasswordActivity activity =
|
||||
Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get();
|
||||
|
||||
ShadowActivity shadowActivity = Shadows.shadowOf(activity);
|
||||
Intent actualIntent = getLaunchChooseLockIntent(shadowActivity);
|
||||
|
||||
assertThat(actualIntent.getBooleanExtra(
|
||||
EXTRA_KEY_DEVICE_PASSWORD_REQUIREMENT_ONLY, false)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Config(shadows = {ShadowPasswordUtils.class})
|
||||
|
@@ -17,6 +17,7 @@
|
||||
package com.android.settings.testutils.shadow;
|
||||
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.app.admin.PasswordMetrics;
|
||||
import android.content.ComponentName;
|
||||
import android.os.UserHandle;
|
||||
|
||||
@@ -36,11 +37,17 @@ public class ShadowLockPatternUtils {
|
||||
|
||||
private static boolean sDeviceEncryptionEnabled;
|
||||
private static Map<Integer, Integer> sUserToComplexityMap = new HashMap<>();
|
||||
private static Map<Integer, Integer> sUserToProfileComplexityMap = new HashMap<>();
|
||||
private static Map<Integer, PasswordMetrics> sUserToMetricsMap = new HashMap<>();
|
||||
private static Map<Integer, PasswordMetrics> sUserToProfileMetricsMap = new HashMap<>();
|
||||
|
||||
|
||||
@Resetter
|
||||
public static void reset() {
|
||||
sUserToComplexityMap.clear();
|
||||
sUserToProfileComplexityMap.clear();
|
||||
sUserToMetricsMap.clear();
|
||||
sUserToProfileMetricsMap.clear();
|
||||
sDeviceEncryptionEnabled = false;
|
||||
}
|
||||
|
||||
@@ -91,15 +98,50 @@ public class ShadowLockPatternUtils {
|
||||
|
||||
@Implementation
|
||||
public @DevicePolicyManager.PasswordComplexity int getRequestedPasswordComplexity(int userId) {
|
||||
return sUserToComplexityMap.getOrDefault(userId,
|
||||
DevicePolicyManager.PASSWORD_COMPLEXITY_NONE);
|
||||
return getRequestedPasswordComplexity(userId, false);
|
||||
}
|
||||
|
||||
public static void setRequiredPasswordComplexity(int userId, int complexity) {
|
||||
sUserToComplexityMap.put(userId, complexity);
|
||||
@Implementation
|
||||
public @DevicePolicyManager.PasswordComplexity int getRequestedPasswordComplexity(int userId,
|
||||
boolean deviceWideOnly) {
|
||||
int complexity = sUserToComplexityMap.getOrDefault(userId,
|
||||
DevicePolicyManager.PASSWORD_COMPLEXITY_NONE);
|
||||
if (!deviceWideOnly) {
|
||||
complexity = Math.max(complexity, sUserToProfileComplexityMap.getOrDefault(userId,
|
||||
DevicePolicyManager.PASSWORD_COMPLEXITY_NONE));
|
||||
}
|
||||
return complexity;
|
||||
}
|
||||
|
||||
public static void setRequiredPasswordComplexity(int userHandle, int complexity) {
|
||||
sUserToComplexityMap.put(userHandle, complexity);
|
||||
}
|
||||
|
||||
public static void setRequiredPasswordComplexity(int complexity) {
|
||||
setRequiredPasswordComplexity(UserHandle.myUserId(), complexity);
|
||||
sUserToComplexityMap.put(UserHandle.myUserId(), complexity);
|
||||
}
|
||||
|
||||
public static void setRequiredProfilePasswordComplexity(int complexity) {
|
||||
sUserToProfileComplexityMap.put(UserHandle.myUserId(), complexity);
|
||||
}
|
||||
|
||||
@Implementation
|
||||
public PasswordMetrics getRequestedPasswordMetrics(int userId, boolean deviceWideOnly) {
|
||||
PasswordMetrics metrics = sUserToMetricsMap.getOrDefault(userId,
|
||||
new PasswordMetrics(LockPatternUtils.CREDENTIAL_TYPE_NONE));
|
||||
if (!deviceWideOnly) {
|
||||
metrics.maxWith(sUserToProfileMetricsMap.getOrDefault(userId,
|
||||
new PasswordMetrics(LockPatternUtils.CREDENTIAL_TYPE_NONE)));
|
||||
}
|
||||
return metrics;
|
||||
}
|
||||
|
||||
public static void setRequestedPasswordMetrics(PasswordMetrics metrics) {
|
||||
sUserToMetricsMap.put(UserHandle.myUserId(), metrics);
|
||||
}
|
||||
|
||||
public static void setRequestedProfilePasswordMetrics(PasswordMetrics metrics) {
|
||||
sUserToProfileMetricsMap.put(UserHandle.myUserId(), metrics);
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user