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

Commit f2f31c21 authored by Kevin Chyn's avatar Kevin Chyn Committed by Android (Google) Code Review
Browse files

Merge "Update framework together with IBiometricsFace.hal"

parents 4348a4d7 b95f1529
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -286,14 +286,15 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
     * @hide
     */
    @RequiresPermission(MANAGE_BIOMETRIC)
    public void setFeature(int feature, boolean enabled, byte[] token) {
    public boolean setFeature(int feature, boolean enabled, byte[] token) {
        if (mService != null) {
            try {
                mService.setFeature(feature, enabled, token);
                return mService.setFeature(feature, enabled, token);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
        return false;
    }

    /**
+1 −1
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ interface IFaceService {
    // Enumerate all faces
    void enumerate(IBinder token, int userId, IFaceServiceReceiver receiver);

    int setFeature(int feature, boolean enabled, in byte [] token);
    boolean setFeature(int feature, boolean enabled, in byte [] token);

    boolean getFeature(int feature);

+50 −18
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
import android.hardware.biometrics.face.V1_0.IBiometricsFaceClientCallback;
import android.hardware.biometrics.face.V1_0.OptionalBool;
import android.hardware.biometrics.face.V1_0.Status;
import android.hardware.face.Face;
import android.hardware.face.FaceManager;
@@ -54,7 +55,6 @@ import com.android.server.SystemServerInitThreadPool;
import com.android.server.biometrics.AuthenticationClient;
import com.android.server.biometrics.BiometricServiceBase;
import com.android.server.biometrics.BiometricUtils;
import com.android.server.biometrics.ClientMonitor;
import com.android.server.biometrics.EnumerateClient;
import com.android.server.biometrics.Metrics;
import com.android.server.biometrics.RemovalClient;
@@ -385,38 +385,61 @@ public class FaceService extends BiometricServiceBase {
        }

        @Override
        public int setFeature(int feature, boolean enabled, final byte[] token) {
        public boolean setFeature(int feature, boolean enabled, final byte[] token) {
            checkPermission(MANAGE_BIOMETRIC);

            if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) {
                Slog.e(TAG, "No enrolled biometrics while setting feature: " + feature);
                return false;
            }

            final ArrayList<Byte> byteToken = new ArrayList<>();
            for (int i = 0; i < token.length; i++) {
                byteToken.add(token[i]);
            }

            int result;
            // TODO: Support multiple faces
            final int faceId = getFirstTemplateForUser(mCurrentUserId);

            if (mDaemon != null) {
                try {
                result = mDaemon != null ? mDaemon.setFeature(feature, enabled, byteToken)
                        : Status.INTERNAL_ERROR;
                    return mDaemon.setFeature(feature, enabled, byteToken, faceId) == Status.OK;
                } catch (RemoteException e) {
                    Slog.e(getTag(), "Unable to set feature: " + feature + " to enabled:" + enabled,
                            e);
                result = Status.INTERNAL_ERROR;
                }

            return result;
            }
            return false;
        }

        @Override
        public boolean getFeature(int feature) {
            checkPermission(MANAGE_BIOMETRIC);

            boolean result = true;
            // This should ideally return tri-state, but the user isn't shown settings unless
            // they are enrolled so it's fine for now.
            if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) {
                Slog.e(TAG, "No enrolled biometrics while getting feature: " + feature);
                return false;
            }

            // TODO: Support multiple faces
            final int faceId = getFirstTemplateForUser(mCurrentUserId);

            if (mDaemon != null) {
                try {
                result = mDaemon != null ? mDaemon.getFeature(feature) : true;
                    OptionalBool result = mDaemon.getFeature(feature, faceId);
                    if (result.status == Status.OK) {
                        return result.value;
                    } else {
                        // Same tri-state comment applies here.
                        return false;
                    }
                } catch (RemoteException e) {
                    Slog.e(getTag(), "Unable to getRequireAttention", e);
                }
            return result;
            }
            return false;
        }

        @Override
@@ -431,6 +454,15 @@ public class FaceService extends BiometricServiceBase {
                }
            }
        }

        // TODO: Support multiple faces
        private int getFirstTemplateForUser(int user) {
            final List<Face> faces = FaceService.this.getEnrolledTemplates(user);
            if (!faces.isEmpty()) {
                return faces.get(0).getBiometricId();
            }
            return 0;
        }
    }

    /**