| /* |
| * 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.example.android.fingerprintdialog; |
| |
| import android.hardware.fingerprint.FingerprintManager; |
| import android.os.CancellationSignal; |
| import android.widget.ImageView; |
| import android.widget.TextView; |
| |
| /** |
| * Small helper class to manage text/icon around fingerprint authentication UI. |
| */ |
| public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallback { |
| |
| private static final long ERROR_TIMEOUT_MILLIS = 1600; |
| private static final long SUCCESS_DELAY_MILLIS = 1300; |
| |
| private final FingerprintManager mFingerprintManager; |
| private final ImageView mIcon; |
| private final TextView mErrorTextView; |
| private final Callback mCallback; |
| private CancellationSignal mCancellationSignal; |
| |
| private boolean mSelfCancelled; |
| |
| /** |
| * Constructor for {@link FingerprintUiHelper}. |
| */ |
| FingerprintUiHelper(FingerprintManager fingerprintManager, |
| ImageView icon, TextView errorTextView, Callback callback) { |
| mFingerprintManager = fingerprintManager; |
| mIcon = icon; |
| mErrorTextView = errorTextView; |
| mCallback = callback; |
| } |
| |
| public boolean isFingerprintAuthAvailable() { |
| // The line below prevents the false positive inspection from Android Studio |
| // noinspection ResourceType |
| return mFingerprintManager.isHardwareDetected() |
| && mFingerprintManager.hasEnrolledFingerprints(); |
| } |
| |
| public void startListening(FingerprintManager.CryptoObject cryptoObject) { |
| if (!isFingerprintAuthAvailable()) { |
| return; |
| } |
| mCancellationSignal = new CancellationSignal(); |
| mSelfCancelled = false; |
| // The line below prevents the false positive inspection from Android Studio |
| // noinspection ResourceType |
| mFingerprintManager |
| .authenticate(cryptoObject, mCancellationSignal, 0 /* flags */, this, null); |
| mIcon.setImageResource(R.drawable.ic_fp_40px); |
| } |
| |
| public void stopListening() { |
| if (mCancellationSignal != null) { |
| mSelfCancelled = true; |
| mCancellationSignal.cancel(); |
| mCancellationSignal = null; |
| } |
| } |
| |
| @Override |
| public void onAuthenticationError(int errMsgId, CharSequence errString) { |
| if (!mSelfCancelled) { |
| showError(errString); |
| mIcon.postDelayed(new Runnable() { |
| @Override |
| public void run() { |
| mCallback.onError(); |
| } |
| }, ERROR_TIMEOUT_MILLIS); |
| } |
| } |
| |
| @Override |
| public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { |
| showError(helpString); |
| } |
| |
| @Override |
| public void onAuthenticationFailed() { |
| showError(mIcon.getResources().getString( |
| R.string.fingerprint_not_recognized)); |
| } |
| |
| @Override |
| public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { |
| mErrorTextView.removeCallbacks(mResetErrorTextRunnable); |
| mIcon.setImageResource(R.drawable.ic_fingerprint_success); |
| mErrorTextView.setTextColor( |
| mErrorTextView.getResources().getColor(R.color.success_color, null)); |
| mErrorTextView.setText( |
| mErrorTextView.getResources().getString(R.string.fingerprint_success)); |
| mIcon.postDelayed(new Runnable() { |
| @Override |
| public void run() { |
| mCallback.onAuthenticated(); |
| } |
| }, SUCCESS_DELAY_MILLIS); |
| } |
| |
| private void showError(CharSequence error) { |
| mIcon.setImageResource(R.drawable.ic_fingerprint_error); |
| mErrorTextView.setText(error); |
| mErrorTextView.setTextColor( |
| mErrorTextView.getResources().getColor(R.color.warning_color, null)); |
| mErrorTextView.removeCallbacks(mResetErrorTextRunnable); |
| mErrorTextView.postDelayed(mResetErrorTextRunnable, ERROR_TIMEOUT_MILLIS); |
| } |
| |
| private Runnable mResetErrorTextRunnable = new Runnable() { |
| @Override |
| public void run() { |
| mErrorTextView.setTextColor( |
| mErrorTextView.getResources().getColor(R.color.hint_color, null)); |
| mErrorTextView.setText( |
| mErrorTextView.getResources().getString(R.string.fingerprint_hint)); |
| mIcon.setImageResource(R.drawable.ic_fp_40px); |
| } |
| }; |
| |
| public interface Callback { |
| |
| void onAuthenticated(); |
| |
| void onError(); |
| } |
| } |