Loading services/core/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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: [ Loading services/core/java/com/android/server/biometrics/Android.bp 0 → 100644 +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", } services/core/java/com/android/server/biometrics/biometrics.aconfig 0 → 100644 +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" } services/core/java/com/android/server/biometrics/sensors/face/FaceService.java +62 −12 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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( Loading Loading @@ -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) { Loading Loading @@ -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()) { Loading Loading
services/core/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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: [ Loading
services/core/java/com/android/server/biometrics/Android.bp 0 → 100644 +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", }
services/core/java/com/android/server/biometrics/biometrics.aconfig 0 → 100644 +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" }
services/core/java/com/android/server/biometrics/sensors/face/FaceService.java +62 −12 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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( Loading Loading @@ -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) { Loading Loading @@ -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()) { Loading