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

Commit ed9bd910 authored by Diya Bera's avatar Diya Bera
Browse files

Call getSensorProps only after filtering

Test: atest AuthServiceTest FaceSensorConfigurationsTest
FingerprintSensorConfigurationsTest FaceServiceTest
FingerprintServiceTest
Fixes: 327303552

Change-Id: I75cdf85997f3a7b5a867f83bacfab0eb15c56993
parent 1406600d
Loading
Loading
Loading
Loading
+41 −33
Original line number Original line Diff line number Diff line
@@ -22,11 +22,12 @@ import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.SensorProps;
import android.hardware.biometrics.face.SensorProps;
import android.os.Binder;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;
import android.util.Log;
import android.util.Pair;
import android.util.Slog;
import android.util.Slog;


import androidx.annotation.NonNull;
import androidx.annotation.NonNull;
@@ -36,7 +37,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.Optional;
import java.util.Optional;
import java.util.function.Function;


/**
/**
 * Provides the sensor props for face sensor, if available.
 * Provides the sensor props for face sensor, if available.
@@ -74,22 +74,10 @@ public class FaceSensorConfigurations implements Parcelable {
    /**
    /**
     * Process AIDL instances to extract sensor props and add it to the sensor map.
     * Process AIDL instances to extract sensor props and add it to the sensor map.
     * @param aidlInstances available face AIDL instances
     * @param aidlInstances available face AIDL instances
     * @param getIFace function that provides the daemon for the specific instance
     */
     */
    public void addAidlConfigs(@NonNull String[] aidlInstances,
    public void addAidlConfigs(@NonNull String[] aidlInstances) {
            @NonNull Function<String, IFace> getIFace) {
        for (String aidlInstance : aidlInstances) {
        for (String aidlInstance : aidlInstances) {
            final String fqName = IFace.DESCRIPTOR + "/" + aidlInstance;
            mSensorPropsMap.put(aidlInstance, null);
            IFace face = getIFace.apply(fqName);
            try {
                if (face != null) {
                    mSensorPropsMap.put(aidlInstance, face.getSensorProps());
                } else {
                    Slog.e(TAG, "Unable to get declared service: " + fqName);
                }
            } catch (RemoteException e) {
                Log.d(TAG, "Unable to get sensor properties!");
            }
        }
        }
    }
    }


@@ -131,38 +119,31 @@ public class FaceSensorConfigurations implements Parcelable {
    }
    }


    /**
    /**
     * Return sensor props for the given instance. If instance is not available,
     * Checks if {@param instance} exists.
     * then null is returned.
     */
     */
    @Nullable
    @Nullable
    public Pair<String, SensorProps[]> getSensorPairForInstance(String instance) {
    public boolean doesInstanceExist(String instance) {
        if (mSensorPropsMap.containsKey(instance)) {
        return mSensorPropsMap.containsKey(instance);
            return new Pair<>(instance, mSensorPropsMap.get(instance));
        }

        return null;
    }
    }


    /**
    /**
     * Return the first pair of instance and sensor props, which does not correspond to the given
     * Return the first HAL instance, which does not correspond to the given {@param instance}.
     * If instance is not available, then null is returned.
     * If another instance is not available, then null is returned.
     */
     */
    @Nullable
    @Nullable
    public Pair<String, SensorProps[]> getSensorPairNotForInstance(String instance) {
    public String getSensorNameNotForInstance(String instance) {
        Optional<String> notAVirtualInstance = mSensorPropsMap.keySet().stream().filter(
        Optional<String> notAVirtualInstance = mSensorPropsMap.keySet().stream().filter(
                (instanceName) -> !instanceName.equals(instance)).findFirst();
                (instanceName) -> !instanceName.equals(instance)).findFirst();
        return notAVirtualInstance.map(this::getSensorPairForInstance).orElseGet(
        return notAVirtualInstance.orElse(null);
                this::getSensorPair);
    }
    }


    /**
    /**
     * Returns the first pair of instance and sensor props that has been added to the map.
     * Returns the first instance that has been added to the map.
     */
     */
    @Nullable
    @Nullable
    public Pair<String, SensorProps[]> getSensorPair() {
    public String getSensorInstance() {
        Optional<String> optionalInstance = mSensorPropsMap.keySet().stream().findFirst();
        Optional<String> optionalInstance = mSensorPropsMap.keySet().stream().findFirst();
        return optionalInstance.map(this::getSensorPairForInstance).orElse(null);
        return optionalInstance.orElse(null);

    }
    }


    public boolean getResetLockoutRequiresChallenge() {
    public boolean getResetLockoutRequiresChallenge() {
@@ -179,4 +160,31 @@ public class FaceSensorConfigurations implements Parcelable {
        dest.writeByte((byte) (mResetLockoutRequiresChallenge ? 1 : 0));
        dest.writeByte((byte) (mResetLockoutRequiresChallenge ? 1 : 0));
        dest.writeMap(mSensorPropsMap);
        dest.writeMap(mSensorPropsMap);
    }
    }

    /**
     * Returns face sensor props for the HAL {@param instance}.
     */
    @Nullable
    public SensorProps[] getSensorPropForInstance(String instance) {
        SensorProps[] props = mSensorPropsMap.get(instance);

        //Props should not be null for HIDL configs
        if (props != null) {
            return props;
        }

        final String fqName = IFace.DESCRIPTOR + "/" + instance;
        IFace face = IFace.Stub.asInterface(Binder.allowBlocking(
                ServiceManager.waitForDeclaredService(fqName)));
        try {
            if (face != null) {
                props = face.getSensorProps();
            } else {
                Slog.e(TAG, "Unable to get declared service: " + fqName);
            }
        } catch (RemoteException e) {
            Log.d(TAG, "Unable to get sensor properties!");
        }
        return props;
    }
}
}
+41 −34
Original line number Original line Diff line number Diff line
@@ -23,18 +23,18 @@ import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.hardware.biometrics.fingerprint.IFingerprint;
import android.hardware.biometrics.fingerprint.IFingerprint;
import android.hardware.biometrics.fingerprint.SensorProps;
import android.hardware.biometrics.fingerprint.SensorProps;
import android.os.Binder;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;
import android.util.Log;
import android.util.Pair;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashMap;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.Optional;
import java.util.Optional;
import java.util.function.Function;


/**
/**
 * Provides the sensor props for fingerprint sensor, if available.
 * Provides the sensor props for fingerprint sensor, if available.
@@ -68,23 +68,10 @@ public class FingerprintSensorConfigurations implements Parcelable {
    /**
    /**
     * Process AIDL instances to extract sensor props and add it to the sensor map.
     * Process AIDL instances to extract sensor props and add it to the sensor map.
     * @param aidlInstances available face AIDL instances
     * @param aidlInstances available face AIDL instances
     * @param getIFingerprint function that provides the daemon for the specific instance
     */
     */
    public void addAidlSensors(@NonNull String[] aidlInstances,
    public void addAidlSensors(@NonNull String[] aidlInstances) {
            @NonNull Function<String, IFingerprint> getIFingerprint) {
        for (String aidlInstance : aidlInstances) {
        for (String aidlInstance : aidlInstances) {
            try {
            mSensorPropsMap.put(aidlInstance, null);
                final String fqName = IFingerprint.DESCRIPTOR + "/" + aidlInstance;
                final IFingerprint fp = getIFingerprint.apply(fqName);
                if (fp != null) {
                    SensorProps[] props = fp.getSensorProps();
                    mSensorPropsMap.put(aidlInstance, props);
                } else {
                    Log.d(TAG, "IFingerprint null for instance " + aidlInstance);
                }
            } catch (RemoteException e) {
                Log.d(TAG, "Unable to get sensor properties!");
            }
        }
        }
    }
    }


@@ -133,38 +120,31 @@ public class FingerprintSensorConfigurations implements Parcelable {
    }
    }


    /**
    /**
     * Return sensor props for the given instance. If instance is not available,
     * Checks if {@param instance} exists.
     * then null is returned.
     */
     */
    @Nullable
    @Nullable
    public Pair<String, SensorProps[]> getSensorPairForInstance(String instance) {
    public boolean doesInstanceExist(String instance) {
        if (mSensorPropsMap.containsKey(instance)) {
        return mSensorPropsMap.containsKey(instance);
            return new Pair<>(instance, mSensorPropsMap.get(instance));
        }

        return null;
    }
    }


    /**
    /**
     * Return the first pair of instance and sensor props, which does not correspond to the given
     * Return the first HAL instance, which does not correspond to the given {@param instance}.
     * If instance is not available, then null is returned.
     * If another instance is not available, then null is returned.
     */
     */
    @Nullable
    @Nullable
    public Pair<String, SensorProps[]> getSensorPairNotForInstance(String instance) {
    public String getSensorNameNotForInstance(String instance) {
        Optional<String> notAVirtualInstance = mSensorPropsMap.keySet().stream().filter(
        Optional<String> notAVirtualInstance = mSensorPropsMap.keySet().stream().filter(
                (instanceName) -> !instanceName.equals(instance)).findFirst();
                (instanceName) -> !instanceName.equals(instance)).findFirst();
        return notAVirtualInstance.map(this::getSensorPairForInstance).orElseGet(
        return notAVirtualInstance.orElse(null);
                this::getSensorPair);
    }
    }


    /**
    /**
     * Returns the first pair of instance and sensor props that has been added to the map.
     * Returns the first instance that has been added to the map.
     */
     */
    @Nullable
    @Nullable
    public Pair<String, SensorProps[]> getSensorPair() {
    public String getSensorInstance() {
        Optional<String> optionalInstance = mSensorPropsMap.keySet().stream().findFirst();
        Optional<String> optionalInstance = mSensorPropsMap.keySet().stream().findFirst();
        return optionalInstance.map(this::getSensorPairForInstance).orElse(null);
        return optionalInstance.orElse(null);

    }
    }


    public boolean getResetLockoutRequiresHardwareAuthToken() {
    public boolean getResetLockoutRequiresHardwareAuthToken() {
@@ -181,4 +161,31 @@ public class FingerprintSensorConfigurations implements Parcelable {
        dest.writeByte((byte) (mResetLockoutRequiresHardwareAuthToken ? 1 : 0));
        dest.writeByte((byte) (mResetLockoutRequiresHardwareAuthToken ? 1 : 0));
        dest.writeMap(mSensorPropsMap);
        dest.writeMap(mSensorPropsMap);
    }
    }

    /**
     * Returns fingerprint sensor props for the HAL {@param instance}.
     */
    @Nullable
    public SensorProps[] getSensorPropForInstance(String instance) {
        SensorProps[] props = mSensorPropsMap.get(instance);

        //Props should not be null for HIDL configs
        if (props != null) {
            return props;
        }

        try {
            final String fqName = IFingerprint.DESCRIPTOR + "/" + instance;
            final IFingerprint fp = IFingerprint.Stub.asInterface(Binder.allowBlocking(
                    ServiceManager.waitForDeclaredService(fqName)));
            if (fp != null) {
                props = fp.getSensorProps();
            } else {
                Log.d(TAG, "IFingerprint null for instance " + instance);
            }
        } catch (RemoteException e) {
            Log.d(TAG, "Unable to get sensor properties!");
        }
        return props;
    }
}
}
+1 −12
Original line number Original line Diff line number Diff line
@@ -18,13 +18,10 @@ package android.hardware.face;


import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertThat;


import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import android.content.Context;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources;
import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.SensorProps;
import android.os.RemoteException;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.Presubmit;


@@ -37,8 +34,6 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.mockito.junit.MockitoRule;


import java.util.function.Function;

@Presubmit
@Presubmit
@SmallTest
@SmallTest
public class FaceSensorConfigurationsTest {
public class FaceSensorConfigurationsTest {
@@ -48,10 +43,6 @@ public class FaceSensorConfigurationsTest {
    private Context mContext;
    private Context mContext;
    @Mock
    @Mock
    private Resources mResources;
    private Resources mResources;
    @Mock
    private IFace mFace;
    @Mock
    private Function<String, IFace> mGetIFace;


    private final String[] mAidlInstances = new String[]{"default", "virtual"};
    private final String[] mAidlInstances = new String[]{"default", "virtual"};
    private String[] mHidlConfigStrings = new String[]{"0:2:15", "0:8:15"};
    private String[] mHidlConfigStrings = new String[]{"0:2:15", "0:8:15"};
@@ -59,15 +50,13 @@ public class FaceSensorConfigurationsTest {


    @Before
    @Before
    public void setUp() throws RemoteException {
    public void setUp() throws RemoteException {
        when(mGetIFace.apply(anyString())).thenReturn(mFace);
        when(mFace.getSensorProps()).thenReturn(new SensorProps[]{});
        when(mContext.getResources()).thenReturn(mResources);
        when(mContext.getResources()).thenReturn(mResources);
    }
    }


    @Test
    @Test
    public void testAidlInstanceSensorProps() {
    public void testAidlInstanceSensorProps() {
        mFaceSensorConfigurations = new FaceSensorConfigurations(false);
        mFaceSensorConfigurations = new FaceSensorConfigurations(false);
        mFaceSensorConfigurations.addAidlConfigs(mAidlInstances, mGetIFace);
        mFaceSensorConfigurations.addAidlConfigs(mAidlInstances);


        assertThat(mFaceSensorConfigurations.hasSensorConfigurations()).isTrue();
        assertThat(mFaceSensorConfigurations.hasSensorConfigurations()).isTrue();
        assertThat(!mFaceSensorConfigurations.isSingleSensorConfigurationPresent()).isTrue();
        assertThat(!mFaceSensorConfigurations.isSingleSensorConfigurationPresent()).isTrue();
+1 −12
Original line number Original line Diff line number Diff line
@@ -18,13 +18,10 @@ package android.hardware.fingerprint;


import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertThat;


import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import android.content.Context;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources;
import android.hardware.biometrics.fingerprint.IFingerprint;
import android.hardware.biometrics.fingerprint.SensorProps;
import android.os.RemoteException;
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.Presubmit;


@@ -37,8 +34,6 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.mockito.junit.MockitoRule;


import java.util.function.Function;

@Presubmit
@Presubmit
@SmallTest
@SmallTest
public class FingerprintSensorConfigurationsTest {
public class FingerprintSensorConfigurationsTest {
@@ -48,10 +43,6 @@ public class FingerprintSensorConfigurationsTest {
    private Context mContext;
    private Context mContext;
    @Mock
    @Mock
    private Resources mResources;
    private Resources mResources;
    @Mock
    private IFingerprint mFingerprint;
    @Mock
    private Function<String, IFingerprint> mGetIFingerprint;


    private final String[] mAidlInstances = new String[]{"default", "virtual"};
    private final String[] mAidlInstances = new String[]{"default", "virtual"};
    private String[] mHidlConfigStrings = new String[]{"0:2:15", "0:8:15"};
    private String[] mHidlConfigStrings = new String[]{"0:2:15", "0:8:15"};
@@ -59,8 +50,6 @@ public class FingerprintSensorConfigurationsTest {


    @Before
    @Before
    public void setUp() throws RemoteException {
    public void setUp() throws RemoteException {
        when(mGetIFingerprint.apply(anyString())).thenReturn(mFingerprint);
        when(mFingerprint.getSensorProps()).thenReturn(new SensorProps[]{});
        when(mContext.getResources()).thenReturn(mResources);
        when(mContext.getResources()).thenReturn(mResources);
    }
    }


@@ -68,7 +57,7 @@ public class FingerprintSensorConfigurationsTest {
    public void testAidlInstanceSensorProps() {
    public void testAidlInstanceSensorProps() {
        mFingerprintSensorConfigurations = new FingerprintSensorConfigurations(
        mFingerprintSensorConfigurations = new FingerprintSensorConfigurations(
                true /* resetLockoutRequiresHardwareAuthToken */);
                true /* resetLockoutRequiresHardwareAuthToken */);
        mFingerprintSensorConfigurations.addAidlSensors(mAidlInstances, mGetIFingerprint);
        mFingerprintSensorConfigurations.addAidlSensors(mAidlInstances);


        assertThat(mFingerprintSensorConfigurations.hasSensorConfigurations()).isTrue();
        assertThat(mFingerprintSensorConfigurations.hasSensorConfigurations()).isTrue();
        assertThat(!mFingerprintSensorConfigurations.isSingleSensorConfigurationPresent())
        assertThat(!mFingerprintSensorConfigurations.isSingleSensorConfigurationPresent())
+2 −6
Original line number Original line Diff line number Diff line
@@ -869,9 +869,7 @@ public class AuthService extends SystemService {
            }
            }


            if (faceAidlInstances != null && faceAidlInstances.length > 0) {
            if (faceAidlInstances != null && faceAidlInstances.length > 0) {
                mFaceSensorConfigurations.addAidlConfigs(faceAidlInstances,
                mFaceSensorConfigurations.addAidlConfigs(faceAidlInstances);
                        name -> IFace.Stub.asInterface(Binder.allowBlocking(
                                ServiceManager.waitForDeclaredService(name))));
            }
            }


            if (faceService != null) {
            if (faceService != null) {
@@ -909,9 +907,7 @@ public class AuthService extends SystemService {
            }
            }


            if (fingerprintAidlInstances != null && fingerprintAidlInstances.length > 0) {
            if (fingerprintAidlInstances != null && fingerprintAidlInstances.length > 0) {
                mFingerprintSensorConfigurations.addAidlSensors(fingerprintAidlInstances,
                mFingerprintSensorConfigurations.addAidlSensors(fingerprintAidlInstances);
                        name -> IFingerprint.Stub.asInterface(Binder.allowBlocking(
                                ServiceManager.waitForDeclaredService(name))));
            }
            }


            if (fingerprintService != null) {
            if (fingerprintService != null) {
Loading