| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License |
| */ |
| |
| package com.android.settings.fingerprint; |
| |
| import android.content.Intent; |
| import android.hardware.fingerprint.FingerprintManager; |
| import android.os.Bundle; |
| import android.os.UserHandle; |
| |
| import com.android.internal.logging.nano.MetricsProto.MetricsEvent; |
| import com.android.settings.ChooseLockSettingsHelper; |
| import com.android.settings.R; |
| import com.android.settings.Utils; |
| import com.android.settings.fingerprint.FingerprintEnrollSidecar.Listener; |
| |
| /** |
| * Activity explaining the fingerprint sensor location for fingerprint enrollment. |
| */ |
| public class FingerprintEnrollFindSensor extends FingerprintEnrollBase { |
| |
| private static final int CONFIRM_REQUEST = 1; |
| private static final int ENROLLING = 2; |
| public static final String EXTRA_KEY_LAUNCHED_CONFIRM = "launched_confirm_lock"; |
| |
| private FingerprintFindSensorAnimation mAnimation; |
| private boolean mLaunchedConfirmLock; |
| private FingerprintEnrollSidecar mSidecar; |
| private boolean mNextClicked; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(getContentView()); |
| setHeaderText(R.string.security_settings_fingerprint_enroll_find_sensor_title); |
| 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); |
| } |
| |
| protected int getContentView() { |
| return R.layout.fingerprint_enroll_find_sensor; |
| } |
| |
| @Override |
| protected void onStart() { |
| super.onStart(); |
| 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(); |
| mAnimation.pauseAnimation(); |
| } |
| |
| @Override |
| protected void onDestroy() { |
| super.onDestroy(); |
| mAnimation.stopAnimation(); |
| } |
| |
| @Override |
| 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); |
| } |
| |
| @Override |
| protected void onActivityResult(int requestCode, int resultCode, Intent data) { |
| if (requestCode == CONFIRM_REQUEST) { |
| 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(); |
| } |
| } else if (requestCode == ENROLLING) { |
| if (resultCode == RESULT_FINISHED) { |
| setResult(RESULT_FINISHED); |
| finish(); |
| } else if (resultCode == RESULT_SKIP) { |
| setResult(RESULT_SKIP); |
| finish(); |
| } else if (resultCode == RESULT_TIMEOUT) { |
| setResult(RESULT_TIMEOUT); |
| finish(); |
| } else { |
| FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this); |
| int enrolled = fpm.getEnrolledFingerprints().size(); |
| int max = getResources().getInteger( |
| 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 { |
| super.onActivityResult(requestCode, resultCode, data); |
| } |
| } |
| |
| private void launchConfirmLock() { |
| long challenge = Utils.getFingerprintManagerOrNull(this).preEnroll(); |
| ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this); |
| boolean launchedConfirmationActivity = false; |
| if (mUserId == UserHandle.USER_NULL) { |
| launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST, |
| getString(R.string.security_settings_fingerprint_preference_title), |
| null, null, challenge); |
| } else { |
| launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST, |
| getString(R.string.security_settings_fingerprint_preference_title), |
| null, null, challenge, mUserId); |
| } |
| if (!launchedConfirmationActivity) { |
| // This shouldn't happen, as we should only end up at this step if a lock thingy is |
| // already set. |
| finish(); |
| } else { |
| mLaunchedConfirmLock = true; |
| } |
| } |
| |
| @Override |
| public int getMetricsCategory() { |
| return MetricsEvent.FINGERPRINT_FIND_SENSOR; |
| } |
| } |