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

Commit 1a3f3600 authored by Wenhui Yang's avatar Wenhui Yang
Browse files

FRR follow-up: initialize collector when receiving ACTION_USER_UNLOCKED

Bug: 295582896
Test: atest AuthenticationStatsCollectorTest
Test: atest AuthenticationStatsBroadcastReceiverTest
Change-Id: Ie51440a120597a76c0c819deafe88882a58b5189
parent 59db8423
Loading
Loading
Loading
Loading
+70 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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 com.android.server.biometrics;

import android.annotation.NonNull;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.biometrics.BiometricAuthenticator;
import android.os.UserHandle;
import android.util.Slog;

import com.android.server.biometrics.sensors.BiometricNotificationImpl;

import java.util.function.Consumer;

/**
 * Receives broadcast to initialize AuthenticationStatsCollector.
 */
public class AuthenticationStatsBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = "AuthenticationStatsBroadcastReceiver";

    @NonNull
    private final Consumer<AuthenticationStatsCollector> mCollectorConsumer;
    @BiometricAuthenticator.Modality
    private final int mModality;

    public AuthenticationStatsBroadcastReceiver(@NonNull Context context,
            @BiometricAuthenticator.Modality int modality,
            @NonNull Consumer<AuthenticationStatsCollector> callback) {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_USER_UNLOCKED);
        context.registerReceiver(this, intentFilter);

        mCollectorConsumer = callback;
        mModality = modality;
    }

    @Override
    public void onReceive(@NonNull Context context, @NonNull Intent intent) {
        final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);

        if (userId != UserHandle.USER_NULL
                && Intent.ACTION_USER_UNLOCKED.equals(intent.getAction())) {
            Slog.d(TAG, "Received: " + intent.getAction());

            mCollectorConsumer.accept(
                    new AuthenticationStatsCollector(context, mModality,
                            new BiometricNotificationImpl()));

            context.unregisterReceiver(this);
        }
    }
}
+7 −4
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.biometrics.log;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.SensorManager;
import android.hardware.biometrics.BiometricConstants;
@@ -42,7 +43,7 @@ public class BiometricLogger {
    private final int mStatsAction;
    private final int mStatsClient;
    private final BiometricFrameworkStatsLogger mSink;
    @NonNull private final AuthenticationStatsCollector mAuthenticationStatsCollector;
    @Nullable private final AuthenticationStatsCollector mAuthenticationStatsCollector;
    @NonNull private final ALSProbe mALSProbe;

    private long mFirstAcquireTimeMs;
@@ -68,7 +69,7 @@ public class BiometricLogger {
     */
    public BiometricLogger(
            @NonNull Context context, int statsModality, int statsAction, int statsClient,
            AuthenticationStatsCollector authenticationStatsCollector) {
            @Nullable AuthenticationStatsCollector authenticationStatsCollector) {
        this(statsModality, statsAction, statsClient,
                BiometricFrameworkStatsLogger.getInstance(),
                authenticationStatsCollector,
@@ -79,7 +80,7 @@ public class BiometricLogger {
    BiometricLogger(
            int statsModality, int statsAction, int statsClient,
            BiometricFrameworkStatsLogger logSink,
            @NonNull AuthenticationStatsCollector statsCollector,
            @Nullable AuthenticationStatsCollector statsCollector,
            SensorManager sensorManager) {
        mStatsModality = statsModality;
        mStatsAction = statsAction;
@@ -206,7 +207,9 @@ public class BiometricLogger {
            return;
        }

        if (mAuthenticationStatsCollector != null) {
            mAuthenticationStatsCollector.authenticate(targetUserId, authenticated);
        }

        int authState = FrameworkStatsLog.BIOMETRIC_AUTHENTICATED__STATE__UNKNOWN;
        if (!authenticated) {
+11 −5
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import android.util.proto.ProtoOutputStream;
import android.view.Surface;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.AuthenticationStatsBroadcastReceiver;
import com.android.server.biometrics.AuthenticationStatsCollector;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.log.BiometricContext;
@@ -56,7 +57,6 @@ import com.android.server.biometrics.log.BiometricLogger;
import com.android.server.biometrics.sensors.AuthSessionCoordinator;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricNotificationImpl;
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.BiometricStateCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
@@ -114,8 +114,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
    private final BiometricContext mBiometricContext;
    @NonNull
    private final AuthSessionCoordinator mAuthSessionCoordinator;
    @NonNull
    private final AuthenticationStatsCollector mAuthenticationStatsCollector;
    @Nullable
    private AuthenticationStatsCollector mAuthenticationStatsCollector;
    @Nullable
    private IFace mDaemon;

@@ -177,8 +177,14 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider {
        mAuthSessionCoordinator = mBiometricContext.getAuthSessionCoordinator();
        mDaemon = daemon;

        mAuthenticationStatsCollector = new AuthenticationStatsCollector(mContext,
                BiometricsProtoEnums.MODALITY_FACE, new BiometricNotificationImpl());
        AuthenticationStatsBroadcastReceiver mBroadcastReceiver =
                new AuthenticationStatsBroadcastReceiver(
                        mContext,
                        BiometricsProtoEnums.MODALITY_FACE,
                        (AuthenticationStatsCollector collector) -> {
                            Slog.d(getTag(), "Initializing AuthenticationStatsCollector");
                            mAuthenticationStatsCollector = collector;
                        });

        for (SensorProps prop : props) {
            final int sensorId = prop.commonProps.sensorId;
+10 −4
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import android.view.Surface;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.biometrics.AuthenticationStatsBroadcastReceiver;
import com.android.server.biometrics.AuthenticationStatsCollector;
import com.android.server.biometrics.SensorServiceStateProto;
import com.android.server.biometrics.SensorStateProto;
@@ -62,7 +63,6 @@ import com.android.server.biometrics.log.BiometricLogger;
import com.android.server.biometrics.sensors.AcquisitionClient;
import com.android.server.biometrics.sensors.AuthenticationConsumer;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricNotificationImpl;
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.BiometricStateCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
@@ -125,7 +125,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
    @Nullable private IBiometricsFace mDaemon;
    @NonNull private final HalResultController mHalResultController;
    @NonNull private final BiometricContext mBiometricContext;
    @NonNull private final AuthenticationStatsCollector mAuthenticationStatsCollector;
    @Nullable private AuthenticationStatsCollector mAuthenticationStatsCollector;
    // for requests that do not use biometric prompt
    @NonNull private final AtomicLong mRequestCounter = new AtomicLong(0);
    private int mCurrentUserId = UserHandle.USER_NULL;
@@ -366,8 +366,14 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
            mCurrentUserId = UserHandle.USER_NULL;
        });

        mAuthenticationStatsCollector = new AuthenticationStatsCollector(mContext,
                BiometricsProtoEnums.MODALITY_FACE, new BiometricNotificationImpl());
        AuthenticationStatsBroadcastReceiver mBroadcastReceiver =
                new AuthenticationStatsBroadcastReceiver(
                        mContext,
                        BiometricsProtoEnums.MODALITY_FACE,
                        (AuthenticationStatsCollector collector) -> {
                            Slog.d(TAG, "Initializing AuthenticationStatsCollector");
                            mAuthenticationStatsCollector = collector;
                        });

        try {
            ActivityManager.getService().registerUserSwitchObserver(mUserSwitchObserver, TAG);
+10 −4
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ import android.util.Slog;
import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.AuthenticationStatsBroadcastReceiver;
import com.android.server.biometrics.AuthenticationStatsCollector;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.log.BiometricContext;
@@ -64,7 +65,6 @@ import com.android.server.biometrics.log.BiometricLogger;
import com.android.server.biometrics.sensors.AuthSessionCoordinator;
import com.android.server.biometrics.sensors.AuthenticationClient;
import com.android.server.biometrics.sensors.BaseClientMonitor;
import com.android.server.biometrics.sensors.BiometricNotificationImpl;
import com.android.server.biometrics.sensors.BiometricScheduler;
import com.android.server.biometrics.sensors.BiometricStateCallback;
import com.android.server.biometrics.sensors.ClientMonitorCallback;
@@ -124,7 +124,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
    @Nullable private IUdfpsOverlayController mUdfpsOverlayController;
    @Nullable private ISidefpsController mSidefpsController;
    private AuthSessionCoordinator mAuthSessionCoordinator;
    @NonNull private final AuthenticationStatsCollector mAuthenticationStatsCollector;
    @Nullable private AuthenticationStatsCollector mAuthenticationStatsCollector;

    private final class BiometricTaskStackListener extends TaskStackListener {
        @Override
@@ -184,8 +184,14 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi
        mAuthSessionCoordinator = mBiometricContext.getAuthSessionCoordinator();
        mDaemon = daemon;

        mAuthenticationStatsCollector = new AuthenticationStatsCollector(mContext,
                BiometricsProtoEnums.MODALITY_FINGERPRINT, new BiometricNotificationImpl());
        AuthenticationStatsBroadcastReceiver mBroadcastReceiver =
                new AuthenticationStatsBroadcastReceiver(
                        mContext,
                        BiometricsProtoEnums.MODALITY_FINGERPRINT,
                        (AuthenticationStatsCollector collector) -> {
                            Slog.d(getTag(), "Initializing AuthenticationStatsCollector");
                            mAuthenticationStatsCollector = collector;
                        });

        final List<SensorLocationInternal> workaroundLocations = getWorkaroundSensorProps(context);

Loading