Several fixes to new EncryptionInterstitial dialog.
The code now observes whether accessibility is turned on when
deciding the default state.
Additionally, it fixes a bug where the user can back out of
EncryptionInterstitial and leave the setting in a bad state.
We now propagate the state until the place where it ultimately
gets stored.
Also fixes problem where Encryption was ignoring the state
where the device was already encrypted.
Fixes bug 17881324
Change-Id: Iec09e4464832a506bb2a78bb14a38b3531971fa0
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index 89ba20b..a3deb00 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -45,6 +45,7 @@
import java.util.List;
public class ChooseLockGeneric extends SettingsActivity {
+ public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
@Override
public Intent getIntent() {
@@ -75,7 +76,7 @@
private static final int FALLBACK_REQUEST = 101;
private static final int ENABLE_ENCRYPTION_REQUEST = 102;
private static final String PASSWORD_CONFIRMED = "password_confirmed";
- private static final String CONFIRM_CREDENTIALS = "confirm_credentials";
+
private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
private static final String FINISH_PENDING = "finish_pending";
public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
@@ -92,6 +93,8 @@
private boolean mFinishPending = false;
private int mEncryptionRequestQuality;
private boolean mEncryptionRequestDisabled;
+ private boolean mRequirePassword;
+ private LockPatternUtils mLockPatternUtils;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -100,6 +103,7 @@
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mKeyStore = KeyStore.getInstance();
mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
+ mLockPatternUtils = new LockPatternUtils(getActivity());
// Defaults to needing to confirm credentials
final boolean confirmCredentials = getActivity().getIntent()
@@ -183,9 +187,16 @@
if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) {
mEncryptionRequestQuality = quality;
mEncryptionRequestDisabled = disabled;
- Intent intent = EncryptionInterstitial.createStartIntent(getActivity(), quality);
+ // If accessibility is enabled and the user hasn't seen this dialog before, set the
+ // default state to agree with that which is compatible with accessibility
+ // (password not required).
+ final boolean accEn = AccessibilityManager.getInstance(getActivity()).isEnabled();
+ final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
+ Intent intent = EncryptionInterstitial.createStartIntent(
+ getActivity(), quality, required);
startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
} else {
+ mRequirePassword = false; // device encryption not enabled or not device owner.
updateUnlockMethodAndFinish(quality, disabled);
}
}
@@ -218,6 +229,8 @@
finish();
} else if (requestCode == ENABLE_ENCRYPTION_REQUEST
&& resultCode == Activity.RESULT_OK) {
+ mRequirePassword = data.getBooleanExtra(
+ EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled);
} else {
getActivity().setResult(Activity.RESULT_CANCELED);
@@ -408,13 +421,8 @@
minLength = MIN_PASSWORD_LENGTH;
}
final int maxLength = mDPM.getPasswordMaximumLength(quality);
- Intent intent = new Intent().setClass(getActivity(), ChooseLockPassword.class);
- intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality);
- intent.putExtra(ChooseLockPassword.PASSWORD_MIN_KEY, minLength);
- intent.putExtra(ChooseLockPassword.PASSWORD_MAX_KEY, maxLength);
- intent.putExtra(CONFIRM_CREDENTIALS, false);
- intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK,
- isFallback);
+ Intent intent = ChooseLockPassword.createIntent(getActivity(), quality, isFallback,
+ minLength, maxLength, mRequirePassword, false /* confirm credentials */);
if (isFallback) {
startActivityForResult(intent, FALLBACK_REQUEST);
return;
@@ -424,11 +432,8 @@
startActivity(intent);
}
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
- Intent intent = new Intent(getActivity(), ChooseLockPattern.class);
- intent.putExtra("key_lock_method", "pattern");
- intent.putExtra(CONFIRM_CREDENTIALS, false);
- intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK,
- isFallback);
+ Intent intent = ChooseLockPattern.createIntent(getActivity(),
+ isFallback, mRequirePassword, false /* confirm credentials */);
if (isFallback) {
startActivityForResult(intent, FALLBACK_REQUEST);
return;
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 0a703cf..b72d5c5 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -25,6 +25,7 @@
import android.app.Fragment;
import android.app.admin.DevicePolicyManager;
import android.content.ContentResolver;
+import android.content.Context;
import android.content.Intent;
import android.inputmethodservice.KeyboardView;
import android.os.Bundle;
@@ -64,6 +65,19 @@
return modIntent;
}
+ public static Intent createIntent(Context context, int quality, final boolean isFallback,
+ int minLength, final int maxLength, boolean requirePasswordToDecrypt,
+ boolean confirmCredentials) {
+ Intent intent = new Intent().setClass(context, ChooseLockPassword.class);
+ intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality);
+ intent.putExtra(PASSWORD_MIN_KEY, minLength);
+ intent.putExtra(PASSWORD_MAX_KEY, maxLength);
+ intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, confirmCredentials);
+ intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, isFallback);
+ intent.putExtra(EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, requirePasswordToDecrypt);
+ return intent;
+ }
+
@Override
protected boolean isValidFragment(String fragmentName) {
if (ChooseLockPasswordFragment.class.getName().equals(fragmentName)) return true;
@@ -412,6 +426,9 @@
final boolean isFallback = getActivity().getIntent().getBooleanExtra(
LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
mLockPatternUtils.clearLock(isFallback);
+ final boolean required = getActivity().getIntent().getBooleanExtra(
+ EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
+ mLockPatternUtils.setCredentialRequiredToDecrypt(required);
mLockPatternUtils.saveLockPassword(pin, mRequestedQuality, isFallback);
getActivity().setResult(RESULT_FINISHED);
getActivity().finish();
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 46bf94c..3d3ef16 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -28,6 +28,7 @@
import android.app.Activity;
import android.app.Fragment;
import android.content.ContentResolver;
+import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
@@ -68,6 +69,16 @@
return modIntent;
}
+ public static Intent createIntent(Context context, final boolean isFallback,
+ boolean requirePassword, boolean confirmCredentials) {
+ Intent intent = new Intent(context, ChooseLockPattern.class);
+ intent.putExtra("key_lock_method", "pattern");
+ intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, confirmCredentials);
+ intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, isFallback);
+ intent.putExtra(EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, requirePassword);
+ return intent;
+ }
+
@Override
protected boolean isValidFragment(String fragmentName) {
if (ChooseLockPatternFragment.class.getName().equals(fragmentName)) return true;
@@ -528,6 +539,10 @@
final boolean isFallback = getActivity().getIntent()
.getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
+
+ final boolean required = getActivity().getIntent().getBooleanExtra(
+ EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
+ utils.setCredentialRequiredToDecrypt(required);
utils.saveLockPattern(mChosenPattern, isFallback);
utils.setLockPatternEnabled(true);
diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java
index 8a62001..070805d 100644
--- a/src/com/android/settings/EncryptionInterstitial.java
+++ b/src/com/android/settings/EncryptionInterstitial.java
@@ -24,8 +24,6 @@
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.os.PersistableBundle;
-import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -35,6 +33,7 @@
public class EncryptionInterstitial extends SettingsActivity {
private static final String EXTRA_PASSWORD_QUALITY = "extra_password_quality";
+ public static final String EXTRA_REQUIRE_PASSWORD = "extra_require_password";
@Override
public Intent getIntent() {
@@ -48,14 +47,16 @@
return EncryptionInterstitialFragment.class.getName().equals(fragmentName);
}
- public static Intent createStartIntent(Context ctx, int quality) {
+ public static Intent createStartIntent(Context ctx, int quality,
+ boolean requirePasswordDefault) {
return new Intent(ctx, EncryptionInterstitial.class)
.putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, true)
.putExtra(EXTRA_PREFS_SET_BACK_TEXT, (String) null)
.putExtra(EXTRA_PREFS_SET_NEXT_TEXT, ctx.getString(
R.string.encryption_continue_button))
.putExtra(EXTRA_PASSWORD_QUALITY, quality)
- .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, R.string.encryption_interstitial_header);
+ .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, R.string.encryption_interstitial_header)
+ .putExtra(EXTRA_REQUIRE_PASSWORD, requirePasswordDefault);
}
public static class EncryptionInterstitialFragment extends SettingsPreferenceFragment
@@ -64,6 +65,7 @@
private RadioButton mRequirePasswordToDecryptButton;
private RadioButton mDontRequirePasswordToDecryptButton;
private TextView mEncryptionMessage;
+ private boolean mPasswordRequired;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -98,32 +100,36 @@
disableId = R.string.encrypt_dont_require_password;
break;
}
+ mPasswordRequired = getActivity().getIntent().getBooleanExtra(
+ EXTRA_REQUIRE_PASSWORD, true);
+
mEncryptionMessage.setText(msgId);
+
mRequirePasswordToDecryptButton.setOnClickListener(this);
mRequirePasswordToDecryptButton.setText(enableId);
+ mRequirePasswordToDecryptButton.setChecked(mPasswordRequired);
+
mDontRequirePasswordToDecryptButton.setOnClickListener(this);
mDontRequirePasswordToDecryptButton.setText(disableId);
+ mDontRequirePasswordToDecryptButton.setChecked(!mPasswordRequired);
+
+ updateRequirePasswordIntent();
return view;
}
@Override
- public void onResume() {
- super.onResume();
- loadFromSettings();
- }
-
- private void loadFromSettings() {
- final boolean required = Settings.Global.getInt(getContentResolver(),
- Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, 1) == 1 ? true : false;
- mRequirePasswordToDecryptButton.setChecked(required);
- mDontRequirePasswordToDecryptButton.setChecked(!required);
- }
-
- @Override
public void onClick(View v) {
- final boolean required = (v == mRequirePasswordToDecryptButton);
- Settings.Global.putInt(getContentResolver(),
- Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, required ? 1 : 0);
+ mPasswordRequired = (v == mRequirePasswordToDecryptButton);
+ updateRequirePasswordIntent();
+ }
+
+ // Updates the value we want to return.
+ private void updateRequirePasswordIntent() {
+ SettingsActivity sa = (SettingsActivity)getActivity();
+ Intent resultIntentData = sa.getResultIntentData();
+ resultIntentData = resultIntentData == null ? new Intent() : resultIntentData;
+ resultIntentData.putExtra(EXTRA_REQUIRE_PASSWORD, mPasswordRequired);
+ sa.setResultIntentData(resultIntentData);
}
}
}
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 46a3c8e..ecededc 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -216,15 +216,12 @@
}
if (mIsPrimary) {
- switch (mDPM.getStorageEncryptionStatus()) {
- case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
+ if (LockPatternUtils.isDeviceEncryptionEnabled()) {
// The device is currently encrypted.
addPreferencesFromResource(R.xml.security_settings_encrypted);
- break;
- case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
+ } else {
// This device supports encryption but isn't encrypted.
addPreferencesFromResource(R.xml.security_settings_unencrypted);
- break;
}
}
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 3ca85ea..37fcc87 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -368,6 +368,8 @@
private boolean mNeedToRevertToInitialFragment = false;
private int mHomeActivitiesCount = 1;
+ private Intent mResultIntentData;
+
public SwitchBar getSwitchBar() {
return mSwitchBar;
}
@@ -597,21 +599,21 @@
Button backButton = (Button)findViewById(R.id.back_button);
backButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
- setResult(RESULT_CANCELED);
+ setResult(RESULT_CANCELED, getResultIntentData());
finish();
}
});
Button skipButton = (Button)findViewById(R.id.skip_button);
skipButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
- setResult(RESULT_OK);
+ setResult(RESULT_OK, getResultIntentData());
finish();
}
});
mNextButton = (Button)findViewById(R.id.next_button);
mNextButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
- setResult(RESULT_OK);
+ setResult(RESULT_OK, getResultIntentData());
finish();
}
});
@@ -1345,4 +1347,12 @@
mSearchMenuItem.collapseActionView();
}
}
+
+ public Intent getResultIntentData() {
+ return mResultIntentData;
+ }
+
+ public void setResultIntentData(Intent resultIntentData) {
+ mResultIntentData = resultIntentData;
+ }
}