From edac136e162d3935ea1ccedf6c630eff4c591d7e Mon Sep 17 00:00:00 2001 From: Udam Saini Date: Tue, 8 Dec 2015 17:28:19 -0800 Subject: [PATCH] Allows the user to go back to Encryption Screen bug:22907221 Change-Id: I766407f4f130ac618da178e1b6c04029025db8f2 --- .../android/settings/ChooseLockGeneric.java | 77 +++++++++++-------- .../settings/EncryptionInterstitial.java | 54 ++++++++++--- .../settings/SetupChooseLockGeneric.java | 4 +- .../settings/SetupEncryptionInterstitial.java | 11 +-- 4 files changed, 91 insertions(+), 55 deletions(-) diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java index 65f0ba6e91d..114637cf064 100644 --- a/src/com/android/settings/ChooseLockGeneric.java +++ b/src/com/android/settings/ChooseLockGeneric.java @@ -220,13 +220,17 @@ public class ChooseLockGeneric extends SettingsActivity { && !dpm.getDoNotAskCredentialsOnBoot()) { mEncryptionRequestQuality = quality; mEncryptionRequestDisabled = disabled; + // Get the intent that the encryption interstitial should start for creating + // the new unlock method. + Intent unlockMethodIntent = getIntentForUnlockMethod(quality, disabled); final Context context = getActivity(); // 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(context).isEnabled(); final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn); - Intent intent = getEncryptionInterstitialIntent(context, quality, required); + Intent intent = getEncryptionInterstitialIntent(context, quality, required, + unlockMethodIntent); intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, mForFingerprint); startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST); @@ -246,9 +250,8 @@ public class ChooseLockGeneric extends SettingsActivity { updatePreferencesOrFinish(); } else if (requestCode == ENABLE_ENCRYPTION_REQUEST && resultCode == Activity.RESULT_OK) { - mRequirePassword = data.getBooleanExtra( - EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); - updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled); + getActivity().setResult(resultCode, data); + finish(); } else if (requestCode == CHOOSE_LOCK_REQUEST) { getActivity().setResult(resultCode, data); finish(); @@ -451,8 +454,9 @@ public class ChooseLockGeneric extends SettingsActivity { } protected Intent getEncryptionInterstitialIntent(Context context, int quality, - boolean required) { - return EncryptionInterstitial.createStartIntent(context, quality, required); + boolean required, Intent unlockMethodIntent) { + return EncryptionInterstitial.createStartIntent(context, quality, required, + unlockMethodIntent); } /** @@ -471,34 +475,13 @@ public class ChooseLockGeneric extends SettingsActivity { } quality = upgradeQuality(quality); + Intent intent = getIntentForUnlockMethod(quality, disabled); + if (intent != null) { + startActivityForResult(intent, CHOOSE_LOCK_REQUEST); + return; + } - final Context context = getActivity(); - if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) { - int minLength = mDPM.getPasswordMinimumLength(null); - if (minLength < MIN_PASSWORD_LENGTH) { - minLength = MIN_PASSWORD_LENGTH; - } - final int maxLength = mDPM.getPasswordMaximumLength(quality); - Intent intent; - if (mHasChallenge) { - intent = getLockPasswordIntent(context, quality, minLength, - maxLength, mRequirePassword, mChallenge, mUserId); - } else { - intent = getLockPasswordIntent(context, quality, minLength, - maxLength, mRequirePassword, mUserPassword, mUserId); - } - startActivityForResult(intent, CHOOSE_LOCK_REQUEST); - } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { - Intent intent; - if (mHasChallenge) { - intent = getLockPatternIntent(context, mRequirePassword, - mChallenge, mUserId); - } else { - intent = getLockPatternIntent(context, mRequirePassword, - mUserPassword, mUserId); - } - startActivityForResult(intent, CHOOSE_LOCK_REQUEST); - } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { + if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { mChooseLockSettingsHelper.utils().clearLock(mUserId); mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId); removeAllFingerprintTemplatesAndFinish(); @@ -508,6 +491,34 @@ public class ChooseLockGeneric extends SettingsActivity { } } + private Intent getIntentForUnlockMethod(int quality, boolean disabled) { + Intent intent = null; + final Context context = getActivity(); + if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) { + int minLength = mDPM.getPasswordMinimumLength(null); + if (minLength < MIN_PASSWORD_LENGTH) { + minLength = MIN_PASSWORD_LENGTH; + } + final int maxLength = mDPM.getPasswordMaximumLength(quality); + if (mHasChallenge) { + intent = getLockPasswordIntent(context, quality, minLength, + maxLength, mRequirePassword, mChallenge, mUserId); + } else { + intent = getLockPasswordIntent(context, quality, minLength, + maxLength, mRequirePassword, mUserPassword, mUserId); + } + } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) { + if (mHasChallenge) { + intent = getLockPatternIntent(context, mRequirePassword, + mChallenge, mUserId); + } else { + intent = getLockPatternIntent(context, mRequirePassword, + mUserPassword, mUserId); + } + } + return intent; + } + private void removeAllFingerprintTemplatesAndFinish() { if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected() && mFingerprintManager.getEnrolledFingerprints().size() > 0) { diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java index 3aec03e9e97..5cd0508fc82 100644 --- a/src/com/android/settings/EncryptionInterstitial.java +++ b/src/com/android/settings/EncryptionInterstitial.java @@ -26,10 +26,12 @@ import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; +import android.widget.Button; import android.widget.RadioButton; import android.widget.TextView; @@ -39,9 +41,12 @@ import com.android.internal.widget.LockPatternUtils; import java.util.List; public class EncryptionInterstitial extends SettingsActivity { + private final static String TAG = EncryptionInterstitial.class.getSimpleName(); protected static final String EXTRA_PASSWORD_QUALITY = "extra_password_quality"; + protected static final String EXTRA_UNLOCK_METHOD_INTENT = "extra_unlock_method_intent"; public static final String EXTRA_REQUIRE_PASSWORD = "extra_require_password"; + private static final int CHOOSE_LOCK_REQUEST = 100; @Override public Intent getIntent() { @@ -56,7 +61,7 @@ public class EncryptionInterstitial extends SettingsActivity { } public static Intent createStartIntent(Context ctx, int quality, - boolean requirePasswordDefault) { + boolean requirePasswordDefault, Intent unlockMethodIntent) { return new Intent(ctx, EncryptionInterstitial.class) .putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, true) .putExtra(EXTRA_PREFS_SET_BACK_TEXT, (String) null) @@ -64,7 +69,8 @@ public class EncryptionInterstitial extends SettingsActivity { R.string.encryption_continue_button)) .putExtra(EXTRA_PASSWORD_QUALITY, quality) .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, R.string.encryption_interstitial_header) - .putExtra(EXTRA_REQUIRE_PASSWORD, requirePasswordDefault); + .putExtra(EXTRA_REQUIRE_PASSWORD, requirePasswordDefault) + .putExtra(EXTRA_UNLOCK_METHOD_INTENT, unlockMethodIntent); } public static class EncryptionInterstitialFragment extends SettingsPreferenceFragment @@ -75,6 +81,7 @@ public class EncryptionInterstitial extends SettingsActivity { private RadioButton mDontRequirePasswordToDecryptButton; private TextView mEncryptionMessage; private boolean mPasswordRequired; + private Intent mUnlockMethodIntent; @Override protected int getMetricsCategory() { @@ -98,7 +105,9 @@ public class EncryptionInterstitial extends SettingsActivity { (TextView) view.findViewById(R.id.encryption_message); boolean forFingerprint = getActivity().getIntent().getBooleanExtra( ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false); - int quality = getActivity().getIntent().getIntExtra(EXTRA_PASSWORD_QUALITY, 0); + Intent intent = getActivity().getIntent(); + final int quality = intent.getIntExtra(EXTRA_PASSWORD_QUALITY, 0); + mUnlockMethodIntent = (Intent) intent.getParcelableExtra(EXTRA_UNLOCK_METHOD_INTENT); final int msgId; final int enableId; final int disableId; @@ -136,6 +145,36 @@ public class EncryptionInterstitial extends SettingsActivity { setRequirePasswordState(getActivity().getIntent().getBooleanExtra( EXTRA_REQUIRE_PASSWORD, true)); + + Button nextButton = getNextButton(); + if (nextButton != null) { + nextButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startLockIntent(); + } + }); + } + } + + protected void startLockIntent() { + if (mUnlockMethodIntent != null) { + mUnlockMethodIntent.putExtra(EXTRA_REQUIRE_PASSWORD, mPasswordRequired); + startActivityForResult(mUnlockMethodIntent, CHOOSE_LOCK_REQUEST); + } else { + Log.wtf(TAG, "no unlock intent to start"); + finish(); + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == CHOOSE_LOCK_REQUEST && + resultCode == RESULT_FIRST_USER) { + getActivity().setResult(RESULT_OK, data); + finish(); + } } @Override @@ -206,15 +245,6 @@ public class EncryptionInterstitial extends SettingsActivity { mPasswordRequired = required; mRequirePasswordToDecryptButton.setChecked(required); mDontRequirePasswordToDecryptButton.setChecked(!required); - - // Updates value returned by SettingsActivity.onActivityResult(). - SettingsActivity sa = (SettingsActivity)getActivity(); - Intent resultIntentData = sa.getResultIntentData(); - if (resultIntentData == null) { - resultIntentData = new Intent(); - sa.setResultIntentData(resultIntentData); - } - resultIntentData.putExtra(EXTRA_REQUIRE_PASSWORD, mPasswordRequired); } @Override diff --git a/src/com/android/settings/SetupChooseLockGeneric.java b/src/com/android/settings/SetupChooseLockGeneric.java index 0b0333b7a5d..9559f8d0699 100644 --- a/src/com/android/settings/SetupChooseLockGeneric.java +++ b/src/com/android/settings/SetupChooseLockGeneric.java @@ -170,9 +170,9 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric { @Override protected Intent getEncryptionInterstitialIntent(Context context, int quality, - boolean required) { + boolean required, Intent unlockMethodIntent) { Intent intent = SetupEncryptionInterstitial.createStartIntent(context, quality, - required); + required, unlockMethodIntent); SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent); return intent; } diff --git a/src/com/android/settings/SetupEncryptionInterstitial.java b/src/com/android/settings/SetupEncryptionInterstitial.java index cd943afc382..8d061ec0aa6 100644 --- a/src/com/android/settings/SetupEncryptionInterstitial.java +++ b/src/com/android/settings/SetupEncryptionInterstitial.java @@ -38,9 +38,9 @@ import com.android.setupwizardlib.view.NavigationBar; public class SetupEncryptionInterstitial extends EncryptionInterstitial { public static Intent createStartIntent(Context ctx, int quality, - boolean requirePasswordDefault) { + boolean requirePasswordDefault, Intent unlockMethodIntent) { Intent startIntent = EncryptionInterstitial.createStartIntent(ctx, quality, - requirePasswordDefault); + requirePasswordDefault, unlockMethodIntent); startIntent.setClass(ctx, SetupEncryptionInterstitial.class); startIntent.putExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false) .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, -1); @@ -102,12 +102,7 @@ public class SetupEncryptionInterstitial extends EncryptionInterstitial { @Override public void onNavigateNext() { - final SetupEncryptionInterstitial activity = - (SetupEncryptionInterstitial) getActivity(); - if (activity != null) { - activity.setResult(RESULT_OK, activity.getResultIntentData()); - finish(); - } + startLockIntent(); } } }