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

Commit b3c5257d authored by Jeff Pu's avatar Jeff Pu Committed by Android (Google) Code Review
Browse files

Merge "Face Biometric Virtual HAL" into main

parents 5321c545 fa6c00f7
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -193,6 +193,7 @@ java_library_static {
        "power_optimization_flags_lib",
        "power_optimization_flags_lib",
        "notification_flags_lib",
        "notification_flags_lib",
        "camera_platform_flags_core_java_lib",
        "camera_platform_flags_core_java_lib",
        "biometrics_flags_lib",
    ],
    ],
    javac_shard_size: 50,
    javac_shard_size: 50,
    javacflags: [
    javacflags: [
+12 −0
Original line number Original line Diff line number Diff line
aconfig_declarations {
    name: "biometrics_flags",
    package: "com.android.server.biometrics",
    srcs: [
        "biometrics.aconfig",
    ],
}

java_aconfig_library {
    name: "biometrics_flags_lib",
    aconfig_declarations: "biometrics_flags",
}
+8 −0
Original line number Original line Diff line number Diff line
package: "com.android.server.biometrics"

flag {
  name: "face_vhal_feature"
  namespace: "biometrics_framework"
  description: "This flag controls tunscany virtual HAL feature"
  bug: "294254230"
}
+62 −12
Original line number Original line Diff line number Diff line
@@ -58,6 +58,7 @@ import android.view.Surface;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.SystemService;
import com.android.server.SystemService;
import com.android.server.biometrics.Flags;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.sensors.BiometricStateCallback;
import com.android.server.biometrics.sensors.BiometricStateCallback;
@@ -67,6 +68,8 @@ import com.android.server.biometrics.sensors.LockoutTracker;
import com.android.server.biometrics.sensors.face.aidl.FaceProvider;
import com.android.server.biometrics.sensors.face.aidl.FaceProvider;
import com.android.server.biometrics.sensors.face.hidl.Face10;
import com.android.server.biometrics.sensors.face.hidl.Face10;


import com.google.android.collect.Lists;

import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.ArrayList;
@@ -639,15 +642,24 @@ public class FaceService extends SystemService {
            provider.second.scheduleGetFeature(provider.first, token, userId, feature,
            provider.second.scheduleGetFeature(provider.first, token, userId, feature,
                    new ClientMonitorCallbackConverter(receiver), opPackageName);
                    new ClientMonitorCallbackConverter(receiver), opPackageName);
        }
        }

        @NonNull
        private List<ServiceProvider> getAidlProviders() {
        private List<ServiceProvider> getHidlProviders(
                @NonNull List<FaceSensorPropertiesInternal> hidlSensors) {
            final List<ServiceProvider> providers = new ArrayList<>();
            final List<ServiceProvider> providers = new ArrayList<>();


            final String[] instances = ServiceManager.getDeclaredInstances(IFace.DESCRIPTOR);
            for (FaceSensorPropertiesInternal hidlSensor : hidlSensors) {
            if (instances == null || instances.length == 0) {
                providers.add(
                        Face10.newInstance(getContext(), mBiometricStateCallback,
                                hidlSensor, mLockoutResetDispatcher));
            }

            return providers;
            return providers;
        }
        }


        @NonNull
        private List<ServiceProvider> getAidlProviders(@NonNull List<String> instances) {
            final List<ServiceProvider> providers = new ArrayList<>();

            for (String instance : instances) {
            for (String instance : instances) {
                final String fqName = IFace.DESCRIPTOR + "/" + instance;
                final String fqName = IFace.DESCRIPTOR + "/" + instance;
                final IFace face = IFace.Stub.asInterface(
                final IFace face = IFace.Stub.asInterface(
@@ -676,17 +688,55 @@ public class FaceService extends SystemService {
            super.registerAuthenticators_enforcePermission();
            super.registerAuthenticators_enforcePermission();


            mRegistry.registerAll(() -> {
            mRegistry.registerAll(() -> {
                final List<ServiceProvider> providers = new ArrayList<>();
                List<String> aidlSensors = new ArrayList<>();
                for (FaceSensorPropertiesInternal hidlSensor : hidlSensors) {
                final String[] instances = ServiceManager.getDeclaredInstances(IFace.DESCRIPTOR);
                    providers.add(
                if (instances != null) {
                            Face10.newInstance(getContext(), mBiometricStateCallback,
                    aidlSensors.addAll(Lists.newArrayList(instances));
                                    hidlSensor, mLockoutResetDispatcher));
                }
                }
                providers.addAll(getAidlProviders());

                final Pair<List<FaceSensorPropertiesInternal>, List<String>>
                        filteredInstances = filterAvailableHalInstances(hidlSensors, aidlSensors);

                final List<ServiceProvider> providers = new ArrayList<>();
                providers.addAll(getHidlProviders(filteredInstances.first));
                providers.addAll(getAidlProviders(filteredInstances.second));
                return providers;
                return providers;
            });
            });
        }
        }


        private Pair<List<FaceSensorPropertiesInternal>, List<String>>
                filterAvailableHalInstances(
                @NonNull List<FaceSensorPropertiesInternal> hidlInstances,
                @NonNull List<String> aidlInstances) {
            if ((hidlInstances.size() + aidlInstances.size()) <= 1) {
                return new Pair(hidlInstances, aidlInstances);
            }

            if (Flags.faceVhalFeature()) {
                Slog.i(TAG, "Face VHAL feature is on");
            } else {
                Slog.i(TAG, "Face VHAL feature is off");
            }

            final int virtualAt = aidlInstances.indexOf("virtual");
            if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) {
                if (virtualAt != -1) {
                    //only virtual instance should be returned
                    return new Pair(new ArrayList<>(), List.of(aidlInstances.get(virtualAt)));
                } else {
                    Slog.e(TAG, "Could not find virtual interface while it is enabled");
                    return new Pair(hidlInstances, aidlInstances);
                }
            } else {
                //remove virtual instance
                aidlInstances = new ArrayList<>(aidlInstances);
                if (virtualAt != -1) {
                    aidlInstances.remove(virtualAt);
                }
                return new Pair(hidlInstances, aidlInstances);
            }
        }

        @Override
        @Override
        public void addAuthenticatorsRegisteredCallback(
        public void addAuthenticatorsRegisteredCallback(
                IFaceAuthenticatorsRegisteredCallback callback) {
                IFaceAuthenticatorsRegisteredCallback callback) {
@@ -749,7 +799,7 @@ public class FaceService extends SystemService {


    void syncEnrollmentsNow() {
    void syncEnrollmentsNow() {
        Utils.checkPermissionOrShell(getContext(), MANAGE_FACE);
        Utils.checkPermissionOrShell(getContext(), MANAGE_FACE);
        if (Utils.isVirtualEnabled(getContext())) {
        if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) {
            Slog.i(TAG, "Sync virtual enrollments");
            Slog.i(TAG, "Sync virtual enrollments");
            final int userId = ActivityManager.getCurrentUser();
            final int userId = ActivityManager.getCurrentUser();
            for (ServiceProvider provider : mRegistry.getProviders()) {
            for (ServiceProvider provider : mRegistry.getProviders()) {