diff --git a/core/java/android/app/admin/PasswordMetrics.java b/core/java/android/app/admin/PasswordMetrics.java index 20a60bbe09740..c95a74e0f333c 100644 --- a/core/java/android/app/admin/PasswordMetrics.java +++ b/core/java/android/app/admin/PasswordMetrics.java @@ -406,11 +406,6 @@ public final class PasswordMetrics implements Parcelable { return containsNonNumeric ? 6 : 8; } - @Override - boolean allowsNumericPassword() { - return false; - } - @Override boolean allowsCredType(int credType) { return credType == CREDENTIAL_TYPE_PASSWORD; @@ -427,11 +422,6 @@ public final class PasswordMetrics implements Parcelable { return 4; } - @Override - boolean allowsNumericPassword() { - return false; - } - @Override boolean allowsCredType(int credType) { return credType == CREDENTIAL_TYPE_PASSWORD; @@ -448,11 +438,6 @@ public final class PasswordMetrics implements Parcelable { return 0; } - @Override - boolean allowsNumericPassword() { - return true; - } - @Override boolean allowsCredType(int credType) { return credType != CREDENTIAL_TYPE_NONE; @@ -469,11 +454,6 @@ public final class PasswordMetrics implements Parcelable { return 0; } - @Override - boolean allowsNumericPassword() { - return true; - } - @Override boolean allowsCredType(int credType) { return true; @@ -484,7 +464,6 @@ public final class PasswordMetrics implements Parcelable { abstract boolean canHaveSequence(); abstract int getMinimumLength(boolean containsNonNumeric); - abstract boolean allowsNumericPassword(); abstract boolean allowsCredType(int credType); ComplexityBucket(int complexityLevel) { @@ -591,7 +570,14 @@ public final class PasswordMetrics implements Parcelable { result.add(new PasswordValidationError(TOO_LONG, MAX_PASSWORD_LENGTH)); } - final PasswordMetrics minMetrics = applyComplexity(adminMetrics, isPin, bucket); + // A flag indicating whether the provided password already has non-numeric characters in + // it or if the admin imposes the requirement of any non-numeric characters. + final boolean hasOrWouldNeedNonNumeric = + actualMetrics.nonNumeric > 0 || adminMetrics.nonNumeric > 0 + || adminMetrics.letters > 0 || adminMetrics.lowerCase > 0 + || adminMetrics.upperCase > 0 || adminMetrics.symbols > 0; + final PasswordMetrics minMetrics = + applyComplexity(adminMetrics, hasOrWouldNeedNonNumeric, bucket); // Clamp required length between maximum and minimum valid values. minMetrics.length = Math.min(MAX_PASSWORD_LENGTH, @@ -684,23 +670,23 @@ public final class PasswordMetrics implements Parcelable { * TODO: move to PasswordPolicy */ public static PasswordMetrics applyComplexity( - PasswordMetrics adminMetrics, boolean isPin, int complexity) { - return applyComplexity(adminMetrics, isPin, ComplexityBucket.forComplexity(complexity)); + PasswordMetrics adminMetrics, boolean withNonNumericCharacters, + int complexity) { + return applyComplexity(adminMetrics, withNonNumericCharacters, + ComplexityBucket.forComplexity(complexity)); } private static PasswordMetrics applyComplexity( - PasswordMetrics adminMetrics, boolean isPin, ComplexityBucket bucket) { + PasswordMetrics adminMetrics, boolean withNonNumericCharacters, + ComplexityBucket bucket) { final PasswordMetrics minMetrics = new PasswordMetrics(adminMetrics); if (!bucket.canHaveSequence()) { minMetrics.seqLength = Math.min(minMetrics.seqLength, MAX_ALLOWED_SEQUENCE); } - minMetrics.length = Math.max(minMetrics.length, bucket.getMinimumLength(!isPin)); - - if (!isPin && !bucket.allowsNumericPassword()) { - minMetrics.nonNumeric = Math.max(minMetrics.nonNumeric, 1); - } + minMetrics.length = Math.max(minMetrics.length, + bucket.getMinimumLength(withNonNumericCharacters)); return minMetrics; }