import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
-import android.security.KeyStore;
import androidx.annotation.StringRes;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
private static final String TAG = "ChooseLockGenericFragment";
- private static final int MIN_PASSWORD_LENGTH = 4;
private static final String KEY_SKIP_FINGERPRINT = "unlock_skip_fingerprint";
private static final String PASSWORD_CONFIRMED = "password_confirmed";
private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
private ChooseLockSettingsHelper mChooseLockSettingsHelper;
private DevicePolicyManager mDPM;
- private KeyStore mKeyStore;
private boolean mHasChallenge = false;
private long mChallenge;
private boolean mPasswordConfirmed = false;
String chooseLockAction = getActivity().getIntent().getAction();
mFingerprintManager = Utils.getFingerprintManagerOrNull(getActivity());
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
- mKeyStore = KeyStore.getInstance();
mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
mLockPatternUtils = new LockPatternUtils(getActivity());
mIsSetNewPassword = ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(chooseLockAction)
return mManagedPasswordProvider.createIntent(false, password);
}
- protected Intent getLockPasswordIntent(int quality, int minLength, int maxLength) {
+ protected Intent getLockPasswordIntent(int quality) {
ChooseLockPassword.IntentBuilder builder =
new ChooseLockPassword.IntentBuilder(getContext())
.setPasswordQuality(quality)
- .setPasswordLengthRange(minLength, maxLength)
.setForFingerprint(mForFingerprint)
.setUserId(mUserId);
if (mHasChallenge) {
if (quality >= DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
intent = getLockManagedPasswordIntent(mUserPassword);
} else if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
- int minLength = mDPM.getPasswordMinimumLength(null, mUserId);
- if (minLength < MIN_PASSWORD_LENGTH) {
- minLength = MIN_PASSWORD_LENGTH;
- }
- final int maxLength = mDPM.getPasswordMaximumLength(quality);
- intent = getLockPasswordIntent(quality, minLength, maxLength);
+ intent = getLockPasswordIntent(quality);
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
intent = getLockPatternIntent();
}
import java.util.List;
public class ChooseLockPassword extends SettingsActivity {
- public static final String PASSWORD_MIN_KEY = "lockscreen.password_min";
- public static final String PASSWORD_MAX_KEY = "lockscreen.password_max";
- public static final String PASSWORD_MIN_LETTERS_KEY = "lockscreen.password_min_letters";
- public static final String PASSWORD_MIN_LOWERCASE_KEY = "lockscreen.password_min_lowercase";
- public static final String PASSWORD_MIN_UPPERCASE_KEY = "lockscreen.password_min_uppercase";
- public static final String PASSWORD_MIN_NUMERIC_KEY = "lockscreen.password_min_numeric";
- public static final String PASSWORD_MIN_SYMBOLS_KEY = "lockscreen.password_min_symbols";
- public static final String PASSWORD_MIN_NONLETTER_KEY = "lockscreen.password_min_nonletter";
-
private static final String TAG = "ChooseLockPassword";
@Override
return this;
}
- public IntentBuilder setPasswordLengthRange(int min, int max) {
- mIntent.putExtra(PASSWORD_MIN_KEY, min);
- mIntent.putExtra(PASSWORD_MAX_KEY, max);
- return this;
- }
-
public IntentBuilder setUserId(int userId) {
mIntent.putExtra(Intent.EXTRA_USER_ID, userId);
return this;
}
private void setupPasswordRequirementsView(View view) {
- // Construct passwordRequirements and requirementDescriptions.
- List<Integer> passwordRequirements = new ArrayList<>();
- List<String> requirementDescriptions = new ArrayList<>();
+ final List<Integer> passwordRequirements = new ArrayList<>();
if (mPasswordMinUpperCase > 0) {
passwordRequirements.add(MIN_UPPER_LETTERS_IN_PASSWORD);
- requirementDescriptions.add(getResources().getQuantityString(
- R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase,
- mPasswordMinUpperCase));
}
if (mPasswordMinLowerCase > 0) {
passwordRequirements.add(MIN_LOWER_LETTERS_IN_PASSWORD);
- requirementDescriptions.add(getResources().getQuantityString(
- R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase,
- mPasswordMinLowerCase));
}
if (mPasswordMinLetters > 0) {
if (mPasswordMinLetters > mPasswordMinUpperCase + mPasswordMinLowerCase) {
passwordRequirements.add(MIN_LETTER_IN_PASSWORD);
- requirementDescriptions.add(getResources().getQuantityString(
- R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters,
- mPasswordMinLetters));
}
}
if (mPasswordMinNumeric > 0) {
passwordRequirements.add(MIN_NUMBER_IN_PASSWORD);
- requirementDescriptions.add(getResources().getQuantityString(
- R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric,
- mPasswordMinNumeric));
}
if (mPasswordMinSymbols > 0) {
passwordRequirements.add(MIN_SYMBOLS_IN_PASSWORD);
- requirementDescriptions.add(getResources().getQuantityString(
- R.plurals.lockpassword_password_requires_symbols, mPasswordMinSymbols,
- mPasswordMinSymbols));
}
if (mPasswordMinNonLetter > 0) {
if (mPasswordMinNonLetter > mPasswordMinNumeric + mPasswordMinSymbols) {
passwordRequirements.add(MIN_NON_LETTER_IN_PASSWORD);
- requirementDescriptions.add(getResources().getQuantityString(
- R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter,
-
- mPasswordMinNonLetter));
}
}
// Convert list to array.
mPasswordRequirements = passwordRequirements.stream().mapToInt(i -> i).toArray();
- mPasswordRestrictionView =
- (RecyclerView) view.findViewById(R.id.password_requirements_view);
+ mPasswordRestrictionView = view.findViewById(R.id.password_requirements_view);
mPasswordRestrictionView.setLayoutManager(new LinearLayoutManager(getActivity()));
mPasswordRequirementAdapter = new PasswordRequirementAdapter();
mPasswordRestrictionView.setAdapter(mPasswordRequirementAdapter);
final int dpmPasswordQuality = mLockPatternUtils.getRequestedPasswordQuality(mUserId);
mRequestedQuality = Math.max(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY,
mRequestedQuality), dpmPasswordQuality);
- mPasswordMinLength = Math.max(Math.max(
- LockPatternUtils.MIN_LOCK_PASSWORD_SIZE,
- intent.getIntExtra(PASSWORD_MIN_KEY, mPasswordMinLength)),
+ mPasswordMinLength = Math.max(LockPatternUtils.MIN_LOCK_PASSWORD_SIZE,
mLockPatternUtils.getRequestedMinimumPasswordLength(mUserId));
- mPasswordMaxLength = intent.getIntExtra(PASSWORD_MAX_KEY, mPasswordMaxLength);
- mPasswordMinLetters = Math.max(intent.getIntExtra(PASSWORD_MIN_LETTERS_KEY,
- mPasswordMinLetters), mLockPatternUtils.getRequestedPasswordMinimumLetters(
- mUserId));
- mPasswordMinUpperCase = Math.max(intent.getIntExtra(PASSWORD_MIN_UPPERCASE_KEY,
- mPasswordMinUpperCase), mLockPatternUtils.getRequestedPasswordMinimumUpperCase(
- mUserId));
- mPasswordMinLowerCase = Math.max(intent.getIntExtra(PASSWORD_MIN_LOWERCASE_KEY,
- mPasswordMinLowerCase), mLockPatternUtils.getRequestedPasswordMinimumLowerCase(
- mUserId));
- mPasswordMinNumeric = Math.max(intent.getIntExtra(PASSWORD_MIN_NUMERIC_KEY,
- mPasswordMinNumeric), mLockPatternUtils.getRequestedPasswordMinimumNumeric(
- mUserId));
- mPasswordMinSymbols = Math.max(intent.getIntExtra(PASSWORD_MIN_SYMBOLS_KEY,
- mPasswordMinSymbols), mLockPatternUtils.getRequestedPasswordMinimumSymbols(
- mUserId));
- mPasswordMinNonLetter = Math.max(intent.getIntExtra(PASSWORD_MIN_NONLETTER_KEY,
- mPasswordMinNonLetter), mLockPatternUtils.getRequestedPasswordMinimumNonLetter(
- mUserId));
+ mPasswordMaxLength = mLockPatternUtils.getMaximumPasswordLength(mRequestedQuality);
+ mPasswordMinLetters = mLockPatternUtils.getRequestedPasswordMinimumLetters(mUserId);
+ mPasswordMinUpperCase = mLockPatternUtils.getRequestedPasswordMinimumUpperCase(mUserId);
+ mPasswordMinLowerCase = mLockPatternUtils.getRequestedPasswordMinimumLowerCase(mUserId);
+ mPasswordMinNumeric = mLockPatternUtils.getRequestedPasswordMinimumNumeric(mUserId);
+ mPasswordMinSymbols = mLockPatternUtils.getRequestedPasswordMinimumSymbols(mUserId);
+ mPasswordMinNonLetter = mLockPatternUtils.getRequestedPasswordMinimumNonLetter(mUserId);
// Modify the value based on dpm policy.
switch (dpmPasswordQuality) {
Intent intent = new IntentBuilder(application)
.setPassword("password")
.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC)
- .setPasswordLengthRange(123, 456)
.setUserId(123)
.build();
assertThat(intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD))
.named("EXTRA_KEY_PASSWORD")
.isEqualTo("password");
- assertThat(intent.getIntExtra(ChooseLockPassword.PASSWORD_MIN_KEY, 0))
- .named("PASSWORD_MIN_KEY")
- .isEqualTo(123);
- assertThat(intent.getIntExtra(ChooseLockPassword.PASSWORD_MAX_KEY, 0))
- .named("PASSWORD_MAX_KEY")
- .isEqualTo(456);
assertThat(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, 0))
.named("PASSWORD_TYPE_KEY")
.isEqualTo(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
Intent intent = new IntentBuilder(application)
.setChallenge(12345L)
.setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC)
- .setPasswordLengthRange(123, 456)
.setUserId(123)
.build();
assertThat(intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0L))
.named("EXTRA_KEY_CHALLENGE")
.isEqualTo(12345L);
- assertThat(intent.getIntExtra(ChooseLockPassword.PASSWORD_MIN_KEY, 0))
- .named("PASSWORD_MIN_KEY")
- .isEqualTo(123);
- assertThat(intent.getIntExtra(ChooseLockPassword.PASSWORD_MAX_KEY, 0))
- .named("PASSWORD_MAX_KEY")
- .isEqualTo(456);
assertThat(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, 0))
.named("PASSWORD_TYPE_KEY")
.isEqualTo(DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);