[LockSettings] pipe old password through when setting new one
Change-Id: Ia98b93d1cdb8c2d0bff42de7ecb59f5b80fb780e
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index f4e3c4e..51614a6 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -94,6 +94,7 @@
private int mEncryptionRequestQuality;
private boolean mEncryptionRequestDisabled;
private boolean mRequirePassword;
+ private String mUserPassword;
private LockPatternUtils mLockPatternUtils;
private FingerprintManager mFingerprintManager;
private RemovalCallback mRemovalCallback = new RemovalCallback() {
@@ -146,7 +147,7 @@
ChooseLockSettingsHelper helper =
new ChooseLockSettingsHelper(this.getActivity(), this);
if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
- getString(R.string.unlock_set_unlock_launch_picker_title))) {
+ getString(R.string.unlock_set_unlock_launch_picker_title), true)) {
mPasswordConfirmed = true; // no password set, so no need to confirm
updatePreferencesOrFinish();
} else {
@@ -177,6 +178,8 @@
* @param quality
* @param disabled
*/
+ // TODO: why does this take disabled, its always called with a quality higher than
+ // what makes sense with disabled == true
private void maybeEnableEncryption(int quality, boolean disabled) {
if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) {
mEncryptionRequestQuality = quality;
@@ -201,6 +204,7 @@
mWaitingForConfirmation = false;
if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
mPasswordConfirmed = true;
+ mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
updatePreferencesOrFinish();
} else if (requestCode == ENABLE_ENCRYPTION_REQUEST
&& resultCode == Activity.RESULT_OK) {
@@ -385,12 +389,27 @@
maxLength, requirePasswordToDecrypt, confirmCredentials);
}
+ // SetupWizard version will not need this as they will never be changing a password
+ // TODO: confirm
+ private Intent getLockPasswordIntent(Context context, int quality, int minLength,
+ final int maxLength, boolean requirePasswordToDecrypt, String password) {
+ return ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
+ requirePasswordToDecrypt, password);
+ }
+
protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
final boolean confirmCredentials) {
return ChooseLockPattern.createIntent(context, requirePassword,
confirmCredentials);
}
+ // SetupWizard version will not need this as they will never be changing a password
+ // TODO: confirm
+ private Intent getLockPatternIntent(Context context, final boolean requirePassword,
+ final String pattern) {
+ return ChooseLockPattern.createIntent(context, requirePassword, pattern);
+ }
+
protected Intent getEncryptionInterstitialIntent(Context context, int quality,
boolean required) {
return EncryptionInterstitial.createStartIntent(context, quality, required);
@@ -421,11 +440,11 @@
}
final int maxLength = mDPM.getPasswordMaximumLength(quality);
Intent intent = getLockPasswordIntent(context, quality, minLength,
- maxLength, mRequirePassword, /* confirm credentials */false);
+ maxLength, mRequirePassword, mUserPassword);
startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
Intent intent = getLockPatternIntent(context, mRequirePassword,
- /* confirm credentials */false);
+ mUserPassword);
startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
mChooseLockSettingsHelper.utils().clearLock();
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 8838286..7ef044a 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -76,6 +76,14 @@
return intent;
}
+ public static Intent createIntent(Context context, int quality,
+ int minLength, final int maxLength, boolean requirePasswordToDecrypt, String password) {
+ Intent intent = createIntent(context, quality, minLength, maxLength, requirePasswordToDecrypt,
+ false);
+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password);
+ return intent;
+ }
+
@Override
protected boolean isValidFragment(String fragmentName) {
if (ChooseLockPasswordFragment.class.getName().equals(fragmentName)) return true;
@@ -101,6 +109,9 @@
implements OnClickListener, OnEditorActionListener, TextWatcher {
private static final String KEY_FIRST_PIN = "first_pin";
private static final String KEY_UI_STAGE = "ui_stage";
+ private static final String KEY_CURRENT_PASSWORD = "current_password";
+
+ private String mCurrentPassword;
private TextView mPasswordEntry;
private int mPasswordMinLength = LockPatternUtils.MIN_LOCK_PASSWORD_SIZE;
private int mPasswordMaxLength = 16;
@@ -239,19 +250,25 @@
Intent intent = getActivity().getIntent();
final boolean confirmCredentials = intent.getBooleanExtra("confirm_credentials", true);
+ mCurrentPassword = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
if (savedInstanceState == null) {
updateStage(Stage.Introduction);
if (confirmCredentials) {
mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
- getString(R.string.unlock_set_unlock_launch_picker_title));
+ getString(R.string.unlock_set_unlock_launch_picker_title), true);
}
} else {
+ // restore from previous state
mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN);
final String state = savedInstanceState.getString(KEY_UI_STAGE);
if (state != null) {
mUiStage = Stage.valueOf(state);
updateStage(mUiStage);
}
+
+ if (mCurrentPassword == null) {
+ mCurrentPassword = savedInstanceState.getString(KEY_CURRENT_PASSWORD);
+ }
}
mDone = false;
if (activity instanceof SettingsActivity) {
@@ -287,6 +304,7 @@
super.onSaveInstanceState(outState);
outState.putString(KEY_UI_STAGE, mUiStage.name());
outState.putString(KEY_FIRST_PIN, mFirstPin);
+ outState.putString(KEY_CURRENT_PASSWORD, mCurrentPassword);
}
@Override
@@ -298,6 +316,9 @@
if (resultCode != Activity.RESULT_OK) {
getActivity().setResult(RESULT_FINISHED);
getActivity().finish();
+ } else {
+ mCurrentPassword = data.getStringExtra(
+ ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
}
break;
}
@@ -441,7 +462,7 @@
final boolean required = getActivity().getIntent().getBooleanExtra(
EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
mLockPatternUtils.setCredentialRequiredToDecrypt(required);
- mLockPatternUtils.saveLockPassword(pin, mRequestedQuality);
+ mLockPatternUtils.saveLockPassword(pin, mCurrentPassword, mRequestedQuality);
getActivity().setResult(RESULT_FINISHED);
getActivity().finish();
mDone = true;
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 8892346..c516ad0 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -77,6 +77,13 @@
return intent;
}
+ public static Intent createIntent(Context context,
+ boolean requirePassword, String pattern) {
+ Intent intent = createIntent(context, requirePassword, false);
+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pattern);
+ return intent;
+ }
+
@Override
protected boolean isValidFragment(String fragmentName) {
if (ChooseLockPatternFragment.class.getName().equals(fragmentName)) return true;
@@ -115,6 +122,7 @@
private static final int ID_EMPTY_MESSAGE = -1;
+ private String mCurrentPattern;
protected TextView mHeaderText;
protected LockPatternView mLockPatternView;
protected TextView mFooterText;
@@ -142,7 +150,11 @@
if (resultCode != Activity.RESULT_OK) {
getActivity().setResult(RESULT_FINISHED);
getActivity().finish();
+ } else {
+ mCurrentPattern = data.getStringExtra(
+ ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
}
+
updateStage(Stage.Introduction);
break;
}
@@ -329,6 +341,7 @@
private static final String KEY_UI_STAGE = "uiStage";
private static final String KEY_PATTERN_CHOICE = "chosenPattern";
+ private static final String KEY_CURRENT_PATTERN = "currentPattern";
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -371,6 +384,8 @@
final boolean confirmCredentials = getActivity().getIntent()
.getBooleanExtra("confirm_credentials", true);
+ mCurrentPattern = getActivity().getIntent()
+ .getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
if (savedInstanceState == null) {
if (confirmCredentials) {
@@ -380,7 +395,7 @@
boolean launchedConfirmationActivity =
mChooseLockSettingsHelper.launchConfirmationActivity(
CONFIRM_EXISTING_REQUEST,
- getString(R.string.unlock_set_unlock_launch_picker_title));
+ getString(R.string.unlock_set_unlock_launch_picker_title), true);
if (!launchedConfirmationActivity) {
updateStage(Stage.Introduction);
}
@@ -393,6 +408,10 @@
if (patternString != null) {
mChosenPattern = LockPatternUtils.stringToPattern(patternString);
}
+
+ if (mCurrentPattern == null) {
+ mCurrentPattern = savedInstanceState.getString(KEY_CURRENT_PATTERN);
+ }
updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]);
}
mDone = false;
@@ -472,6 +491,11 @@
outState.putString(KEY_PATTERN_CHOICE,
LockPatternUtils.patternToString(mChosenPattern));
}
+
+ if (mCurrentPattern != null) {
+ outState.putString(KEY_CURRENT_PATTERN,
+ mCurrentPattern);
+ }
}
/**
@@ -571,8 +595,9 @@
final boolean required = getActivity().getIntent().getBooleanExtra(
EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
+
utils.setCredentialRequiredToDecrypt(required);
- utils.saveLockPattern(mChosenPattern);
+ utils.saveLockPattern(mChosenPattern, mCurrentPattern);
if (lockVirgin) {
utils.setVisiblePatternEnabled(true);