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:
Rubin Xu
2021-01-05 16:47:51 +00:00
parent 844bfb3683
commit ff1b547548
10 changed files with 334 additions and 111 deletions

View File

@@ -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);
}
}