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

Commit fa6c00f7 authored by Jeff Pu's avatar Jeff Pu
Browse files

Face Biometric Virtual HAL

Bug: 294254230
Test: Manual
Change-Id: I4f90f7c9f6806e7654f9cdeb258e4c14f5ffebde
parent 8c98666d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -194,6 +194,7 @@ java_library_static {
        "notification_flags_lib",
        "pm_flags_lib",
        "camera_platform_flags_core_java_lib",
        "biometrics_flags_lib",
    ],
    javac_shard_size: 50,
    javacflags: [
+12 −0
Original line number 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 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 Diff line number Diff line
@@ -58,6 +58,7 @@ import android.view.Surface;
import com.android.internal.util.DumpUtils;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.SystemService;
import com.android.server.biometrics.Flags;
import com.android.server.biometrics.Utils;
import com.android.server.biometrics.log.BiometricContext;
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.hidl.Face10;

import com.google.android.collect.Lists;

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

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

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

            return providers;
        }

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

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

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

        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
        public void addAuthenticatorsRegisteredCallback(
                IFaceAuthenticatorsRegisteredCallback callback) {
@@ -749,7 +799,7 @@ public class FaceService extends SystemService {

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