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

Commit ed18d808 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

Add and use ServiceProvider interface on fingerprint2.1

This interface should allow easy support for multiple HAL interfaces.
For example,

for (ServiceProvider p : providers) {
    if (p.containsSensor(sensorId)) {
        p.authenticate(sensorId, ...)
    }
}

or,

ServiceProvider provider = getProviderFor(sensorId)
if (provider != null) provider.authenticate(sensorId, ...)

This should reduce lots of repeated null checks, sensorId checks,
etc. and give FingerprintService a easy way to perform operations
on providers, given a sensorId.

Some of the FingerprintManager code is not sensorId-specific,
but we can update those in the future. Otherwise we have to
touch multiple projects (settings, etc). For now, all client-side
code assumes only a single sensor, so that's what we'll support
from FingerprintService.

Bug: 168843828
Test: No effect on existing devices
Test: atest com.android.server.biometrics
Test: atest com.android.systemui.biometrics

Change-Id: Icca5bc1e128afa1bb7b2c05227e87567e564e4cf
parent f15229d4
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -746,7 +746,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
     * @hide
     */
    @RequiresPermission(USE_BIOMETRIC_INTERNAL)
    public void setUdfpsOverlayController(IUdfpsOverlayController controller) {
    public void setUdfpsOverlayController(@NonNull IUdfpsOverlayController controller) {
        if (mService == null) {
            Slog.w(TAG, "setUdfpsOverlayController: no fingerprint service");
            return;
@@ -763,14 +763,14 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
     * @hide
     */
    @RequiresPermission(USE_BIOMETRIC_INTERNAL)
    public void onFingerDown(int x, int y, float minor, float major) {
    public void onFingerDown(int sensorId, int x, int y, float minor, float major) {
        if (mService == null) {
            Slog.w(TAG, "onFingerDown: no fingerprint service");
            return;
        }

        try {
            mService.onFingerDown(x, y, minor, major);
            mService.onFingerDown(sensorId, x, y, minor, major);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
@@ -780,14 +780,14 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
     * @hide
     */
    @RequiresPermission(USE_BIOMETRIC_INTERNAL)
    public void onFingerUp() {
    public void onFingerUp(int sensorId) {
        if (mService == null) {
            Slog.w(TAG, "onFingerDown: no fingerprint service");
            return;
        }

        try {
            mService.onFingerUp();
            mService.onFingerUp(sensorId);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
+0 −2
Original line number Diff line number Diff line
@@ -18,9 +18,7 @@ package android.hardware.fingerprint;

import android.annotation.IntDef;
import android.hardware.biometrics.SensorProperties;
import android.hardware.face.FaceSensorProperties;
import android.os.Parcel;
import android.os.Parcelable;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+2 −2
Original line number Diff line number Diff line
@@ -121,10 +121,10 @@ interface IFingerprintService {
    void initializeConfiguration(int sensorId, int strength);

    // Notifies about a finger touching the sensor area.
    void onFingerDown(int x, int y, float minor, float major);
    void onFingerDown(int sensorId, int x, int y, float minor, float major);

    // Notifies about a finger leaving the sensor area.
    void onFingerUp();
    void onFingerUp(int sensorId);

    // Sets the controller for managing the UDFPS overlay.
    void setUdfpsOverlayController(in IUdfpsOverlayController controller);
+3 −3
Original line number Diff line number Diff line
@@ -21,11 +21,11 @@ package android.hardware.fingerprint;
 */
oneway interface IUdfpsOverlayController {
    // Shows the overlay.
    void showUdfpsOverlay();
    void showUdfpsOverlay(int sensorId);

    // Hides the overlay.
    void hideUdfpsOverlay();
    void hideUdfpsOverlay(int sensorId);

    // Shows debug messages on the UDFPS overlay.
    void setDebugMessage(String message);
    void setDebugMessage(int sensorId, String message);
}
+32 −5
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.biometrics;

import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkNotNull;

import android.annotation.SuppressLint;
@@ -25,6 +26,7 @@ import android.content.res.TypedArray;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorProperties;
import android.hardware.fingerprint.IUdfpsOverlayController;
import android.os.PowerManager;
import android.os.UserHandle;
@@ -41,6 +43,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.internal.BrightnessSynchronizer;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.DozeReceiver;
@@ -50,13 +53,22 @@ import com.android.systemui.util.settings.SystemSettings;

import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

import javax.inject.Inject;

/**
 * Shows and hides the under-display fingerprint sensor (UDFPS) overlay, handles UDFPS touch events,
 * and coordinates triggering of the high-brightness mode (HBM).
 *
 * Note that the current architecture is designed so that a single {@link UdfpsController}
 * controls/manages all UDFPS sensors. In other words, a single controller is registered with
 * {@link com.android.server.biometrics.sensors.fingerprint.FingerprintService}, and interfaces such
 * as {@link FingerprintManager#onFingerDown(int, int, int, float, float)} or
 * {@link IUdfpsOverlayController#showUdfpsOverlay(int)}should all have
 * {@code sensorId} parameters.
 */
@SuppressWarnings("deprecation")
class UdfpsController implements DozeReceiver {
    private static final String TAG = "UdfpsController";
    // Gamma approximation for the sRGB color space.
@@ -64,6 +76,10 @@ class UdfpsController implements DozeReceiver {
    private static final long AOD_INTERRUPT_TIMEOUT_MILLIS = 1000;

    private final FingerprintManager mFingerprintManager;
    // Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple
    // sensors, this, in addition to a lot of the code here, will be updated.
    @VisibleForTesting
    final int mUdfpsSensorId;
    private final WindowManager mWindowManager;
    private final SystemSettings mSystemSettings;
    private final DelayableExecutor mFgExecutor;
@@ -103,17 +119,17 @@ class UdfpsController implements DozeReceiver {

    public class UdfpsOverlayController extends IUdfpsOverlayController.Stub {
        @Override
        public void showUdfpsOverlay() {
        public void showUdfpsOverlay(int sensorId) {
            UdfpsController.this.setShowOverlay(true);
        }

        @Override
        public void hideUdfpsOverlay() {
        public void hideUdfpsOverlay(int sensorId) {
            UdfpsController.this.setShowOverlay(false);
        }

        @Override
        public void setDebugMessage(String message) {
        public void setDebugMessage(int sensorId, String message) {
            mView.setDebugMessage(message);
        }
    }
@@ -165,6 +181,17 @@ class UdfpsController implements DozeReceiver {
        mFgExecutor = fgExecutor;
        mLayoutParams = createLayoutParams(context);

        int udfpsSensorId = -1;
        for (FingerprintSensorProperties props : mFingerprintManager.getSensorProperties()) {
            if (props.isAnyUdfpsType()) {
                udfpsSensorId = props.sensorId;
                break;
            }
        }
        // At least one UDFPS sensor exists
        checkArgument(udfpsSensorId != -1);
        mUdfpsSensorId = udfpsSensorId;

        mView = (UdfpsView) inflater.inflate(R.layout.udfps_view, null, false);

        mHbmPath = resources.getString(R.string.udfps_hbm_sysfs_path);
@@ -347,7 +374,7 @@ class UdfpsController implements DozeReceiver {
                fw.write(mHbmEnableCommand);
                fw.close();
            }
            mFingerprintManager.onFingerDown(x, y, minor, major);
            mFingerprintManager.onFingerDown(mUdfpsSensorId, x, y, minor, major);
        } catch (IOException e) {
            mView.hideScrimAndDot();
            Log.e(TAG, "onFingerDown | failed to enable HBM: " + e.getMessage());
@@ -355,7 +382,7 @@ class UdfpsController implements DozeReceiver {
    }

    private void onFingerUp() {
        mFingerprintManager.onFingerUp();
        mFingerprintManager.onFingerUp(mUdfpsSensorId);
        // Hiding the scrim before disabling HBM results in less noticeable flicker.
        mView.hideScrimAndDot();
        if (mHbmSupported) {
Loading