Request enroll or verify lock before FP enroll

Also pipe through challenge token

Change-Id: I9d6afdbadf3832aeeb18a0b5a9620277e2070872
This commit is contained in:
Andres Morales
2015-04-13 20:49:03 -07:00
parent 6609b0c22a
commit e29dae683e
4 changed files with 99 additions and 32 deletions

View File

@@ -170,15 +170,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
@Override @Override
protected void authenticationSucceeded(@Nullable String password) { protected void authenticationSucceeded(@Nullable String password) {
Intent intent = new Intent(); // TODO: make this play nice with challenge
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();
} }
private void handleNext() { private void handleNext() {
@@ -208,7 +200,6 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
} }
if (matched) { if (matched) {
authenticationSucceeded(pin);
getActivity().setResult(RESULT_OK, intent); getActivity().setResult(RESULT_OK, intent);
getActivity().finish(); getActivity().finish();
} else { } else {

View File

@@ -233,14 +233,7 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
@Override @Override
protected void authenticationSucceeded(@Nullable String password) { protected void authenticationSucceeded(@Nullable String password) {
Intent intent = new Intent(); // TODO: make this play nice with challenge
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();
} }
@Override @Override
@@ -299,7 +292,6 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
} }
if (matched) { if (matched) {
authenticationSucceeded(LockPatternUtils.patternToString(pattern));
getActivity().setResult(Activity.RESULT_OK, intent); getActivity().setResult(Activity.RESULT_OK, intent);
getActivity().finish(); getActivity().finish();
} else { } else {

View File

@@ -105,6 +105,7 @@ public class FingerprintEnroll extends SettingsActivity {
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
private ImageView mFingerprintAnimator; private ImageView mFingerprintAnimator;
private ObjectAnimator mProgressAnim; private ObjectAnimator mProgressAnim;
private byte[] mToken;
// Give the user a chance to see progress completed before jumping to the next stage. // Give the user a chance to see progress completed before jumping to the next stage.
Runnable mDelayedFinishRunnable = new Runnable() { Runnable mDelayedFinishRunnable = new Runnable() {
@@ -253,8 +254,8 @@ public class FingerprintEnroll extends SettingsActivity {
case EnrollingStart: case EnrollingStart:
mEnrollmentSteps = -1; mEnrollmentSteps = -1;
long challenge = 0x12345; // TODO: get from keyguard confirmation // TODO: pass in mToken
mFingerprintManager.enroll(challenge, mEnrollmentCancel, mEnrollmentCallback, 0); mFingerprintManager.enroll(0, mEnrollmentCancel, mEnrollmentCallback, 0);
mProgressBar.setProgress(0); mProgressBar.setProgress(0);
mEnrolling = true; mEnrolling = true;
startFingerprintAnimator(); // XXX hack - this should follow fingerprint detection 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) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST) { if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST
if (resultCode == RESULT_FINISHED) { || requestCode == CONFIRM_REQUEST) {
if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) {
// The lock pin/pattern/password was set. Start enrolling! // The lock pin/pattern/password was set. Start enrolling!
mToken = data.getByteArrayExtra(
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
updateStage(Stage.EnrollingFindSensor); updateStage(Stage.EnrollingFindSensor);
} }
} }
@@ -381,8 +385,8 @@ public class FingerprintEnroll extends SettingsActivity {
} }
LockPatternUtils utils = new LockPatternUtils(activity); LockPatternUtils utils = new LockPatternUtils(activity);
if (!utils.isSecure()) { if (mToken == null) {
// Device doesn't have any security. Set that up first. // need to choose or confirm lock
updateStage(Stage.EnrollingOnboard); updateStage(Stage.EnrollingOnboard);
} else if (ALWAYS_SHOW_FIND_SCREEN } else if (ALWAYS_SHOW_FIND_SCREEN
|| mFingerprintManager.getEnrolledFingerprints().size() == 0) { || mFingerprintManager.getEnrolledFingerprints().size() == 0) {
@@ -397,6 +401,8 @@ public class FingerprintEnroll extends SettingsActivity {
public void onSaveInstanceState(final Bundle outState) { public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putString(EXTRA_STAGE, mStage.toString()); outState.putString(EXTRA_STAGE, mStage.toString());
outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
mToken);
if (mStage == Stage.EnrollingRepeat) { if (mStage == Stage.EnrollingRepeat) {
outState.putInt(EXTRA_PROGRESS, mProgressBar.getProgress()); outState.putInt(EXTRA_PROGRESS, mProgressBar.getProgress());
} }
@@ -406,6 +412,8 @@ public class FingerprintEnroll extends SettingsActivity {
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) { if (savedInstanceState != null) {
mToken = savedInstanceState.getByteArray(
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
//probably orientation change //probably orientation change
String stageSaved = savedInstanceState.getString(EXTRA_STAGE, null); String stageSaved = savedInstanceState.getString(EXTRA_STAGE, null);
if (stageSaved != null) { if (stageSaved != null) {
@@ -426,7 +434,7 @@ public class FingerprintEnroll extends SettingsActivity {
break; break;
case R.id.fingerprint_enroll_button_next: case R.id.fingerprint_enroll_button_next:
if (mStage == Stage.EnrollingOnboard) { if (mStage == Stage.EnrollingOnboard) {
launchChooseLock(); launchChooseOrConfirmLock();
} else if (mStage == Stage.EnrollingFindSensor) { } else if (mStage == Stage.EnrollingFindSensor) {
updateStage(Stage.EnrollingStart); updateStage(Stage.EnrollingStart);
} else if (mStage == Stage.EnrollingFinish) { } 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 intent = new Intent();
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.setClassName("com.android.settings", ChooseLockGeneric.class.getName());
intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY, intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true); 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); startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
} }
} }
} }
}

View File

@@ -19,6 +19,7 @@ package com.android.settings;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
@@ -50,6 +51,16 @@ import java.util.List;
* Settings screen for fingerprints * Settings screen for fingerprints
*/ */
public class FingerprintSettings extends SettingsActivity { 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.
* <p>
* 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 @Override
public Intent getIntent() { 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_REFRESH_FINGERPRINT_TEMPLATES = 1000;
private static final int MSG_HIGHLIGHT_FINGERPRINT_ITEM = 1001; 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 int ADD_FINGERPRINT_REQUEST = 10;
private static final boolean ENABLE_USAGE_CATEGORY = false; private static final boolean ENABLE_USAGE_CATEGORY = false;
@@ -95,6 +109,7 @@ public class FingerprintSettings extends SettingsActivity {
private PreferenceGroup mManageCategory; private PreferenceGroup mManageCategory;
private CancellationSignal mFingerprintCancel; private CancellationSignal mFingerprintCancel;
private int mMaxFingerprintAttempts; private int mMaxFingerprintAttempts;
private byte[] mToken;
private AuthenticationCallback mAuthCallback = new AuthenticationCallback() { private AuthenticationCallback mAuthCallback = new AuthenticationCallback() {
@Override @Override
@@ -173,8 +188,18 @@ public class FingerprintSettings extends SettingsActivity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mToken = savedInstanceState.getByteArray(
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
}
mFingerprintManager = (FingerprintManager) getActivity().getSystemService( mFingerprintManager = (FingerprintManager) getActivity().getSystemService(
Context.FINGERPRINT_SERVICE); Context.FINGERPRINT_SERVICE);
// Need to authenticate a session token if none
if (mToken == null) {
launchChooseOrConfirmLock();
}
} }
protected void removeFingerprintPreference(int fingerprintId) { 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, // Make sure we reload the preference hierarchy since fingerprints may be added,
// deleted or renamed. // deleted or renamed.
createPreferenceHierarchy(); createPreferenceHierarchy();
retryFingerprint(true); retryFingerprint(true);
} }
@@ -277,6 +303,12 @@ public class FingerprintSettings extends SettingsActivity {
stopFingerprint(); stopFingerprint();
} }
@Override
public void onSaveInstanceState(final Bundle outState) {
outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
mToken);
}
@Override @Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference pref) { public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference pref) {
final String key = pref.getKey(); final String key = pref.getKey();
@@ -343,6 +375,43 @@ public class FingerprintSettings extends SettingsActivity {
protected int getHelpResource() { protected int getHelpResource() {
return R.string.help_url_security; 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 { public static class FingerprintPreference extends Preference {