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

Commit 26f1c138 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Read and cache features when user switches"

parents 9ed149dd 1cae475b
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -25,12 +25,14 @@ import android.app.UserSwitchObserver;
import android.content.Context;
import android.content.pm.UserInfo;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricFaceConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
import android.hardware.biometrics.face.V1_0.IBiometricsFaceClientCallback;
import android.hardware.face.Face;
import android.hardware.face.FaceSensorProperties;
import android.hardware.face.IFaceServiceReceiver;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
@@ -109,6 +111,9 @@ class Face10 implements IHwBinder.DeathRecipient {
        @Override
        public void onUserSwitching(int newUserId) {
            scheduleInternalCleanup(newUserId);
            scheduleGetFeature(new Binder(), newUserId,
                    BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION,
                    null, mContext.getOpPackageName());
        }
    };

@@ -360,6 +365,9 @@ class Face10 implements IHwBinder.DeathRecipient {
        if (halId != 0) {
            scheduleLoadAuthenticatorIds();
            scheduleInternalCleanup(ActivityManager.getCurrentUser());
            scheduleGetFeature(new Binder(), ActivityManager.getCurrentUser(),
                    BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION,
                    null, mContext.getOpPackageName());
        } else {
            Slog.e(TAG, "Unable to set callback");
            mDaemon = null;
@@ -450,7 +458,7 @@ class Face10 implements IHwBinder.DeathRecipient {
    }

    void scheduleGetFeature(@NonNull IBinder token, int userId, int feature,
            @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName) {
            @Nullable ClientMonitorCallbackConverter listener, @NonNull String opPackageName) {
        mHandler.post(() -> {
            final List<Face> faces = getEnrolledFaces(userId);
            if (faces.isEmpty()) {
@@ -461,10 +469,22 @@ class Face10 implements IHwBinder.DeathRecipient {
            scheduleUpdateActiveUserWithoutHandler(userId);

            final int faceId = faces.get(0).getBiometricId();
            final FaceGetFeatureClient client = new FaceGetFeatureClient(mContext,
                    mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId,
                    opPackageName, mSensorId, feature, faceId);
            mScheduler.scheduleClientMonitor(client);
            final FaceGetFeatureClient client = new FaceGetFeatureClient(mContext, mLazyDaemon,
                    token, listener, userId, opPackageName, mSensorId, feature, faceId);
            mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
                @Override
                public void onClientFinished(
                        @NonNull ClientMonitor<?> clientMonitor, boolean success) {
                    if (success && feature == BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION) {
                        final int settingsValue = client.getValue() ? 1 : 0;
                        Slog.d(TAG, "Updating attention value for user: " + userId
                                + " to value: " + settingsValue);
                        Settings.Secure.putIntForUser(mContext.getContentResolver(),
                                Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED,
                                settingsValue, userId);
                    }
                }
            });
        });
    }

+14 −3
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.biometrics.sensors.face;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
@@ -39,9 +40,10 @@ public class FaceGetFeatureClient extends ClientMonitor<IBiometricsFace> {

    private final int mFeature;
    private final int mFaceId;
    private boolean mValue;

    FaceGetFeatureClient(@NonNull Context context, @NonNull LazyDaemon<IBiometricsFace> lazyDaemon,
            @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId,
            @NonNull IBinder token, @Nullable ClientMonitorCallbackConverter listener, int userId,
            @NonNull String owner, int sensorId, int feature, int faceId) {
        super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
                BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN,
@@ -54,7 +56,9 @@ public class FaceGetFeatureClient extends ClientMonitor<IBiometricsFace> {
    @Override
    public void unableToStart() {
        try {
            if (getListener() != null) {
                getListener().onFeatureGet(false /* success */, mFeature, false /* value */);
            }
        } catch (RemoteException e) {
            Slog.e(TAG, "Unable to send error", e);
        }
@@ -70,11 +74,18 @@ public class FaceGetFeatureClient extends ClientMonitor<IBiometricsFace> {
    protected void startHalOperation() {
        try {
            final OptionalBool result = getFreshDaemon().getFeature(mFeature, mFaceId);
            getListener().onFeatureGet(result.status == Status.OK, mFeature, result.value);
            mValue = result.value;
            if (getListener() != null) {
                getListener().onFeatureGet(result.status == Status.OK, mFeature, mValue);
            }
            mCallback.onClientFinished(this, true /* success */);
        } catch (RemoteException e) {
            Slog.e(TAG, "Unable to getFeature", e);
            mCallback.onClientFinished(this, false /* success */);
        }
    }

    boolean getValue() {
        return mValue;
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -25,9 +25,9 @@ import android.hardware.biometrics.BiometricsProtoEnums;
import android.hardware.biometrics.IBiometricSensorReceiver;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.face.Face;
import android.hardware.face.FaceSensorProperties;
import android.hardware.face.IFaceService;
import android.hardware.face.IFaceServiceReceiver;
import android.hardware.face.FaceSensorProperties;
import android.os.Binder;
import android.os.IBinder;
import android.os.NativeHandle;
@@ -303,7 +303,8 @@ public class FaceService extends SystemService {
        public void getFeature(final IBinder token, int userId, int feature,
                IFaceServiceReceiver receiver, final String opPackageName) {
            Utils.checkPermission(getContext(), MANAGE_BIOMETRIC);
            mFace10.scheduleGetFeature(token, userId, feature, receiver, opPackageName);
            mFace10.scheduleGetFeature(token, userId, feature,
                    new ClientMonitorCallbackConverter(receiver), opPackageName);
        }

        @Override // Binder call