Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6fcb0089 authored by Grace Cheng's avatar Grace Cheng Committed by Android (Google) Code Review
Browse files

Merge "Configures FingerprintService to use FingerprintStateCallback to notify...

Merge "Configures FingerprintService to use FingerprintStateCallback to notify clients of fingerprint sensor state changes" into sc-dev
parents 69f6b650 4a2c94ec
Loading
Loading
Loading
Loading
+53 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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 android.hardware.fingerprint;

import android.annotation.IntDef;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Interface for handling state changes in fingerprint-related events.
 * @hide
 */
public abstract class FingerprintStateListener extends IFingerprintStateListener.Stub {
    // Operation has not started yet.
    public static final int STATE_IDLE = 0;

    // Enrollment is in progress.
    public static final int STATE_ENROLLING = 1;

    // Lockscreen authentication in progress.
    public static final int STATE_KEYGUARD_AUTH = 2;

    // BiometricPrompt authentication in progress.
    public static final int STATE_BP_AUTH = 3;

    // Other Authentication State
    public static final int STATE_AUTH_OTHER = 4;

    @IntDef({STATE_IDLE, STATE_ENROLLING, STATE_KEYGUARD_AUTH, STATE_BP_AUTH, STATE_AUTH_OTHER})
    @Retention(RetentionPolicy.SOURCE)
    public @interface State {}

    /**
     * Defines behavior in response to state update
     * @param newState new state of fingerprint sensor
     */
    public abstract void onStateChanged(@FingerprintStateListener.State int newState);
}
+4 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.hardware.biometrics.ITestSession;
import android.hardware.biometrics.ITestSessionCallback;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IFingerprintStateListener;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
@@ -154,4 +155,7 @@ interface IFingerprintService {

    // Sets the controller for managing the UDFPS overlay.
    void setUdfpsOverlayController(in IUdfpsOverlayController controller);

    // Registers FingerprintStateListener in list stored by FingerprintService
    void registerFingerprintStateListener(IFingerprintStateListener listener);
}
+27 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 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 android.hardware.fingerprint;

import android.hardware.fingerprint.Fingerprint;

/**
 * Communication channel for FingerprintManager to register the FingerprintStateListener
 * in FingerprintService
 * @hide
 */
oneway interface IFingerprintStateListener {
    void onStateChanged(int newState);
}
+1 −2
Original line number Diff line number Diff line
@@ -471,8 +471,7 @@ public class BiometricScheduler {
     * Adds a {@link BaseClientMonitor} to the pending queue
     *
     * @param clientMonitor        operation to be scheduled
     * @param clientCallback optional callback, invoked when the client is finished, but
     *                             before it has been removed from the queue.
     * @param clientCallback optional callback, invoked when the client state changes
     */
    public void scheduleClientMonitor(@NonNull BaseClientMonitor clientMonitor,
            @Nullable BaseClientMonitor.Callback clientCallback) {
+81 −5
Original line number Diff line number Diff line
@@ -29,6 +29,11 @@ import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPR
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_USER_CANCELED;
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR;
import static android.hardware.biometrics.SensorProperties.STRENGTH_STRONG;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_AUTH_OTHER;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_BP_AUTH;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_ENROLLING;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_IDLE;
import static android.hardware.fingerprint.FingerprintStateListener.STATE_KEYGUARD_AUTH;

import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -50,9 +55,11 @@ import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.FingerprintServiceReceiver;
import android.hardware.fingerprint.FingerprintStateListener;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.fingerprint.IFingerprintServiceReceiver;
import android.hardware.fingerprint.IFingerprintStateListener;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.Binder;
import android.os.Build;
@@ -75,6 +82,8 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricServiceCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.LockoutResetDispatcher;
@@ -82,6 +91,7 @@ import com.android.server.biometrics.sensors.LockoutTracker;
import com.android.server.biometrics.sensors.fingerprint.aidl.FingerprintProvider;
import com.android.server.biometrics.sensors.fingerprint.hidl.Fingerprint21;
import com.android.server.biometrics.sensors.fingerprint.hidl.Fingerprint21UdfpsMock;
import com.android.server.biometrics.sensors.fingerprint.hidl.FingerprintEnrollClient;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -105,6 +115,62 @@ public class FingerprintService extends SystemService implements BiometricServic
    private final LockPatternUtils mLockPatternUtils;
    private final FingerprintServiceWrapper mServiceWrapper;
    @NonNull private List<ServiceProvider> mServiceProviders;
    @NonNull private final FingerprintStateCallback mFingerprintStateCallback;
    @NonNull private @FingerprintStateListener.State int mFingerprintState;

    private List<IFingerprintStateListener> mFingerprintStateListeners = new ArrayList<>();

    /** Callback to receive notifications about changes in fingerprint state. */
    public final class FingerprintStateCallback implements BaseClientMonitor.Callback {
        @Override
        public void onClientStarted(@NonNull BaseClientMonitor client) {
            final int previousFingerprintState = mFingerprintState;
            if (client instanceof AuthenticationClient) {
                AuthenticationClient authClient = (AuthenticationClient) client;
                if (authClient.isKeyguard()) {
                    mFingerprintState = STATE_KEYGUARD_AUTH;
                } else if (authClient.isBiometricPrompt()) {
                    mFingerprintState = STATE_BP_AUTH;
                } else {
                    mFingerprintState = STATE_AUTH_OTHER;
                }
            } else if (client instanceof FingerprintEnrollClient) {
                mFingerprintState = STATE_ENROLLING;
            } else {
                Slog.w(TAG, "Other authentication client: " + Utils.getClientName(client));
                mFingerprintState = STATE_IDLE;
            }
            Slog.d(TAG, "Fps state updated from " + previousFingerprintState + " to "
                    + mFingerprintState + ", client " + client);
            notifyFingerprintStateListeners(mFingerprintState);
        }

        @Override
        public void onClientFinished(@NonNull BaseClientMonitor client, boolean success) {
            mFingerprintState = STATE_IDLE;
            Slog.d(TAG, "Client finished, fps state updated to " + mFingerprintState
                    + ", client " + client);
            notifyFingerprintStateListeners(mFingerprintState);
        }

        private void notifyFingerprintStateListeners(@FingerprintStateListener.State int newState) {
            for (IFingerprintStateListener listener : mFingerprintStateListeners) {
                try {
                    listener.onStateChanged(newState);
                } catch (RemoteException e) {
                    Slog.e(TAG, "Remote exception in fingerprint state change", e);
                }
            }
        }
    }

    /**
     * Registers FingerprintStateListener in list stored by FingerprintService
     * @param listener new FingerprintStateListener being added
     */
    public void registerFingerprintStateListener(IFingerprintStateListener listener) {
        mFingerprintStateListeners.add(listener);
    }

    /**
     * Receives the incoming binder calls from FingerprintManager.
@@ -122,7 +188,8 @@ public class FingerprintService extends SystemService implements BiometricServic
                return null;
            }

            return provider.createTestSession(sensorId, callback, opPackageName);
            return provider.createTestSession(sensorId, callback, mFingerprintStateCallback,
                    opPackageName);
        }

        @Override
@@ -205,7 +272,7 @@ public class FingerprintService extends SystemService implements BiometricServic
            }

            provider.second.scheduleEnroll(provider.first, token, hardwareAuthToken, userId,
                    receiver, opPackageName, enrollReason);
                    receiver, opPackageName, enrollReason, mFingerprintStateCallback);
        }

        @Override // Binder call
@@ -284,7 +351,7 @@ public class FingerprintService extends SystemService implements BiometricServic
            } else {
                provider.second.scheduleAuthenticate(provider.first, token, operationId, userId,
                        0 /* cookie */, new ClientMonitorCallbackConverter(receiver), opPackageName,
                        restricted, statsClient, isKeyguard);
                        restricted, statsClient, isKeyguard, mFingerprintStateCallback);
            }
        }

@@ -393,7 +460,7 @@ public class FingerprintService extends SystemService implements BiometricServic

            provider.second.scheduleFingerDetect(provider.first, token, userId,
                    new ClientMonitorCallbackConverter(receiver), opPackageName,
                    BiometricsProtoEnums.CLIENT_KEYGUARD);
                    BiometricsProtoEnums.CLIENT_KEYGUARD, mFingerprintStateCallback);
        }

        @Override // Binder call
@@ -411,7 +478,8 @@ public class FingerprintService extends SystemService implements BiometricServic
            final boolean restricted = true; // BiometricPrompt is always restricted
            provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie,
                    new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted,
                    BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication);
                    BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication,
                    mFingerprintStateCallback);
        }

        @Override // Binder call
@@ -568,6 +636,7 @@ public class FingerprintService extends SystemService implements BiometricServic
                                : provider.getSensorProperties()) {
                            pw.println("Dumping for sensorId: " + props.sensorId
                                    + ", provider: " + provider.getClass().getSimpleName());
                            pw.println("Fps state: " + mFingerprintState);
                            provider.dumpInternal(props.sensorId, pw);
                            pw.println();
                        }
@@ -813,6 +882,11 @@ public class FingerprintService extends SystemService implements BiometricServic
                provider.setUdfpsOverlayController(controller);
            }
        }

        @Override
        public void registerFingerprintStateListener(@NonNull IFingerprintStateListener listener) {
            FingerprintService.this.registerFingerprintStateListener(listener);
        }
    }

    public FingerprintService(Context context) {
@@ -823,6 +897,8 @@ public class FingerprintService extends SystemService implements BiometricServic
        mLockoutResetDispatcher = new LockoutResetDispatcher(context);
        mLockPatternUtils = new LockPatternUtils(context);
        mServiceProviders = new ArrayList<>();
        mFingerprintStateCallback = new FingerprintStateCallback();
        mFingerprintState = STATE_IDLE;
    }

    @Override
Loading