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