Loading core/java/android/provider/Settings.java +17 −1 Original line number Diff line number Diff line Loading @@ -10980,13 +10980,29 @@ public final class Settings { "biometric_debug_enabled"; /** * Whether or not virtual sensors are enabled. * Whether or not both fingerprint and face virtual sensors are enabled. * @hide */ @TestApi @Readable public static final String BIOMETRIC_VIRTUAL_ENABLED = "biometric_virtual_enabled"; /** * Whether or not fingerprint virtual sensors are enabled. * @hide */ @FlaggedApi("com.android.server.biometrics.face_vhal_feature") public static final String BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED = "biometric_fingerprint_virtual_enabled"; /** * Whether or not face virtual sensors are enabled. * @hide */ @FlaggedApi("com.android.server.biometrics.face_vhal_feature") public static final String BIOMETRIC_FACE_VIRTUAL_ENABLED = "biometric_face_virtual_enabled"; /** * Whether or not biometric is allowed on Keyguard. * @hide Loading packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -840,6 +840,8 @@ public class SettingsBackupTest { Settings.Secure.BIOMETRIC_APP_ENABLED, Settings.Secure.BIOMETRIC_KEYGUARD_ENABLED, Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, Settings.Secure.BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED, Settings.Secure.BIOMETRIC_FACE_VIRTUAL_ENABLED, Settings.Secure.BLUETOOTH_ADDR_VALID, Settings.Secure.BLUETOOTH_ADDRESS, Settings.Secure.BLUETOOTH_NAME, Loading services/core/java/com/android/server/biometrics/Utils.java +16 −4 Original line number Diff line number Diff line Loading @@ -89,11 +89,23 @@ public class Utils { return true; } /** If virtualized biometrics are supported (requires debug build). */ public static boolean isVirtualEnabled(@NonNull Context context) { /** If virtualized fingerprint sensor is supported. */ public static boolean isFingerprintVirtualEnabled(@NonNull Context context) { return Build.isDebuggable() && Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1; && (Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1 || Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1); } /** If virtualized face sensor is supported. */ public static boolean isFaceVirtualEnabled(@NonNull Context context) { return Build.isDebuggable() && (Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_FACE_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1 || Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1); } /** Loading services/core/java/com/android/server/biometrics/sensors/face/FaceService.java +3 −3 Original line number Diff line number Diff line Loading @@ -748,7 +748,7 @@ public class FaceService extends SystemService { final String virtualInstance = "virtual"; final boolean isVirtualHalPresent = faceSensorConfigurations.doesInstanceExist(virtualInstance); if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) { if (Flags.faceVhalFeature() && Utils.isFaceVirtualEnabled(getContext())) { if (isVirtualHalPresent) { return new Pair<>(virtualInstance, faceSensorConfigurations.getSensorPropForInstance(virtualInstance)); Loading Loading @@ -786,7 +786,7 @@ public class FaceService extends SystemService { } final int virtualAt = aidlInstances.indexOf("virtual"); if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) { if (Flags.faceVhalFeature() && Utils.isFaceVirtualEnabled(getContext())) { if (virtualAt != -1) { //only virtual instance should be returned Slog.i(TAG, "virtual hal is used"); Loading Loading @@ -928,7 +928,7 @@ public class FaceService extends SystemService { void syncEnrollmentsNow() { Utils.checkPermissionOrShell(getContext(), MANAGE_FACE); if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) { if (Flags.faceVhalFeature() && Utils.isFaceVirtualEnabled(getContext())) { Slog.i(TAG, "Sync virtual enrollments"); final int userId = ActivityManager.getCurrentUser(); for (ServiceProvider provider : mRegistry.getProviders()) { Loading services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +4 −4 Original line number Diff line number Diff line Loading @@ -1136,7 +1136,7 @@ public class FingerprintService extends SystemService { final String virtualInstance = "virtual"; final boolean isVirtualHalPresent = fingerprintSensorConfigurations.doesInstanceExist(virtualInstance); if (Utils.isVirtualEnabled(getContext())) { if (Utils.isFingerprintVirtualEnabled(getContext())) { if (isVirtualHalPresent) { return new Pair<>(virtualInstance, fingerprintSensorConfigurations.getSensorPropForInstance(virtualInstance)); Loading Loading @@ -1169,7 +1169,7 @@ public class FingerprintService extends SystemService { } final int virtualAt = aidlInstances.indexOf("virtual"); if (Utils.isVirtualEnabled(getContext())) { if (Utils.isFingerprintVirtualEnabled(getContext())) { if (virtualAt != -1) { //only virtual instance should be returned Slog.i(TAG, "virtual hal is used"); Loading Loading @@ -1295,7 +1295,7 @@ public class FingerprintService extends SystemService { void syncEnrollmentsNow() { Utils.checkPermissionOrShell(getContext(), MANAGE_FINGERPRINT); if (Utils.isVirtualEnabled(getContext())) { if (Utils.isFingerprintVirtualEnabled(getContext())) { Slog.i(TAG, "Sync virtual enrollments"); final int userId = ActivityManager.getCurrentUser(); final CountDownLatch latch = new CountDownLatch(mRegistry.getProviders().size()); Loading Loading @@ -1324,7 +1324,7 @@ public class FingerprintService extends SystemService { } void simulateVhalFingerDown() { if (Utils.isVirtualEnabled(getContext())) { if (Utils.isFingerprintVirtualEnabled(getContext())) { Slog.i(TAG, "Simulate virtual HAL finger down event"); final Pair<Integer, ServiceProvider> provider = mRegistry.getSingleProvider(); if (provider != null) { Loading Loading
core/java/android/provider/Settings.java +17 −1 Original line number Diff line number Diff line Loading @@ -10980,13 +10980,29 @@ public final class Settings { "biometric_debug_enabled"; /** * Whether or not virtual sensors are enabled. * Whether or not both fingerprint and face virtual sensors are enabled. * @hide */ @TestApi @Readable public static final String BIOMETRIC_VIRTUAL_ENABLED = "biometric_virtual_enabled"; /** * Whether or not fingerprint virtual sensors are enabled. * @hide */ @FlaggedApi("com.android.server.biometrics.face_vhal_feature") public static final String BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED = "biometric_fingerprint_virtual_enabled"; /** * Whether or not face virtual sensors are enabled. * @hide */ @FlaggedApi("com.android.server.biometrics.face_vhal_feature") public static final String BIOMETRIC_FACE_VIRTUAL_ENABLED = "biometric_face_virtual_enabled"; /** * Whether or not biometric is allowed on Keyguard. * @hide Loading
packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -840,6 +840,8 @@ public class SettingsBackupTest { Settings.Secure.BIOMETRIC_APP_ENABLED, Settings.Secure.BIOMETRIC_KEYGUARD_ENABLED, Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, Settings.Secure.BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED, Settings.Secure.BIOMETRIC_FACE_VIRTUAL_ENABLED, Settings.Secure.BLUETOOTH_ADDR_VALID, Settings.Secure.BLUETOOTH_ADDRESS, Settings.Secure.BLUETOOTH_NAME, Loading
services/core/java/com/android/server/biometrics/Utils.java +16 −4 Original line number Diff line number Diff line Loading @@ -89,11 +89,23 @@ public class Utils { return true; } /** If virtualized biometrics are supported (requires debug build). */ public static boolean isVirtualEnabled(@NonNull Context context) { /** If virtualized fingerprint sensor is supported. */ public static boolean isFingerprintVirtualEnabled(@NonNull Context context) { return Build.isDebuggable() && Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1; && (Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_FINGERPRINT_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1 || Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1); } /** If virtualized face sensor is supported. */ public static boolean isFaceVirtualEnabled(@NonNull Context context) { return Build.isDebuggable() && (Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_FACE_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1 || Settings.Secure.getIntForUser(context.getContentResolver(), Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1); } /** Loading
services/core/java/com/android/server/biometrics/sensors/face/FaceService.java +3 −3 Original line number Diff line number Diff line Loading @@ -748,7 +748,7 @@ public class FaceService extends SystemService { final String virtualInstance = "virtual"; final boolean isVirtualHalPresent = faceSensorConfigurations.doesInstanceExist(virtualInstance); if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) { if (Flags.faceVhalFeature() && Utils.isFaceVirtualEnabled(getContext())) { if (isVirtualHalPresent) { return new Pair<>(virtualInstance, faceSensorConfigurations.getSensorPropForInstance(virtualInstance)); Loading Loading @@ -786,7 +786,7 @@ public class FaceService extends SystemService { } final int virtualAt = aidlInstances.indexOf("virtual"); if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) { if (Flags.faceVhalFeature() && Utils.isFaceVirtualEnabled(getContext())) { if (virtualAt != -1) { //only virtual instance should be returned Slog.i(TAG, "virtual hal is used"); Loading Loading @@ -928,7 +928,7 @@ public class FaceService extends SystemService { void syncEnrollmentsNow() { Utils.checkPermissionOrShell(getContext(), MANAGE_FACE); if (Flags.faceVhalFeature() && Utils.isVirtualEnabled(getContext())) { if (Flags.faceVhalFeature() && Utils.isFaceVirtualEnabled(getContext())) { Slog.i(TAG, "Sync virtual enrollments"); final int userId = ActivityManager.getCurrentUser(); for (ServiceProvider provider : mRegistry.getProviders()) { Loading
services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +4 −4 Original line number Diff line number Diff line Loading @@ -1136,7 +1136,7 @@ public class FingerprintService extends SystemService { final String virtualInstance = "virtual"; final boolean isVirtualHalPresent = fingerprintSensorConfigurations.doesInstanceExist(virtualInstance); if (Utils.isVirtualEnabled(getContext())) { if (Utils.isFingerprintVirtualEnabled(getContext())) { if (isVirtualHalPresent) { return new Pair<>(virtualInstance, fingerprintSensorConfigurations.getSensorPropForInstance(virtualInstance)); Loading Loading @@ -1169,7 +1169,7 @@ public class FingerprintService extends SystemService { } final int virtualAt = aidlInstances.indexOf("virtual"); if (Utils.isVirtualEnabled(getContext())) { if (Utils.isFingerprintVirtualEnabled(getContext())) { if (virtualAt != -1) { //only virtual instance should be returned Slog.i(TAG, "virtual hal is used"); Loading Loading @@ -1295,7 +1295,7 @@ public class FingerprintService extends SystemService { void syncEnrollmentsNow() { Utils.checkPermissionOrShell(getContext(), MANAGE_FINGERPRINT); if (Utils.isVirtualEnabled(getContext())) { if (Utils.isFingerprintVirtualEnabled(getContext())) { Slog.i(TAG, "Sync virtual enrollments"); final int userId = ActivityManager.getCurrentUser(); final CountDownLatch latch = new CountDownLatch(mRegistry.getProviders().size()); Loading Loading @@ -1324,7 +1324,7 @@ public class FingerprintService extends SystemService { } void simulateVhalFingerDown() { if (Utils.isVirtualEnabled(getContext())) { if (Utils.isFingerprintVirtualEnabled(getContext())) { Slog.i(TAG, "Simulate virtual HAL finger down event"); final Pair<Integer, ServiceProvider> provider = mRegistry.getSingleProvider(); if (provider != null) { Loading