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

Commit 06b93a79 authored by Jeff Pu's avatar Jeff Pu
Browse files

Retrieve IFIngerprint from IVirtual interface over

Fingerprint Virtual HAL

Bug: 326227403
Test: atest CtsBiometricsTestCases -c
Flag: TEST_ONLY
Change-Id: I85f697a4e217e27f6371a7d80c9d42c0f7e1ed57
parent 88f1c7e6
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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",
+40 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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}.
     */
@@ -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 {
+2 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -203,7 +203,7 @@ public class AuthService extends SystemService {
         */
        @VisibleForTesting
        public String[] getFingerprintAidlInstances() {
            return ServiceManager.getDeclaredInstances(IFingerprint.DESCRIPTOR);
            return FingerprintService.getDeclaredInstances();
        }

        /**
+22 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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 */);
    }
@@ -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(),
@@ -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();
+4 −4
Original line number Diff line number Diff line
@@ -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