Skip to content

Most visited

Recently visited

navigation
FingerprintDialog / src / com.example.android.fingerprintdialog /

FingerprintUiHelper.java

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.example.android.fingerprintdialog;
18
 
19
import android.hardware.fingerprint.FingerprintManager;
20
import android.os.CancellationSignal;
21
import android.widget.ImageView;
22
import android.widget.TextView;
23
 
24
/**
25
 * Small helper class to manage text/icon around fingerprint authentication UI.
26
 */
27
public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallback {
28
 
29
    private static final long ERROR_TIMEOUT_MILLIS = 1600;
30
    private static final long SUCCESS_DELAY_MILLIS = 1300;
31
 
32
    private final FingerprintManager mFingerprintManager;
33
    private final ImageView mIcon;
34
    private final TextView mErrorTextView;
35
    private final Callback mCallback;
36
    private CancellationSignal mCancellationSignal;
37
 
38
    private boolean mSelfCancelled;
39
 
40
    /**
41
     * Constructor for {@link FingerprintUiHelper}.
42
     */
43
    FingerprintUiHelper(FingerprintManager fingerprintManager,
44
            ImageView icon, TextView errorTextView, Callback callback) {
45
        mFingerprintManager = fingerprintManager;
46
        mIcon = icon;
47
        mErrorTextView = errorTextView;
48
        mCallback = callback;
49
    }
50
 
51
    public boolean isFingerprintAuthAvailable() {
52
        // The line below prevents the false positive inspection from Android Studio
53
        // noinspection ResourceType
54
        return mFingerprintManager.isHardwareDetected()
55
                && mFingerprintManager.hasEnrolledFingerprints();
56
    }
57
 
58
    public void startListening(FingerprintManager.CryptoObject cryptoObject) {
59
        if (!isFingerprintAuthAvailable()) {
60
            return;
61
        }
62
        mCancellationSignal = new CancellationSignal();
63
        mSelfCancelled = false;
64
        // The line below prevents the false positive inspection from Android Studio
65
        // noinspection ResourceType
66
        mFingerprintManager
67
                .authenticate(cryptoObject, mCancellationSignal, 0 /* flags */, this, null);
68
        mIcon.setImageResource(R.drawable.ic_fp_40px);
69
    }
70
 
71
    public void stopListening() {
72
        if (mCancellationSignal != null) {
73
            mSelfCancelled = true;
74
            mCancellationSignal.cancel();
75
            mCancellationSignal = null;
76
        }
77
    }
78
 
79
    @Override
80
    public void onAuthenticationError(int errMsgId, CharSequence errString) {
81
        if (!mSelfCancelled) {
82
            showError(errString);
83
            mIcon.postDelayed(new Runnable() {
84
                @Override
85
                public void run() {
86
                    mCallback.onError();
87
                }
88
            }, ERROR_TIMEOUT_MILLIS);
89
        }
90
    }
91
 
92
    @Override
93
    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
94
        showError(helpString);
95
    }
96
 
97
    @Override
98
    public void onAuthenticationFailed() {
99
        showError(mIcon.getResources().getString(
100
                R.string.fingerprint_not_recognized));
101
    }
102
 
103
    @Override
104
    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
105
        mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
106
        mIcon.setImageResource(R.drawable.ic_fingerprint_success);
107
        mErrorTextView.setTextColor(
108
                mErrorTextView.getResources().getColor(R.color.success_color, null));
109
        mErrorTextView.setText(
110
                mErrorTextView.getResources().getString(R.string.fingerprint_success));
111
        mIcon.postDelayed(new Runnable() {
112
            @Override
113
            public void run() {
114
                mCallback.onAuthenticated();
115
            }
116
        }, SUCCESS_DELAY_MILLIS);
117
    }
118
 
119
    private void showError(CharSequence error) {
120
        mIcon.setImageResource(R.drawable.ic_fingerprint_error);
121
        mErrorTextView.setText(error);
122
        mErrorTextView.setTextColor(
123
                mErrorTextView.getResources().getColor(R.color.warning_color, null));
124
        mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
125
        mErrorTextView.postDelayed(mResetErrorTextRunnable, ERROR_TIMEOUT_MILLIS);
126
    }
127
 
128
    private Runnable mResetErrorTextRunnable = new Runnable() {
129
        @Override
130
        public void run() {
131
            mErrorTextView.setTextColor(
132
                    mErrorTextView.getResources().getColor(R.color.hint_color, null));
133
            mErrorTextView.setText(
134
                    mErrorTextView.getResources().getString(R.string.fingerprint_hint));
135
            mIcon.setImageResource(R.drawable.ic_fp_40px);
136
        }
137
    };
138
 
139
    public interface Callback {
140
 
141
        void onAuthenticated();
142
 
143
        void onError();
144
    }
145
}
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.