• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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
15  */
16 
17 package com.android.settings.fingerprint;
18 
19 import android.hardware.fingerprint.FingerprintManager;
20 import android.os.CancellationSignal;
21 import android.view.View;
22 import android.widget.ImageView;
23 import android.widget.TextView;
24 
25 import com.android.settings.R;
26 import com.android.settings.Utils;
27 
28 /**
29  * Small helper class to manage text/icon around fingerprint authentication UI.
30  */
31 public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallback {
32 
33     private static final long ERROR_TIMEOUT = 1300;
34 
35     private ImageView mIcon;
36     private TextView mErrorTextView;
37     private CancellationSignal mCancellationSignal;
38     private int mUserId;
39 
40     private Callback mCallback;
41     private FingerprintManager mFingerprintManager;
42 
FingerprintUiHelper(ImageView icon, TextView errorTextView, Callback callback, int userId)43     public FingerprintUiHelper(ImageView icon, TextView errorTextView, Callback callback,
44             int userId) {
45         mFingerprintManager = Utils.getFingerprintManagerOrNull(icon.getContext());
46         mIcon = icon;
47         mErrorTextView = errorTextView;
48         mCallback = callback;
49         mUserId = userId;
50     }
51 
startListening()52     public void startListening() {
53         if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()
54                 && mFingerprintManager.getEnrolledFingerprints(mUserId).size() > 0) {
55             mCancellationSignal = new CancellationSignal();
56             mFingerprintManager.setActiveUser(mUserId);
57             mFingerprintManager.authenticate(
58                     null, mCancellationSignal, 0 /* flags */, this, null, mUserId);
59             setFingerprintIconVisibility(true);
60             mIcon.setImageResource(R.drawable.ic_fingerprint);
61         }
62     }
63 
stopListening()64     public void stopListening() {
65         if (mCancellationSignal != null) {
66             mCancellationSignal.cancel();
67             mCancellationSignal = null;
68         }
69     }
70 
isListening()71     public boolean isListening() {
72         return mCancellationSignal != null && !mCancellationSignal.isCanceled();
73     }
74 
setFingerprintIconVisibility(boolean visible)75     private void setFingerprintIconVisibility(boolean visible) {
76         mIcon.setVisibility(visible ? View.VISIBLE : View.GONE);
77         mCallback.onFingerprintIconVisibilityChanged(visible);
78     }
79 
80     @Override
onAuthenticationError(int errMsgId, CharSequence errString)81     public void onAuthenticationError(int errMsgId, CharSequence errString) {
82         if (errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) {
83             // Only happens if we get preempted by another activity. Ignored.
84             return;
85         }
86         showError(errString);
87         setFingerprintIconVisibility(false);
88     }
89 
90     @Override
onAuthenticationHelp(int helpMsgId, CharSequence helpString)91     public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
92         showError(helpString);
93     }
94 
95     @Override
onAuthenticationFailed()96     public void onAuthenticationFailed() {
97         showError(mIcon.getResources().getString(
98                 R.string.fingerprint_not_recognized));
99     }
100 
101     @Override
onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result)102     public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
103         mIcon.setImageResource(R.drawable.ic_fingerprint_success);
104         mCallback.onAuthenticated();
105     }
106 
showError(CharSequence error)107     private void showError(CharSequence error) {
108         if (!isListening()) {
109             return;
110         }
111 
112         mIcon.setImageResource(R.drawable.ic_fingerprint_error);
113         mErrorTextView.setText(error);
114         mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
115         mErrorTextView.postDelayed(mResetErrorTextRunnable, ERROR_TIMEOUT);
116     }
117 
118     private Runnable mResetErrorTextRunnable = new Runnable() {
119         @Override
120         public void run() {
121             mErrorTextView.setText("");
122             mIcon.setImageResource(R.drawable.ic_fingerprint);
123         }
124     };
125 
126     public interface Callback {
onAuthenticated()127         void onAuthenticated();
onFingerprintIconVisibilityChanged(boolean visible)128         void onFingerprintIconVisibilityChanged(boolean visible);
129     }
130 }
131