diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java index fe0bb63fd07..322a92c5d86 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollEnrolling.java @@ -50,7 +50,7 @@ import com.android.settings.R; public class FingerprintEnrollEnrolling extends FingerprintEnrollBase implements FingerprintEnrollSidecar.Listener { - private static final String TAG_SIDECAR = "sidecar"; + static final String TAG_SIDECAR = "sidecar"; private static final int PROGRESS_BAR_MAX = 10000; private static final int FINISH_DELAY = 250; @@ -170,6 +170,8 @@ public class FingerprintEnrollEnrolling extends FingerprintEnrollBase mSidecar.setListener(null); stopIconAnimation(); if (!isChangingConfigurations()) { + mSidecar.cancelEnrollment(); + getFragmentManager().beginTransaction().remove(mSidecar).commit(); finish(); } } diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java index a5af5cc0288..a2f600bcf57 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollFindSensor.java @@ -23,6 +23,7 @@ import android.os.Bundle; import com.android.internal.logging.MetricsLogger; import com.android.settings.ChooseLockSettingsHelper; import com.android.settings.R; +import com.android.settings.fingerprint.FingerprintEnrollSidecar.Listener; /** * Activity explaining the fingerprint sensor location for fingerprint enrollment. @@ -35,16 +36,23 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { private FingerprintFindSensorAnimation mAnimation; private boolean mLaunchedConfirmLock; + private FingerprintEnrollSidecar mSidecar; + private boolean mNextClicked; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fingerprint_enroll_find_sensor); setHeaderText(R.string.security_settings_fingerprint_enroll_find_sensor_title); - mLaunchedConfirmLock = savedInstanceState != null && savedInstanceState.getBoolean( - EXTRA_KEY_LAUNCHED_CONFIRM); + if (savedInstanceState != null) { + mLaunchedConfirmLock = savedInstanceState.getBoolean(EXTRA_KEY_LAUNCHED_CONFIRM); + mToken = savedInstanceState.getByteArray( + ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); + } if (mToken == null && !mLaunchedConfirmLock) { launchConfirmLock(); + } else if (mToken != null) { + startLookingForFingerprint(); // already confirmed, so start looking for fingerprint } mAnimation = (FingerprintFindSensorAnimation) findViewById( R.id.fingerprint_sensor_location_animation); @@ -56,6 +64,37 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { mAnimation.startAnimation(); } + private void startLookingForFingerprint() { + mSidecar = (FingerprintEnrollSidecar) getFragmentManager().findFragmentByTag( + FingerprintEnrollEnrolling.TAG_SIDECAR); + if (mSidecar == null) { + mSidecar = new FingerprintEnrollSidecar(); + getFragmentManager().beginTransaction() + .add(mSidecar, FingerprintEnrollEnrolling.TAG_SIDECAR).commit(); + } + mSidecar.setListener(new Listener() { + @Override + public void onEnrollmentProgressChange(int steps, int remaining) { + mNextClicked = true; + if (!mSidecar.cancelEnrollment()) { + proceedToEnrolling(); + } + } + + @Override + public void onEnrollmentHelp(CharSequence helpString) { + } + + @Override + public void onEnrollmentError(int errMsgId, CharSequence errString) { + if (mNextClicked && errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) { + mNextClicked = false; + proceedToEnrolling(); + } + } + }); + } + @Override protected void onStop() { super.onStop(); @@ -72,10 +111,20 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(EXTRA_KEY_LAUNCHED_CONFIRM, mLaunchedConfirmLock); + outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken); } @Override protected void onNextButtonClick() { + mNextClicked = true; + if (mSidecar == null || (mSidecar != null && !mSidecar.cancelEnrollment())) { + proceedToEnrolling(); + } + } + + private void proceedToEnrolling() { + getFragmentManager().beginTransaction().remove(mSidecar).commit(); + mSidecar = null; startActivityForResult(getEnrollingIntent(), ENROLLING); } @@ -85,6 +134,8 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { if (resultCode == RESULT_OK) { mToken = data.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); overridePendingTransition(R.anim.suw_slide_next_in, R.anim.suw_slide_next_out); + getIntent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken); + startLookingForFingerprint(); } else { finish(); } @@ -105,6 +156,9 @@ public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser); if (enrolled >= max) { finish(); + } else { + // We came back from enrolling but it wasn't completed, start again. + startLookingForFingerprint(); } } } else { diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java index da055b09005..72c06db94c3 100644 --- a/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java +++ b/src/com/android/settings/fingerprint/FingerprintEnrollSidecar.java @@ -79,13 +79,15 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment { mEnrolling = true; } - private void cancelEnrollment() { + boolean cancelEnrollment() { mHandler.removeCallbacks(mTimeoutRunnable); if (mEnrolling) { mEnrollmentCancel.cancel(); mEnrolling = false; mEnrollmentSteps = -1; + return true; } + return false; } public void setListener(Listener listener) { @@ -131,6 +133,7 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment { if (mListener != null) { mListener.onEnrollmentError(errMsgId, errString); } + mEnrolling = false; } }; @@ -151,4 +154,8 @@ public class FingerprintEnrollSidecar extends InstrumentedFragment { void onEnrollmentError(int errMsgId, CharSequence errString); void onEnrollmentProgressChange(int steps, int remaining); } + + public boolean isEnrolling() { + return mEnrolling; + } }