1 /* 2 * Copyright (C) 2021 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.server.biometrics.sensors.fingerprint; 18 19 import static android.hardware.fingerprint.FingerprintStateListener.STATE_AUTH_OTHER; 20 import static android.hardware.fingerprint.FingerprintStateListener.STATE_BP_AUTH; 21 import static android.hardware.fingerprint.FingerprintStateListener.STATE_ENROLLING; 22 import static android.hardware.fingerprint.FingerprintStateListener.STATE_IDLE; 23 import static android.hardware.fingerprint.FingerprintStateListener.STATE_KEYGUARD_AUTH; 24 25 import android.annotation.NonNull; 26 import android.hardware.fingerprint.FingerprintStateListener; 27 import android.hardware.fingerprint.IFingerprintStateListener; 28 import android.os.RemoteException; 29 import android.util.Slog; 30 31 import com.android.server.biometrics.Utils; 32 import com.android.server.biometrics.sensors.AuthenticationClient; 33 import com.android.server.biometrics.sensors.BaseClientMonitor; 34 import com.android.server.biometrics.sensors.fingerprint.hidl.FingerprintEnrollClient; 35 36 import java.util.concurrent.CopyOnWriteArrayList; 37 38 /** 39 * A callback for receiving notifications about changes in fingerprint state. 40 */ 41 public class FingerprintStateCallback implements BaseClientMonitor.Callback { 42 private @FingerprintStateListener.State int mFingerprintState; 43 @NonNull private final CopyOnWriteArrayList<IFingerprintStateListener> 44 mFingerprintStateListeners = new CopyOnWriteArrayList<>(); 45 FingerprintStateCallback()46 public FingerprintStateCallback() { 47 mFingerprintState = STATE_IDLE; 48 } 49 getFingerprintState()50 public int getFingerprintState() { 51 return mFingerprintState; 52 } 53 54 @Override onClientStarted(@onNull BaseClientMonitor client)55 public void onClientStarted(@NonNull BaseClientMonitor client) { 56 final int previousFingerprintState = mFingerprintState; 57 if (client instanceof AuthenticationClient) { 58 AuthenticationClient authClient = (AuthenticationClient) client; 59 if (authClient.isKeyguard()) { 60 mFingerprintState = STATE_KEYGUARD_AUTH; 61 } else if (authClient.isBiometricPrompt()) { 62 mFingerprintState = STATE_BP_AUTH; 63 } else { 64 mFingerprintState = STATE_AUTH_OTHER; 65 } 66 } else if (client instanceof FingerprintEnrollClient) { 67 mFingerprintState = STATE_ENROLLING; 68 } else { 69 Slog.w(FingerprintService.TAG, 70 "Other authentication client: " + Utils.getClientName(client)); 71 mFingerprintState = STATE_IDLE; 72 } 73 Slog.d(FingerprintService.TAG, "Fps state updated from " + previousFingerprintState 74 + " to " + mFingerprintState + ", client " + client); 75 notifyFingerprintStateListeners(mFingerprintState); 76 } 77 78 @Override onClientFinished(@onNull BaseClientMonitor client, boolean success)79 public void onClientFinished(@NonNull BaseClientMonitor client, boolean success) { 80 mFingerprintState = STATE_IDLE; 81 Slog.d(FingerprintService.TAG, 82 "Client finished, fps state updated to " + mFingerprintState + ", client " 83 + client); 84 notifyFingerprintStateListeners(mFingerprintState); 85 } 86 notifyFingerprintStateListeners(@ingerprintStateListener.State int newState)87 private void notifyFingerprintStateListeners(@FingerprintStateListener.State int newState) { 88 for (IFingerprintStateListener listener : mFingerprintStateListeners) { 89 try { 90 listener.onStateChanged(newState); 91 } catch (RemoteException e) { 92 Slog.e(FingerprintService.TAG, "Remote exception in fingerprint state change", e); 93 } 94 } 95 } 96 97 /** 98 * Enables clients to register a FingerprintStateListener. Used by FingerprintService to forward 99 * updates in fingerprint sensor state to the SideFpNsEventHandler 100 * @param listener 101 */ registerFingerprintStateListener(@onNull IFingerprintStateListener listener)102 public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) { 103 mFingerprintStateListeners.add(listener); 104 } 105 } 106