diff --git a/src/com/android/settings/ConfirmLockPassword.java b/src/com/android/settings/ConfirmLockPassword.java index d9622c015a5..975882f7816 100644 --- a/src/com/android/settings/ConfirmLockPassword.java +++ b/src/com/android/settings/ConfirmLockPassword.java @@ -170,15 +170,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { @Override protected void authenticationSucceeded(@Nullable String password) { - Intent intent = new Intent(); - if (getActivity() instanceof ConfirmLockPassword.InternalActivity) { - intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE, - mIsAlpha ? StorageManager.CRYPT_TYPE_PASSWORD - : StorageManager.CRYPT_TYPE_PIN); - intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password); - } - getActivity().setResult(RESULT_OK, intent); - getActivity().finish(); + // TODO: make this play nice with challenge } private void handleNext() { @@ -208,7 +200,6 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { } if (matched) { - authenticationSucceeded(pin); getActivity().setResult(RESULT_OK, intent); getActivity().finish(); } else { diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java index 9db1719738a..0b2bec3da8d 100644 --- a/src/com/android/settings/ConfirmLockPattern.java +++ b/src/com/android/settings/ConfirmLockPattern.java @@ -233,14 +233,7 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { @Override protected void authenticationSucceeded(@Nullable String password) { - Intent intent = new Intent(); - if (getActivity() instanceof ConfirmLockPattern.InternalActivity) { - intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE, - StorageManager.CRYPT_TYPE_PATTERN); - intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password); - } - getActivity().setResult(Activity.RESULT_OK, intent); - getActivity().finish(); + // TODO: make this play nice with challenge } @Override @@ -299,7 +292,6 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { } if (matched) { - authenticationSucceeded(LockPatternUtils.patternToString(pattern)); getActivity().setResult(Activity.RESULT_OK, intent); getActivity().finish(); } else { diff --git a/src/com/android/settings/FingerprintEnroll.java b/src/com/android/settings/FingerprintEnroll.java index a6424e56ff7..61bebdf9170 100644 --- a/src/com/android/settings/FingerprintEnroll.java +++ b/src/com/android/settings/FingerprintEnroll.java @@ -105,6 +105,7 @@ public class FingerprintEnroll extends SettingsActivity { private ProgressBar mProgressBar; private ImageView mFingerprintAnimator; private ObjectAnimator mProgressAnim; + private byte[] mToken; // Give the user a chance to see progress completed before jumping to the next stage. Runnable mDelayedFinishRunnable = new Runnable() { @@ -253,8 +254,8 @@ public class FingerprintEnroll extends SettingsActivity { case EnrollingStart: mEnrollmentSteps = -1; - long challenge = 0x12345; // TODO: get from keyguard confirmation - mFingerprintManager.enroll(challenge, mEnrollmentCancel, mEnrollmentCallback, 0); + // TODO: pass in mToken + mFingerprintManager.enroll(0, mEnrollmentCancel, mEnrollmentCallback, 0); mProgressBar.setProgress(0); mEnrolling = true; startFingerprintAnimator(); // XXX hack - this should follow fingerprint detection @@ -350,9 +351,12 @@ public class FingerprintEnroll extends SettingsActivity { public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST) { - if (resultCode == RESULT_FINISHED) { + if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST + || requestCode == CONFIRM_REQUEST) { + if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) { // The lock pin/pattern/password was set. Start enrolling! + mToken = data.getByteArrayExtra( + ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); updateStage(Stage.EnrollingFindSensor); } } @@ -381,8 +385,8 @@ public class FingerprintEnroll extends SettingsActivity { } LockPatternUtils utils = new LockPatternUtils(activity); - if (!utils.isSecure()) { - // Device doesn't have any security. Set that up first. + if (mToken == null) { + // need to choose or confirm lock updateStage(Stage.EnrollingOnboard); } else if (ALWAYS_SHOW_FIND_SCREEN || mFingerprintManager.getEnrolledFingerprints().size() == 0) { @@ -397,6 +401,8 @@ public class FingerprintEnroll extends SettingsActivity { public void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); outState.putString(EXTRA_STAGE, mStage.toString()); + outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, + mToken); if (mStage == Stage.EnrollingRepeat) { outState.putInt(EXTRA_PROGRESS, mProgressBar.getProgress()); } @@ -406,6 +412,8 @@ public class FingerprintEnroll extends SettingsActivity { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { + mToken = savedInstanceState.getByteArray( + ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); //probably orientation change String stageSaved = savedInstanceState.getString(EXTRA_STAGE, null); if (stageSaved != null) { @@ -426,7 +434,7 @@ public class FingerprintEnroll extends SettingsActivity { break; case R.id.fingerprint_enroll_button_next: if (mStage == Stage.EnrollingOnboard) { - launchChooseLock(); + launchChooseOrConfirmLock(); } else if (mStage == Stage.EnrollingFindSensor) { updateStage(Stage.EnrollingStart); } else if (mStage == Stage.EnrollingFinish) { @@ -438,13 +446,20 @@ public class FingerprintEnroll extends SettingsActivity { } } - private void launchChooseLock() { + private void launchChooseOrConfirmLock() { Intent intent = new Intent(); - intent.setClassName("com.android.settings", ChooseLockGeneric.class.getName()); - intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY, - DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); - intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true); - startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST); + long challenge = mFingerprintManager.preEnroll(); + ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(getActivity(), this); + if (!helper.launchConfirmationActivity(CONFIRM_REQUEST, null, + null, null, challenge)) { + intent.setClassName("com.android.settings", ChooseLockGeneric.class.getName()); + intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY, + DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); + intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true); + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); + startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST); + } } } } diff --git a/src/com/android/settings/FingerprintSettings.java b/src/com/android/settings/FingerprintSettings.java index b4d6a4f783d..78e5ec6c11f 100644 --- a/src/com/android/settings/FingerprintSettings.java +++ b/src/com/android/settings/FingerprintSettings.java @@ -19,6 +19,7 @@ package com.android.settings; import android.app.Activity; import android.app.AlertDialog; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -50,6 +51,16 @@ import java.util.List; * Settings screen for fingerprints */ public class FingerprintSettings extends SettingsActivity { + /** + * Used by the FP settings wizard to indicate the wizard is + * finished, and each activity in the wizard should finish. + *

+ * Previously, each activity in the wizard would finish itself after + * starting the next activity. However, this leads to broken 'Back' + * behavior. So, now an activity does not finish itself until it gets this + * result. + */ + static final int RESULT_FINISHED = RESULT_FIRST_USER; @Override public Intent getIntent() { @@ -85,6 +96,9 @@ public class FingerprintSettings extends SettingsActivity { private static final int MSG_REFRESH_FINGERPRINT_TEMPLATES = 1000; private static final int MSG_HIGHLIGHT_FINGERPRINT_ITEM = 1001; + private static final int CONFIRM_REQUEST = 101; + private static final int CHOOSE_LOCK_GENERIC_REQUEST = 102; + private static final int ADD_FINGERPRINT_REQUEST = 10; private static final boolean ENABLE_USAGE_CATEGORY = false; @@ -95,6 +109,7 @@ public class FingerprintSettings extends SettingsActivity { private PreferenceGroup mManageCategory; private CancellationSignal mFingerprintCancel; private int mMaxFingerprintAttempts; + private byte[] mToken; private AuthenticationCallback mAuthCallback = new AuthenticationCallback() { @Override @@ -173,8 +188,18 @@ public class FingerprintSettings extends SettingsActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + mToken = savedInstanceState.getByteArray( + ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); + } + mFingerprintManager = (FingerprintManager) getActivity().getSystemService( Context.FINGERPRINT_SERVICE); + + // Need to authenticate a session token if none + if (mToken == null) { + launchChooseOrConfirmLock(); + } } protected void removeFingerprintPreference(int fingerprintId) { @@ -268,6 +293,7 @@ public class FingerprintSettings extends SettingsActivity { // Make sure we reload the preference hierarchy since fingerprints may be added, // deleted or renamed. createPreferenceHierarchy(); + retryFingerprint(true); } @@ -277,6 +303,12 @@ public class FingerprintSettings extends SettingsActivity { stopFingerprint(); } + @Override + public void onSaveInstanceState(final Bundle outState) { + outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, + mToken); + } + @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference pref) { final String key = pref.getKey(); @@ -343,6 +375,43 @@ public class FingerprintSettings extends SettingsActivity { protected int getHelpResource() { return R.string.help_url_security; } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST + || requestCode == CONFIRM_REQUEST) { + if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) { + // The lock pin/pattern/password was set. Start enrolling! + if (data != null) { + mToken = data.getByteArrayExtra( + ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); + } + } + } + + if (mToken == null) { + // Didn't get an authentication, finishing + getActivity().finish(); + } + } + + private void launchChooseOrConfirmLock() { + Intent intent = new Intent(); + long challenge = mFingerprintManager.preEnroll(); + ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(getActivity(), this); + // TODO: update text or remove params from method + if (!helper.launchConfirmationActivity(CONFIRM_REQUEST, null, + null, null, challenge)) { + intent.setClassName("com.android.settings", ChooseLockGeneric.class.getName()); + intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY, + DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); + intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true); + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); + startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST); + } + } } public static class FingerprintPreference extends Preference {