Loading res/values/strings.xml +5 −3 Original line number Diff line number Diff line Loading @@ -1410,9 +1410,6 @@ <item quantity="other">Must be fewer than <xliff:g id="number" example="17">%d</xliff:g> digits</item> </plurals> <!-- Error shown when in PIN mode and user enters a non-digit --> <string name="lockpassword_pin_contains_non_digits">Must contain only digits 0-9</string> <!-- Error shown when in PIN mode and PIN has been used recently. Please keep this string short! --> <string name="lockpassword_pin_recently_used">Device admin doesn\'t allow using a recent PIN</string> Loading Loading @@ -1467,6 +1464,11 @@ <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> non-letter characters</item> </plurals> <plurals name="lockpassword_password_requires_nonnumerical"> <item quantity="one">Must contain at least 1 non-numerical character</item> <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> non-numerical characters</item> </plurals> <!-- Error shown when in PASSWORD mode and password has been used recently. Please keep this string short! --> <string name="lockpassword_password_recently_used">Device admin doesn\'t allow using a recent password</string> Loading src/com/android/settings/password/ChooseLockGenericController.java +1 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ public class ChooseLockGenericController { */ public int upgradeQuality(int quality) { // Compare specified quality and dpm quality // TODO(b/142781408): convert from quality to credential type once PIN is supported. int dpmUpgradedQuality = Math.max(quality, mDpm.getPasswordQuality(null, mUserId)); return Math.max(dpmUpgradedQuality, PasswordMetrics.complexityLevelToMinQuality(mRequestedMinComplexity)); Loading src/com/android/settings/password/ChooseLockPassword.java +110 −315 File changed.Preview size limit exceeded, changes collapsed. Show changes tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +35 −13 Original line number Diff line number Diff line Loading @@ -77,7 +77,6 @@ public class ChooseLockPasswordTest { SettingsShadowResources.overrideResource( com.android.internal.R.string.config_headlineFontFamily, ""); mShadowDpm = ShadowDevicePolicyManager.getShadow(); mShadowDpm.setPasswordMaximumLength(16); } @After Loading Loading @@ -157,7 +156,7 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 1 letter", "Must contain at least 1 non-numerical character", "Must be at least 10 characters"); } Loading @@ -180,7 +179,7 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 1 letter", "Must contain at least 1 non-numerical character", "Must be at least 4 characters"); } Loading @@ -193,7 +192,7 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_LOW, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 1 letter", "Must contain at least 1 non-numerical character", "Must contain at least 1 numerical digit", "Must be at least 9 characters"); } Loading @@ -220,7 +219,9 @@ public class ChooseLockPasswordTest { /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 2 special symbols", "Must be at least 6 characters"); "Must be at least 6 characters", "Must contain at least 1 letter", "Must contain at least 1 numerical digit"); } @Test Loading Loading @@ -280,7 +281,7 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_LOW, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createPassword("12345678"), "Must contain at least 1 letter"); "Ascending, descending, or repeated sequence of digits isn't allowed"); } @Test Loading @@ -291,8 +292,8 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 1 letter", "Must be at least 6 characters"); "Must be at least 6 characters", "Must contain at least 1 non-numerical character"); } @Test Loading @@ -303,8 +304,8 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createPassword("1"), "Must contain at least 1 letter", "Must be at least 6 characters"); "Must be at least 6 characters", "Must contain at least 1 non-numerical character"); } @Test Loading @@ -329,6 +330,28 @@ public class ChooseLockPasswordTest { "Must be at least 6 characters"); } @Test public void processAndValidatePasswordRequirements_defaultPinMinimumLength() { mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED); assertPasswordValidationResult( /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, /* passwordType= */ PASSWORD_QUALITY_NUMERIC, /* userEnteredPassword= */ LockscreenCredential.createPassword("11"), "PIN must be at least 4 digits"); } @Test public void processAndValidatePasswordRequirements_maximumLength() { mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED); assertPasswordValidationResult( /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, LockscreenCredential.createPassword("01234567890123456789"), "Must be fewer than 17 characters"); } @Test public void assertThat_chooseLockIconChanged_WhenFingerprintExtraSet() { ShadowDrawable drawable = setActivityAndGetIconDrawable(true); Loading Loading @@ -369,9 +392,8 @@ public class ChooseLockPasswordTest { intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, minComplexity); ChooseLockPassword activity = buildChooseLockPasswordActivity(intent); ChooseLockPasswordFragment fragment = getChooseLockPasswordFragment(activity); int validateResult = fragment.validatePassword(userEnteredPassword); String[] messages = fragment.convertErrorCodeToMessages(validateResult); fragment.validatePassword(userEnteredPassword); String[] messages = fragment.convertErrorCodeToMessages(); assertThat(messages).asList().containsExactly((Object[]) expectedValidationResult); } } tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java +8 −22 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.admin.DevicePolicyManager; import android.app.admin.PasswordMetrics; import android.app.admin.PasswordPolicy; import android.content.ComponentName; import org.robolectric.RuntimeEnvironment; Loading @@ -26,7 +28,6 @@ public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDev private ComponentName mDeviceOwnerComponentName; private int mDeviceOwnerUserId = -1; private int mPasswordMinQuality = PASSWORD_QUALITY_UNSPECIFIED; private int mPasswordMaxLength = 16; private int mPasswordMinLength = 0; private int mPasswordMinSymbols = 0; Loading Loading @@ -77,41 +78,26 @@ public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDev } @Implementation public int getPasswordQuality(ComponentName admin, int userHandle) { return mPasswordMinQuality; public PasswordMetrics getPasswordMinimumMetrics(int userHandle) { PasswordPolicy policy = new PasswordPolicy(); policy.quality = mPasswordMinQuality; policy.length = mPasswordMinLength; policy.symbols = mPasswordMinSymbols; return policy.getMinMetrics(); } public void setPasswordQuality(int quality) { mPasswordMinQuality = quality; } @Implementation public int getPasswordMinimumLength(ComponentName admin, int userHandle) { return mPasswordMinLength; } public void setPasswordMinimumLength(int length) { mPasswordMinLength = length; } @Implementation public int getPasswordMinimumSymbols(ComponentName admin, int userHandle) { return mPasswordMinSymbols; } public void setPasswordMinimumSymbols(int numOfSymbols) { mPasswordMinSymbols = numOfSymbols; } @Implementation public int getPasswordMaximumLength(int quality) { return mPasswordMaxLength; } public void setPasswordMaximumLength(int length) { mPasswordMaxLength = length; } public static ShadowDevicePolicyManager getShadow() { return (ShadowDevicePolicyManager) Shadow.extract( RuntimeEnvironment.application.getSystemService(DevicePolicyManager.class)); Loading Loading
res/values/strings.xml +5 −3 Original line number Diff line number Diff line Loading @@ -1410,9 +1410,6 @@ <item quantity="other">Must be fewer than <xliff:g id="number" example="17">%d</xliff:g> digits</item> </plurals> <!-- Error shown when in PIN mode and user enters a non-digit --> <string name="lockpassword_pin_contains_non_digits">Must contain only digits 0-9</string> <!-- Error shown when in PIN mode and PIN has been used recently. Please keep this string short! --> <string name="lockpassword_pin_recently_used">Device admin doesn\'t allow using a recent PIN</string> Loading Loading @@ -1467,6 +1464,11 @@ <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> non-letter characters</item> </plurals> <plurals name="lockpassword_password_requires_nonnumerical"> <item quantity="one">Must contain at least 1 non-numerical character</item> <item quantity="other">Must contain at least <xliff:g id="count" example="3">%d</xliff:g> non-numerical characters</item> </plurals> <!-- Error shown when in PASSWORD mode and password has been used recently. Please keep this string short! --> <string name="lockpassword_password_recently_used">Device admin doesn\'t allow using a recent password</string> Loading
src/com/android/settings/password/ChooseLockGenericController.java +1 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ public class ChooseLockGenericController { */ public int upgradeQuality(int quality) { // Compare specified quality and dpm quality // TODO(b/142781408): convert from quality to credential type once PIN is supported. int dpmUpgradedQuality = Math.max(quality, mDpm.getPasswordQuality(null, mUserId)); return Math.max(dpmUpgradedQuality, PasswordMetrics.complexityLevelToMinQuality(mRequestedMinComplexity)); Loading
src/com/android/settings/password/ChooseLockPassword.java +110 −315 File changed.Preview size limit exceeded, changes collapsed. Show changes
tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +35 −13 Original line number Diff line number Diff line Loading @@ -77,7 +77,6 @@ public class ChooseLockPasswordTest { SettingsShadowResources.overrideResource( com.android.internal.R.string.config_headlineFontFamily, ""); mShadowDpm = ShadowDevicePolicyManager.getShadow(); mShadowDpm.setPasswordMaximumLength(16); } @After Loading Loading @@ -157,7 +156,7 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 1 letter", "Must contain at least 1 non-numerical character", "Must be at least 10 characters"); } Loading @@ -180,7 +179,7 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_MEDIUM, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 1 letter", "Must contain at least 1 non-numerical character", "Must be at least 4 characters"); } Loading @@ -193,7 +192,7 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_LOW, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 1 letter", "Must contain at least 1 non-numerical character", "Must contain at least 1 numerical digit", "Must be at least 9 characters"); } Loading @@ -220,7 +219,9 @@ public class ChooseLockPasswordTest { /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 2 special symbols", "Must be at least 6 characters"); "Must be at least 6 characters", "Must contain at least 1 letter", "Must contain at least 1 numerical digit"); } @Test Loading Loading @@ -280,7 +281,7 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_LOW, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createPassword("12345678"), "Must contain at least 1 letter"); "Ascending, descending, or repeated sequence of digits isn't allowed"); } @Test Loading @@ -291,8 +292,8 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createNone(), "Must contain at least 1 letter", "Must be at least 6 characters"); "Must be at least 6 characters", "Must contain at least 1 non-numerical character"); } @Test Loading @@ -303,8 +304,8 @@ public class ChooseLockPasswordTest { /* minComplexity= */ PASSWORD_COMPLEXITY_HIGH, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, /* userEnteredPassword= */ LockscreenCredential.createPassword("1"), "Must contain at least 1 letter", "Must be at least 6 characters"); "Must be at least 6 characters", "Must contain at least 1 non-numerical character"); } @Test Loading @@ -329,6 +330,28 @@ public class ChooseLockPasswordTest { "Must be at least 6 characters"); } @Test public void processAndValidatePasswordRequirements_defaultPinMinimumLength() { mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED); assertPasswordValidationResult( /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, /* passwordType= */ PASSWORD_QUALITY_NUMERIC, /* userEnteredPassword= */ LockscreenCredential.createPassword("11"), "PIN must be at least 4 digits"); } @Test public void processAndValidatePasswordRequirements_maximumLength() { mShadowDpm.setPasswordQuality(PASSWORD_QUALITY_UNSPECIFIED); assertPasswordValidationResult( /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC, LockscreenCredential.createPassword("01234567890123456789"), "Must be fewer than 17 characters"); } @Test public void assertThat_chooseLockIconChanged_WhenFingerprintExtraSet() { ShadowDrawable drawable = setActivityAndGetIconDrawable(true); Loading Loading @@ -369,9 +392,8 @@ public class ChooseLockPasswordTest { intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, minComplexity); ChooseLockPassword activity = buildChooseLockPasswordActivity(intent); ChooseLockPasswordFragment fragment = getChooseLockPasswordFragment(activity); int validateResult = fragment.validatePassword(userEnteredPassword); String[] messages = fragment.convertErrorCodeToMessages(validateResult); fragment.validatePassword(userEnteredPassword); String[] messages = fragment.convertErrorCodeToMessages(); assertThat(messages).asList().containsExactly((Object[]) expectedValidationResult); } }
tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java +8 −22 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.admin.DevicePolicyManager; import android.app.admin.PasswordMetrics; import android.app.admin.PasswordPolicy; import android.content.ComponentName; import org.robolectric.RuntimeEnvironment; Loading @@ -26,7 +28,6 @@ public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDev private ComponentName mDeviceOwnerComponentName; private int mDeviceOwnerUserId = -1; private int mPasswordMinQuality = PASSWORD_QUALITY_UNSPECIFIED; private int mPasswordMaxLength = 16; private int mPasswordMinLength = 0; private int mPasswordMinSymbols = 0; Loading Loading @@ -77,41 +78,26 @@ public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDev } @Implementation public int getPasswordQuality(ComponentName admin, int userHandle) { return mPasswordMinQuality; public PasswordMetrics getPasswordMinimumMetrics(int userHandle) { PasswordPolicy policy = new PasswordPolicy(); policy.quality = mPasswordMinQuality; policy.length = mPasswordMinLength; policy.symbols = mPasswordMinSymbols; return policy.getMinMetrics(); } public void setPasswordQuality(int quality) { mPasswordMinQuality = quality; } @Implementation public int getPasswordMinimumLength(ComponentName admin, int userHandle) { return mPasswordMinLength; } public void setPasswordMinimumLength(int length) { mPasswordMinLength = length; } @Implementation public int getPasswordMinimumSymbols(ComponentName admin, int userHandle) { return mPasswordMinSymbols; } public void setPasswordMinimumSymbols(int numOfSymbols) { mPasswordMinSymbols = numOfSymbols; } @Implementation public int getPasswordMaximumLength(int quality) { return mPasswordMaxLength; } public void setPasswordMaximumLength(int length) { mPasswordMaxLength = length; } public static ShadowDevicePolicyManager getShadow() { return (ShadowDevicePolicyManager) Shadow.extract( RuntimeEnvironment.application.getSystemService(DevicePolicyManager.class)); Loading