Loading Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ filegroup { ":android.frameworks.location.altitude-V2-java-source", ":android.hardware.biometrics.common-V4-java-source", ":android.hardware.biometrics.fingerprint-V5-java-source", ":android.hardware.biometrics.fingerprint.virtualhal-java-source", ":android.hardware.biometrics.face-V4-java-source", ":android.hardware.gnss-V2-java-source", ":android.hardware.graphics.common-V3-java-source", Loading core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java +40 −2 Original line number Diff line number Diff line Loading @@ -23,12 +23,14 @@ import android.annotation.Nullable; import android.content.Context; import android.hardware.biometrics.fingerprint.IFingerprint; import android.hardware.biometrics.fingerprint.SensorProps; import android.hardware.biometrics.fingerprint.virtualhal.IVirtualHal; import android.os.Binder; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; import android.util.Slog; import java.util.ArrayList; import java.util.HashMap; Loading Loading @@ -162,6 +164,43 @@ public class FingerprintSensorConfigurations implements Parcelable { dest.writeMap(mSensorPropsMap); } /** * Remap fqName of VHAL because the `virtual` instance is registered * with IVirtulalHal now (IFingerprint previously) * @param fqName fqName to be translated * @return real fqName */ public static String remapFqName(String fqName) { if (!fqName.contains(IFingerprint.DESCRIPTOR + "/virtual")) { return fqName; //no remap needed for real hardware HAL } else { //new Vhal instance name return fqName.replace("IFingerprint", "virtualhal.IVirtualHal"); } } /** * @param fqName aidl interface instance name * @return aidl interface */ public static IFingerprint getIFingerprint(String fqName) { if (fqName.contains("virtual")) { String fqNameMapped = remapFqName(fqName); Slog.i(TAG, "getIFingerprint fqName is mapped: " + fqName + "->" + fqNameMapped); try { IVirtualHal vhal = IVirtualHal.Stub.asInterface( Binder.allowBlocking(ServiceManager.waitForService(fqNameMapped))); return vhal.getFingerprintHal(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception in vhal.getFingerprintHal() call" + fqNameMapped); } } return IFingerprint.Stub.asInterface( Binder.allowBlocking(ServiceManager.waitForDeclaredService(fqName))); } /** * Returns fingerprint sensor props for the HAL {@param instance}. */ Loading @@ -176,8 +215,7 @@ public class FingerprintSensorConfigurations implements Parcelable { try { final String fqName = IFingerprint.DESCRIPTOR + "/" + instance; final IFingerprint fp = IFingerprint.Stub.asInterface(Binder.allowBlocking( ServiceManager.waitForDeclaredService(fqName))); final IFingerprint fp = getIFingerprint(fqName); if (fp != null) { props = fp.getSensorProps(); } else { Loading services/core/java/com/android/server/biometrics/AuthService.java +2 −2 Original line number Diff line number Diff line Loading @@ -50,7 +50,6 @@ import android.hardware.biometrics.PromptInfo; import android.hardware.biometrics.SensorLocationInternal; import android.hardware.biometrics.SensorPropertiesInternal; import android.hardware.biometrics.face.IFace; import android.hardware.biometrics.fingerprint.IFingerprint; import android.hardware.face.FaceSensorConfigurations; import android.hardware.face.FaceSensorProperties; import android.hardware.face.FaceSensorPropertiesInternal; Loading @@ -74,6 +73,7 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.server.SystemService; import com.android.server.biometrics.sensors.fingerprint.FingerprintService; import com.android.server.companion.virtual.VirtualDeviceManagerInternal; import java.util.ArrayList; Loading Loading @@ -203,7 +203,7 @@ public class AuthService extends SystemService { */ @VisibleForTesting public String[] getFingerprintAidlInstances() { return ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR); return FingerprintService.getDeclaredInstances(); } /** Loading services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +22 −3 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPR import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_USER_CANCELED; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR; import static android.hardware.biometrics.SensorProperties.STRENGTH_STRONG; import static android.hardware.fingerprint.FingerprintSensorConfigurations.getIFingerprint; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -78,6 +79,7 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; import com.android.internal.widget.LockPatternUtils; import com.android.server.SystemService; Loading Loading @@ -1015,7 +1017,7 @@ public class FingerprintService extends SystemService { this(context, BiometricContext.getInstance(context), () -> IBiometricService.Stub.asInterface( ServiceManager.getService(Context.BIOMETRIC_SERVICE)), () -> ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR), () -> getDeclaredInstances(), null /* fingerprintProvider */, null /* fingerprintProviderFunction */); } Loading @@ -1039,8 +1041,7 @@ public class FingerprintService extends SystemService { mFingerprintProvider = fingerprintProvider != null ? fingerprintProvider : (name) -> { final String fqName = IFingerprint.DESCRIPTOR + "/" + name; final IFingerprint fp = IFingerprint.Stub.asInterface( Binder.allowBlocking(ServiceManager.waitForDeclaredService(fqName))); final IFingerprint fp = getIFingerprint(fqName); if (fp != null) { try { return new FingerprintProvider(getContext(), Loading Loading @@ -1129,6 +1130,24 @@ public class FingerprintService extends SystemService { publishBinderService(Context.FINGERPRINT_SERVICE, mServiceWrapper); } /** * Get all fingerprint hal instances declared in manifest * @return instance names */ public static String[] getDeclaredInstances() { String[] a = ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR); Slog.i(TAG, "Before:getDeclaredInstances: IFingerprint instance found, a.length=" + a.length); if (!ArrayUtils.contains(a, "virtual")) { // Now, the virtual hal is registered with IVirtualHal interface and it is also // moved from vendor to system_ext partition without a device manifest. So // if the old vhal is not declared, add here. a = ArrayUtils.appendElement(String.class, a, "virtual"); } Slog.i(TAG, "After:getDeclaredInstances: a.length=" + a.length); return a; } @NonNull private List<Fingerprint> getEnrolledFingerprintsDeprecated(int userId, String opPackageName) { final Pair<Integer, ServiceProvider> provider = mRegistry.getSingleProvider(); Loading services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java +4 −4 Original line number Diff line number Diff line Loading @@ -20,9 +20,9 @@ import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.ITestSessionCallback; import android.hardware.biometrics.fingerprint.AcquiredInfoAndVendorCode; import android.hardware.biometrics.fingerprint.EnrollmentProgressStep; import android.hardware.biometrics.fingerprint.NextEnrollment; import android.hardware.biometrics.fingerprint.virtualhal.AcquiredInfoAndVendorCode; import android.hardware.biometrics.fingerprint.virtualhal.EnrollmentProgressStep; import android.hardware.biometrics.fingerprint.virtualhal.NextEnrollment; import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintEnrollOptions; import android.hardware.fingerprint.FingerprintManager; Loading Loading
Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ filegroup { ":android.frameworks.location.altitude-V2-java-source", ":android.hardware.biometrics.common-V4-java-source", ":android.hardware.biometrics.fingerprint-V5-java-source", ":android.hardware.biometrics.fingerprint.virtualhal-java-source", ":android.hardware.biometrics.face-V4-java-source", ":android.hardware.gnss-V2-java-source", ":android.hardware.graphics.common-V3-java-source", Loading
core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java +40 −2 Original line number Diff line number Diff line Loading @@ -23,12 +23,14 @@ import android.annotation.Nullable; import android.content.Context; import android.hardware.biometrics.fingerprint.IFingerprint; import android.hardware.biometrics.fingerprint.SensorProps; import android.hardware.biometrics.fingerprint.virtualhal.IVirtualHal; import android.os.Binder; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; import android.util.Slog; import java.util.ArrayList; import java.util.HashMap; Loading Loading @@ -162,6 +164,43 @@ public class FingerprintSensorConfigurations implements Parcelable { dest.writeMap(mSensorPropsMap); } /** * Remap fqName of VHAL because the `virtual` instance is registered * with IVirtulalHal now (IFingerprint previously) * @param fqName fqName to be translated * @return real fqName */ public static String remapFqName(String fqName) { if (!fqName.contains(IFingerprint.DESCRIPTOR + "/virtual")) { return fqName; //no remap needed for real hardware HAL } else { //new Vhal instance name return fqName.replace("IFingerprint", "virtualhal.IVirtualHal"); } } /** * @param fqName aidl interface instance name * @return aidl interface */ public static IFingerprint getIFingerprint(String fqName) { if (fqName.contains("virtual")) { String fqNameMapped = remapFqName(fqName); Slog.i(TAG, "getIFingerprint fqName is mapped: " + fqName + "->" + fqNameMapped); try { IVirtualHal vhal = IVirtualHal.Stub.asInterface( Binder.allowBlocking(ServiceManager.waitForService(fqNameMapped))); return vhal.getFingerprintHal(); } catch (RemoteException e) { Slog.e(TAG, "Remote exception in vhal.getFingerprintHal() call" + fqNameMapped); } } return IFingerprint.Stub.asInterface( Binder.allowBlocking(ServiceManager.waitForDeclaredService(fqName))); } /** * Returns fingerprint sensor props for the HAL {@param instance}. */ Loading @@ -176,8 +215,7 @@ public class FingerprintSensorConfigurations implements Parcelable { try { final String fqName = IFingerprint.DESCRIPTOR + "/" + instance; final IFingerprint fp = IFingerprint.Stub.asInterface(Binder.allowBlocking( ServiceManager.waitForDeclaredService(fqName))); final IFingerprint fp = getIFingerprint(fqName); if (fp != null) { props = fp.getSensorProps(); } else { Loading
services/core/java/com/android/server/biometrics/AuthService.java +2 −2 Original line number Diff line number Diff line Loading @@ -50,7 +50,6 @@ import android.hardware.biometrics.PromptInfo; import android.hardware.biometrics.SensorLocationInternal; import android.hardware.biometrics.SensorPropertiesInternal; import android.hardware.biometrics.face.IFace; import android.hardware.biometrics.fingerprint.IFingerprint; import android.hardware.face.FaceSensorConfigurations; import android.hardware.face.FaceSensorProperties; import android.hardware.face.FaceSensorPropertiesInternal; Loading @@ -74,6 +73,7 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.server.SystemService; import com.android.server.biometrics.sensors.fingerprint.FingerprintService; import com.android.server.companion.virtual.VirtualDeviceManagerInternal; import java.util.ArrayList; Loading Loading @@ -203,7 +203,7 @@ public class AuthService extends SystemService { */ @VisibleForTesting public String[] getFingerprintAidlInstances() { return ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR); return FingerprintService.getDeclaredInstances(); } /** Loading
services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +22 −3 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPR import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_USER_CANCELED; import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR; import static android.hardware.biometrics.SensorProperties.STRENGTH_STRONG; import static android.hardware.fingerprint.FingerprintSensorConfigurations.getIFingerprint; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -78,6 +79,7 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; import com.android.internal.widget.LockPatternUtils; import com.android.server.SystemService; Loading Loading @@ -1015,7 +1017,7 @@ public class FingerprintService extends SystemService { this(context, BiometricContext.getInstance(context), () -> IBiometricService.Stub.asInterface( ServiceManager.getService(Context.BIOMETRIC_SERVICE)), () -> ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR), () -> getDeclaredInstances(), null /* fingerprintProvider */, null /* fingerprintProviderFunction */); } Loading @@ -1039,8 +1041,7 @@ public class FingerprintService extends SystemService { mFingerprintProvider = fingerprintProvider != null ? fingerprintProvider : (name) -> { final String fqName = IFingerprint.DESCRIPTOR + "/" + name; final IFingerprint fp = IFingerprint.Stub.asInterface( Binder.allowBlocking(ServiceManager.waitForDeclaredService(fqName))); final IFingerprint fp = getIFingerprint(fqName); if (fp != null) { try { return new FingerprintProvider(getContext(), Loading Loading @@ -1129,6 +1130,24 @@ public class FingerprintService extends SystemService { publishBinderService(Context.FINGERPRINT_SERVICE, mServiceWrapper); } /** * Get all fingerprint hal instances declared in manifest * @return instance names */ public static String[] getDeclaredInstances() { String[] a = ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR); Slog.i(TAG, "Before:getDeclaredInstances: IFingerprint instance found, a.length=" + a.length); if (!ArrayUtils.contains(a, "virtual")) { // Now, the virtual hal is registered with IVirtualHal interface and it is also // moved from vendor to system_ext partition without a device manifest. So // if the old vhal is not declared, add here. a = ArrayUtils.appendElement(String.class, a, "virtual"); } Slog.i(TAG, "After:getDeclaredInstances: a.length=" + a.length); return a; } @NonNull private List<Fingerprint> getEnrolledFingerprintsDeprecated(int userId, String opPackageName) { final Pair<Integer, ServiceProvider> provider = mRegistry.getSingleProvider(); Loading
services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/BiometricTestSessionImpl.java +4 −4 Original line number Diff line number Diff line Loading @@ -20,9 +20,9 @@ import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.ITestSessionCallback; import android.hardware.biometrics.fingerprint.AcquiredInfoAndVendorCode; import android.hardware.biometrics.fingerprint.EnrollmentProgressStep; import android.hardware.biometrics.fingerprint.NextEnrollment; import android.hardware.biometrics.fingerprint.virtualhal.AcquiredInfoAndVendorCode; import android.hardware.biometrics.fingerprint.virtualhal.EnrollmentProgressStep; import android.hardware.biometrics.fingerprint.virtualhal.NextEnrollment; import android.hardware.fingerprint.Fingerprint; import android.hardware.fingerprint.FingerprintEnrollOptions; import android.hardware.fingerprint.FingerprintManager; Loading