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

Commit 02814776 authored by Joe Bolinger's avatar Joe Bolinger
Browse files

Update client monitors to use HAL context methods.

Context ids and reasons are still placeholders pending update from sysui.

Bug: 204585936
Bug: 204584403
Test: atest FingerprintAuthenticationClientTest FingerprintEnrollClientTest FingerprintDetectClientTest FaceAuthenticationClientTest FaceDetectClientTest FaceEnrollClientTest BiometricContextProviderTest

Change-Id: Id07e160be5a5953c7e50920249ef69e213420d84
parent 1a2536af
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@

package com.android.server.biometrics.log;

import android.annotation.NonNull;
import android.hardware.biometrics.common.OperationContext;

import java.util.function.Consumer;

/**
 * Cache for system state not directly related to biometric operations that is used for
 * logging or optimizations.
@@ -26,6 +31,17 @@ public interface BiometricContext {
        return BiometricContextProvider.sInstance.get();
    }

    /** If the display is off or in AOD. */
    boolean isDozing();
    /** If the display is in AOD. */
    boolean isAoD();

    /**
     * Subscribe to context changes.
     *
     * @param context context that will be modified when changed
     * @param consumer callback when the context is modified
     */
    void subscribe(@NonNull OperationContext context, @NonNull Consumer<OperationContext> consumer);

    /** Unsubscribe from context changes. */
    void unsubscribe(@NonNull OperationContext context);
}
+61 −20
Original line number Diff line number Diff line
@@ -16,15 +16,24 @@

package com.android.server.biometrics.log;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.biometrics.IBiometricContextListener;
import android.hardware.biometrics.common.OperationContext;
import android.os.Handler;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Singleton;
import android.util.Slog;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.IStatusBarService;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;

/**
 * A default provider for {@link BiometricContext}.
 */
@@ -32,33 +41,65 @@ class BiometricContextProvider implements BiometricContext {

    private static final String TAG = "BiometricContextProvider";

    private BiometricContextProvider() {}

    static final Singleton<BiometricContextProvider> sInstance =
            new Singleton<BiometricContextProvider>() {
                @Override
                protected BiometricContextProvider create() {
            final BiometricContextProvider provider =  new BiometricContextProvider();
                    return new BiometricContextProvider(IStatusBarService.Stub.asInterface(
                            ServiceManager.getService(
                                    Context.STATUS_BAR_SERVICE)), null /* handler */);
                }
            };

    @NonNull
    private final Map<OperationContext, Consumer<OperationContext>> mSubscribers =
            new ConcurrentHashMap<>();

    @VisibleForTesting
    BiometricContextProvider(@NonNull IStatusBarService service, @Nullable Handler handler) {
        try {
                IStatusBarService.Stub.asInterface(
                        ServiceManager.getService(Context.STATUS_BAR_SERVICE))
                            .setBiometicContextListener(new IBiometricContextListener.Stub() {
            service.setBiometicContextListener(new IBiometricContextListener.Stub() {
                @Override
                public void onDozeChanged(boolean isDozing) {
                                    provider.mIsDozing = isDozing;
                    mIsDozing = isDozing;
                    notifyChanged();
                }

                private void notifyChanged() {
                    if (handler != null) {
                        handler.post(() -> notifySubscribers());
                    } else {
                        notifySubscribers();
                    }
                }
            });
        } catch (RemoteException e) {
            Slog.e(TAG, "Unable to register biometric context listener", e);
        }
            return provider;
    }
    };

    private boolean mIsDozing = false;

    @Override
    public boolean isDozing() {
    public boolean isAoD() {
        return mIsDozing;
    }

    @Override
    public void subscribe(@NonNull OperationContext context,
            @NonNull Consumer<OperationContext> consumer) {
        mSubscribers.put(context, consumer);
    }

    @Override
    public void unsubscribe(@NonNull OperationContext context) {
        mSubscribers.remove(context);
    }

    private void notifySubscribers() {
        mSubscribers.forEach((context, consumer) -> {
            context.isAoD = mIsDozing;
            consumer.accept(context);
        });
    }
}
+11 −0
Original line number Diff line number Diff line
@@ -79,6 +79,12 @@ public class BiometricLogger {
        }
    };

    /** Get a new logger with all unknown fields (for operations that do not require logs). */
    public static BiometricLogger ofUnknown(@NonNull Context context) {
        return new BiometricLogger(context, BiometricsProtoEnums.MODALITY_UNKNOWN,
                BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN);
    }

    /**
     * @param context system_server context
     * @param statsModality One of {@link BiometricsProtoEnums} MODALITY_* constants.
@@ -103,6 +109,11 @@ public class BiometricLogger {
        mSensorManager = sensorManager;
    }

    /** Creates a new logger with the action replaced with the new action. */
    public BiometricLogger swapAction(@NonNull Context context, int statsAction) {
        return new BiometricLogger(context, mStatsModality, statsAction, mStatsClient);
    }

    /** Disable logging metrics and only log critical events, such as system health issues. */
    public void disableMetrics() {
        mShouldLogMetrics = false;
+6 −3
Original line number Diff line number Diff line
@@ -29,6 +29,9 @@ import android.os.VibrationEffect;
import android.os.Vibrator;
import android.util.Slog;

import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricLogger;

import java.util.function.Supplier;

/**
@@ -57,9 +60,9 @@ public abstract class AcquisitionClient<T> extends HalClientMonitor<T> implement
    public AcquisitionClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
            @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
            @NonNull String owner, int cookie, int sensorId, boolean shouldVibrate,
            int statsModality, int statsAction, int statsClient) {
        super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId, statsModality,
                statsAction, statsClient);
            @NonNull BiometricLogger logger, @NonNull BiometricContext biometricContext) {
        super(context, lazyDaemon, token, listener, userId, owner, cookie, sensorId,
                logger, biometricContext);
        mPowerManager = context.getSystemService(PowerManager.class);
        mShouldVibrate = shouldVibrate;
    }
+6 −5
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricOverlayConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -39,6 +38,8 @@ import android.util.Slog;

import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricLogger;

import java.util.ArrayList;
import java.util.List;
@@ -93,13 +94,13 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T>
    public AuthenticationClient(@NonNull Context context, @NonNull Supplier<T> lazyDaemon,
            @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
            int targetUserId, long operationId, boolean restricted, @NonNull String owner,
            int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric,
            int statsModality, int statsClient, @Nullable TaskStackListener taskStackListener,
            int cookie, boolean requireConfirmation, int sensorId,
            @NonNull BiometricLogger biometricLogger, @NonNull BiometricContext biometricContext,
            boolean isStrongBiometric, @Nullable TaskStackListener taskStackListener,
            @NonNull LockoutTracker lockoutTracker, boolean allowBackgroundAuthentication,
            boolean shouldVibrate, boolean isKeyguardBypassEnabled) {
        super(context, lazyDaemon, token, listener, targetUserId, owner, cookie, sensorId,
                shouldVibrate, statsModality, BiometricsProtoEnums.ACTION_AUTHENTICATE,
                statsClient);
                shouldVibrate, biometricLogger, biometricContext);
        mIsStrongBiometric = isStrongBiometric;
        mOperationId = operationId;
        mRequireConfirmation = requireConfirmation;
Loading