Merge "Several fixes to new EncryptionInterstitial dialog." into lmp-dev

This commit is contained in:
Jim Miller
2014-10-17 23:48:34 +00:00
committed by Android (Google) Code Review
6 changed files with 92 additions and 42 deletions

View File

@@ -45,6 +45,7 @@ import com.android.internal.widget.LockPatternUtils;
import java.util.List; import java.util.List;
public class ChooseLockGeneric extends SettingsActivity { public class ChooseLockGeneric extends SettingsActivity {
public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
@Override @Override
public Intent getIntent() { public Intent getIntent() {
@@ -75,7 +76,7 @@ public class ChooseLockGeneric extends SettingsActivity {
private static final int FALLBACK_REQUEST = 101; private static final int FALLBACK_REQUEST = 101;
private static final int ENABLE_ENCRYPTION_REQUEST = 102; private static final int ENABLE_ENCRYPTION_REQUEST = 102;
private static final String PASSWORD_CONFIRMED = "password_confirmed"; 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 WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
private static final String FINISH_PENDING = "finish_pending"; private static final String FINISH_PENDING = "finish_pending";
public static final String MINIMUM_QUALITY_KEY = "minimum_quality"; public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
@@ -92,6 +93,8 @@ public class ChooseLockGeneric extends SettingsActivity {
private boolean mFinishPending = false; private boolean mFinishPending = false;
private int mEncryptionRequestQuality; private int mEncryptionRequestQuality;
private boolean mEncryptionRequestDisabled; private boolean mEncryptionRequestDisabled;
private boolean mRequirePassword;
private LockPatternUtils mLockPatternUtils;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@@ -100,6 +103,7 @@ public class ChooseLockGeneric extends SettingsActivity {
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
mKeyStore = KeyStore.getInstance(); mKeyStore = KeyStore.getInstance();
mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity()); mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
mLockPatternUtils = new LockPatternUtils(getActivity());
// Defaults to needing to confirm credentials // Defaults to needing to confirm credentials
final boolean confirmCredentials = getActivity().getIntent() final boolean confirmCredentials = getActivity().getIntent()
@@ -183,9 +187,16 @@ public class ChooseLockGeneric extends SettingsActivity {
if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) { if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) {
mEncryptionRequestQuality = quality; mEncryptionRequestQuality = quality;
mEncryptionRequestDisabled = disabled; 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); startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
} else { } else {
mRequirePassword = false; // device encryption not enabled or not device owner.
updateUnlockMethodAndFinish(quality, disabled); updateUnlockMethodAndFinish(quality, disabled);
} }
} }
@@ -218,6 +229,8 @@ public class ChooseLockGeneric extends SettingsActivity {
finish(); finish();
} else if (requestCode == ENABLE_ENCRYPTION_REQUEST } else if (requestCode == ENABLE_ENCRYPTION_REQUEST
&& resultCode == Activity.RESULT_OK) { && resultCode == Activity.RESULT_OK) {
mRequirePassword = data.getBooleanExtra(
EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled); updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled);
} else { } else {
getActivity().setResult(Activity.RESULT_CANCELED); getActivity().setResult(Activity.RESULT_CANCELED);
@@ -412,13 +425,8 @@ public class ChooseLockGeneric extends SettingsActivity {
minLength = MIN_PASSWORD_LENGTH; minLength = MIN_PASSWORD_LENGTH;
} }
final int maxLength = mDPM.getPasswordMaximumLength(quality); final int maxLength = mDPM.getPasswordMaximumLength(quality);
Intent intent = new Intent().setClass(getActivity(), ChooseLockPassword.class); Intent intent = ChooseLockPassword.createIntent(getActivity(), quality, isFallback,
intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality); minLength, maxLength, mRequirePassword, false /* confirm credentials */);
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);
if (isFallback) { if (isFallback) {
startActivityForResult(intent, FALLBACK_REQUEST); startActivityForResult(intent, FALLBACK_REQUEST);
return; return;
@@ -428,11 +436,8 @@ public class ChooseLockGeneric extends SettingsActivity {
startActivity(intent); startActivity(intent);
} }
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
Intent intent = new Intent(getActivity(), ChooseLockPattern.class); Intent intent = ChooseLockPattern.createIntent(getActivity(),
intent.putExtra("key_lock_method", "pattern"); isFallback, mRequirePassword, false /* confirm credentials */);
intent.putExtra(CONFIRM_CREDENTIALS, false);
intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK,
isFallback);
if (isFallback) { if (isFallback) {
startActivityForResult(intent, FALLBACK_REQUEST); startActivityForResult(intent, FALLBACK_REQUEST);
return; return;

View File

@@ -25,6 +25,7 @@ import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.inputmethodservice.KeyboardView; import android.inputmethodservice.KeyboardView;
import android.os.Bundle; import android.os.Bundle;
@@ -64,6 +65,19 @@ public class ChooseLockPassword extends SettingsActivity {
return modIntent; 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 @Override
protected boolean isValidFragment(String fragmentName) { protected boolean isValidFragment(String fragmentName) {
if (ChooseLockPasswordFragment.class.getName().equals(fragmentName)) return true; if (ChooseLockPasswordFragment.class.getName().equals(fragmentName)) return true;
@@ -412,6 +426,9 @@ public class ChooseLockPassword extends SettingsActivity {
final boolean isFallback = getActivity().getIntent().getBooleanExtra( final boolean isFallback = getActivity().getIntent().getBooleanExtra(
LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
mLockPatternUtils.clearLock(isFallback); mLockPatternUtils.clearLock(isFallback);
final boolean required = getActivity().getIntent().getBooleanExtra(
EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
mLockPatternUtils.setCredentialRequiredToDecrypt(required);
mLockPatternUtils.saveLockPassword(pin, mRequestedQuality, isFallback); mLockPatternUtils.saveLockPassword(pin, mRequestedQuality, isFallback);
getActivity().setResult(RESULT_FINISHED); getActivity().setResult(RESULT_FINISHED);
getActivity().finish(); getActivity().finish();

View File

@@ -28,6 +28,7 @@ import static com.android.internal.widget.LockPatternView.DisplayMode;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
@@ -68,6 +69,16 @@ public class ChooseLockPattern extends SettingsActivity {
return modIntent; 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 @Override
protected boolean isValidFragment(String fragmentName) { protected boolean isValidFragment(String fragmentName) {
if (ChooseLockPatternFragment.class.getName().equals(fragmentName)) return true; if (ChooseLockPatternFragment.class.getName().equals(fragmentName)) return true;
@@ -528,6 +539,10 @@ public class ChooseLockPattern extends SettingsActivity {
final boolean isFallback = getActivity().getIntent() final boolean isFallback = getActivity().getIntent()
.getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); .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.saveLockPattern(mChosenPattern, isFallback);
utils.setLockPatternEnabled(true); utils.setLockPatternEnabled(true);

View File

@@ -24,8 +24,6 @@ import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.PersistableBundle;
import android.provider.Settings;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -35,6 +33,7 @@ import android.widget.TextView;
public class EncryptionInterstitial extends SettingsActivity { public class EncryptionInterstitial extends SettingsActivity {
private static final String EXTRA_PASSWORD_QUALITY = "extra_password_quality"; private static final String EXTRA_PASSWORD_QUALITY = "extra_password_quality";
public static final String EXTRA_REQUIRE_PASSWORD = "extra_require_password";
@Override @Override
public Intent getIntent() { public Intent getIntent() {
@@ -48,14 +47,16 @@ public class EncryptionInterstitial extends SettingsActivity {
return EncryptionInterstitialFragment.class.getName().equals(fragmentName); 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) return new Intent(ctx, EncryptionInterstitial.class)
.putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, true) .putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, true)
.putExtra(EXTRA_PREFS_SET_BACK_TEXT, (String) null) .putExtra(EXTRA_PREFS_SET_BACK_TEXT, (String) null)
.putExtra(EXTRA_PREFS_SET_NEXT_TEXT, ctx.getString( .putExtra(EXTRA_PREFS_SET_NEXT_TEXT, ctx.getString(
R.string.encryption_continue_button)) R.string.encryption_continue_button))
.putExtra(EXTRA_PASSWORD_QUALITY, quality) .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 public static class EncryptionInterstitialFragment extends SettingsPreferenceFragment
@@ -64,6 +65,7 @@ public class EncryptionInterstitial extends SettingsActivity {
private RadioButton mRequirePasswordToDecryptButton; private RadioButton mRequirePasswordToDecryptButton;
private RadioButton mDontRequirePasswordToDecryptButton; private RadioButton mDontRequirePasswordToDecryptButton;
private TextView mEncryptionMessage; private TextView mEncryptionMessage;
private boolean mPasswordRequired;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -98,32 +100,36 @@ public class EncryptionInterstitial extends SettingsActivity {
disableId = R.string.encrypt_dont_require_password; disableId = R.string.encrypt_dont_require_password;
break; break;
} }
mPasswordRequired = getActivity().getIntent().getBooleanExtra(
EXTRA_REQUIRE_PASSWORD, true);
mEncryptionMessage.setText(msgId); mEncryptionMessage.setText(msgId);
mRequirePasswordToDecryptButton.setOnClickListener(this); mRequirePasswordToDecryptButton.setOnClickListener(this);
mRequirePasswordToDecryptButton.setText(enableId); mRequirePasswordToDecryptButton.setText(enableId);
mRequirePasswordToDecryptButton.setChecked(mPasswordRequired);
mDontRequirePasswordToDecryptButton.setOnClickListener(this); mDontRequirePasswordToDecryptButton.setOnClickListener(this);
mDontRequirePasswordToDecryptButton.setText(disableId); mDontRequirePasswordToDecryptButton.setText(disableId);
mDontRequirePasswordToDecryptButton.setChecked(!mPasswordRequired);
updateRequirePasswordIntent();
return view; 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 @Override
public void onClick(View v) { public void onClick(View v) {
final boolean required = (v == mRequirePasswordToDecryptButton); mPasswordRequired = (v == mRequirePasswordToDecryptButton);
Settings.Global.putInt(getContentResolver(), updateRequirePasswordIntent();
Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, required ? 1 : 0); }
// 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);
} }
} }
} }

View File

@@ -216,15 +216,12 @@ public class SecuritySettings extends SettingsPreferenceFragment
} }
if (mIsPrimary) { if (mIsPrimary) {
switch (mDPM.getStorageEncryptionStatus()) { if (LockPatternUtils.isDeviceEncryptionEnabled()) {
case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
// The device is currently encrypted. // The device is currently encrypted.
addPreferencesFromResource(R.xml.security_settings_encrypted); addPreferencesFromResource(R.xml.security_settings_encrypted);
break; } else {
case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
// This device supports encryption but isn't encrypted. // This device supports encryption but isn't encrypted.
addPreferencesFromResource(R.xml.security_settings_unencrypted); addPreferencesFromResource(R.xml.security_settings_unencrypted);
break;
} }
} }

View File

@@ -368,6 +368,8 @@ public class SettingsActivity extends Activity
private boolean mNeedToRevertToInitialFragment = false; private boolean mNeedToRevertToInitialFragment = false;
private int mHomeActivitiesCount = 1; private int mHomeActivitiesCount = 1;
private Intent mResultIntentData;
public SwitchBar getSwitchBar() { public SwitchBar getSwitchBar() {
return mSwitchBar; return mSwitchBar;
} }
@@ -597,21 +599,21 @@ public class SettingsActivity extends Activity
Button backButton = (Button)findViewById(R.id.back_button); Button backButton = (Button)findViewById(R.id.back_button);
backButton.setOnClickListener(new OnClickListener() { backButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) { public void onClick(View v) {
setResult(RESULT_CANCELED); setResult(RESULT_CANCELED, getResultIntentData());
finish(); finish();
} }
}); });
Button skipButton = (Button)findViewById(R.id.skip_button); Button skipButton = (Button)findViewById(R.id.skip_button);
skipButton.setOnClickListener(new OnClickListener() { skipButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) { public void onClick(View v) {
setResult(RESULT_OK); setResult(RESULT_OK, getResultIntentData());
finish(); finish();
} }
}); });
mNextButton = (Button)findViewById(R.id.next_button); mNextButton = (Button)findViewById(R.id.next_button);
mNextButton.setOnClickListener(new OnClickListener() { mNextButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) { public void onClick(View v) {
setResult(RESULT_OK); setResult(RESULT_OK, getResultIntentData());
finish(); finish();
} }
}); });
@@ -1345,4 +1347,12 @@ public class SettingsActivity extends Activity
mSearchMenuItem.collapseActionView(); mSearchMenuItem.collapseActionView();
} }
} }
public Intent getResultIntentData() {
return mResultIntentData;
}
public void setResultIntentData(Intent resultIntentData) {
mResultIntentData = resultIntentData;
}
} }