2 * Copyright (C) 2015 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
17 package com.android.settings.fingerprint;
19 import android.content.Intent;
20 import android.hardware.fingerprint.FingerprintManager;
21 import android.os.Bundle;
22 import android.os.UserHandle;
24 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
25 import com.android.settings.ChooseLockSettingsHelper;
26 import com.android.settings.R;
27 import com.android.settings.Utils;
28 import com.android.settings.fingerprint.FingerprintEnrollSidecar.Listener;
31 * Activity explaining the fingerprint sensor location for fingerprint enrollment.
33 public class FingerprintEnrollFindSensor extends FingerprintEnrollBase {
35 private static final int CONFIRM_REQUEST = 1;
36 private static final int ENROLLING = 2;
37 public static final String EXTRA_KEY_LAUNCHED_CONFIRM = "launched_confirm_lock";
39 private FingerprintFindSensorAnimation mAnimation;
40 private boolean mLaunchedConfirmLock;
41 private FingerprintEnrollSidecar mSidecar;
42 private boolean mNextClicked;
45 protected void onCreate(Bundle savedInstanceState) {
46 super.onCreate(savedInstanceState);
47 setContentView(getContentView());
48 setHeaderText(R.string.security_settings_fingerprint_enroll_find_sensor_title);
49 if (savedInstanceState != null) {
50 mLaunchedConfirmLock = savedInstanceState.getBoolean(EXTRA_KEY_LAUNCHED_CONFIRM);
51 mToken = savedInstanceState.getByteArray(
52 ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
54 if (mToken == null && !mLaunchedConfirmLock) {
56 } else if (mToken != null) {
57 startLookingForFingerprint(); // already confirmed, so start looking for fingerprint
59 mAnimation = (FingerprintFindSensorAnimation) findViewById(
60 R.id.fingerprint_sensor_location_animation);
63 protected int getContentView() {
64 return R.layout.fingerprint_enroll_find_sensor;
68 protected void onStart() {
70 mAnimation.startAnimation();
73 private void startLookingForFingerprint() {
74 mSidecar = (FingerprintEnrollSidecar) getFragmentManager().findFragmentByTag(
75 FingerprintEnrollEnrolling.TAG_SIDECAR);
76 if (mSidecar == null) {
77 mSidecar = new FingerprintEnrollSidecar();
78 getFragmentManager().beginTransaction()
79 .add(mSidecar, FingerprintEnrollEnrolling.TAG_SIDECAR).commit();
81 mSidecar.setListener(new Listener() {
83 public void onEnrollmentProgressChange(int steps, int remaining) {
85 if (!mSidecar.cancelEnrollment()) {
91 public void onEnrollmentHelp(CharSequence helpString) {
95 public void onEnrollmentError(int errMsgId, CharSequence errString) {
96 if (mNextClicked && errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
105 protected void onStop() {
107 mAnimation.pauseAnimation();
111 protected void onDestroy() {
113 mAnimation.stopAnimation();
117 public void onSaveInstanceState(Bundle outState) {
118 super.onSaveInstanceState(outState);
119 outState.putBoolean(EXTRA_KEY_LAUNCHED_CONFIRM, mLaunchedConfirmLock);
120 outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
124 protected void onNextButtonClick() {
126 if (mSidecar == null || (mSidecar != null && !mSidecar.cancelEnrollment())) {
127 proceedToEnrolling();
131 private void proceedToEnrolling() {
132 getFragmentManager().beginTransaction().remove(mSidecar).commit();
134 startActivityForResult(getEnrollingIntent(), ENROLLING);
138 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
139 if (requestCode == CONFIRM_REQUEST) {
140 if (resultCode == RESULT_OK) {
141 mToken = data.getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
142 overridePendingTransition(R.anim.suw_slide_next_in, R.anim.suw_slide_next_out);
143 getIntent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
144 startLookingForFingerprint();
148 } else if (requestCode == ENROLLING) {
149 if (resultCode == RESULT_FINISHED) {
150 setResult(RESULT_FINISHED);
152 } else if (resultCode == RESULT_SKIP) {
153 setResult(RESULT_SKIP);
155 } else if (resultCode == RESULT_TIMEOUT) {
156 setResult(RESULT_TIMEOUT);
159 FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
160 int enrolled = fpm.getEnrolledFingerprints().size();
161 int max = getResources().getInteger(
162 com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
163 if (enrolled >= max) {
166 // We came back from enrolling but it wasn't completed, start again.
167 startLookingForFingerprint();
171 super.onActivityResult(requestCode, resultCode, data);
175 private void launchConfirmLock() {
176 long challenge = Utils.getFingerprintManagerOrNull(this).preEnroll();
177 ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
178 boolean launchedConfirmationActivity = false;
179 if (mUserId == UserHandle.USER_NULL) {
180 launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST,
181 getString(R.string.security_settings_fingerprint_preference_title),
182 null, null, challenge);
184 launchedConfirmationActivity = helper.launchConfirmationActivity(CONFIRM_REQUEST,
185 getString(R.string.security_settings_fingerprint_preference_title),
186 null, null, challenge, mUserId);
188 if (!launchedConfirmationActivity) {
189 // This shouldn't happen, as we should only end up at this step if a lock thingy is
193 mLaunchedConfirmLock = true;
198 public int getMetricsCategory() {
199 return MetricsEvent.FINGERPRINT_FIND_SENSOR;