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

Commit 5d7bab1c authored by Milton Wu's avatar Milton Wu
Browse files

Refine get props inside FingerprintRepository

FingerprintManager::getSensorPropertiesInternal() might return an
incorrect value if it's done too soon. Change to use
FingerprintManager::addAuthenticatorsRegisteredCallback() in
FingerprintRepository.

Bug: 264827022
Test: atest FingerprintRepositoryTest
      FingerprintEnrollIntroViewModelTest
      FingerprintEnrollmentViewModelTest
Change-Id: I68dd3ec1182662cc55aaa8be77a62245ab29cd54
parent 817786c6
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ import android.content.res.Resources;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -39,10 +41,21 @@ import java.util.List;
 */
public class FingerprintRepository {

    private static final String TAG = "FingerprintRepository";
    @NonNull private final FingerprintManager mFingerprintManager;

    private List<FingerprintSensorPropertiesInternal> mSensorPropertiesCache;

    public FingerprintRepository(@NonNull FingerprintManager fingerprintManager) {
        mFingerprintManager = fingerprintManager;
        mFingerprintManager.addAuthenticatorsRegisteredCallback(
                new IFingerprintAuthenticatorsRegisteredCallback.Stub() {
                    @Override
                    public void onAllAuthenticatorsRegistered(
                            List<FingerprintSensorPropertiesInternal> sensors) {
                        mSensorPropertiesCache = sensors;
                    }
                });
    }

    /**
@@ -86,9 +99,12 @@ public class FingerprintRepository {

    @Nullable
    private FingerprintSensorPropertiesInternal getFirstFingerprintSensorPropertiesInternal() {
        // TODO(b/264827022) use API addAuthenticatorsRegisteredCallback
        final List<FingerprintSensorPropertiesInternal> props =
                mFingerprintManager.getSensorPropertiesInternal();
        final List<FingerprintSensorPropertiesInternal> props = mSensorPropertiesCache;
        if (props == null) {
            // Handle this case if it really happens
            Log.e(TAG, "Sensor properties cache is null");
            return null;
        }
        return props.size() > 0 ? props.get(0) : null;
    }

+39 −72
Original line number Diff line number Diff line
@@ -23,24 +23,19 @@ import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFP
import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC;
import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UNKNOWN;

import static com.google.common.truth.Truth.assertThat;
import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository;
import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints;
import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupSuwMaxFingerprintsEnrollable;

import static org.mockito.Mockito.when;
import static com.google.common.truth.Truth.assertThat;

import android.content.Context;
import android.content.res.Resources;
import android.hardware.biometrics.SensorProperties;
import android.hardware.fingerprint.Fingerprint;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorProperties;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;

import androidx.annotation.NonNull;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.android.settings.testutils.ResourcesUtils;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -49,8 +44,6 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

import java.util.ArrayList;

@RunWith(AndroidJUnit4.class)
public class FingerprintRepositoryTest {

@@ -60,114 +53,88 @@ public class FingerprintRepositoryTest {
    @Mock private FingerprintManager mFingerprintManager;

    private Context mContext;
    private FingerprintRepository mFingerprintRepository;

    @Before
    public void setUp() {
        mContext = ApplicationProvider.getApplicationContext();
        mFingerprintRepository = new FingerprintRepository(mFingerprintManager);
    }

    @Test
    public void testCanAssumeSensorType_forUnknownSensor() {
        setupFingerprintFirstSensor(mFingerprintManager, TYPE_UNKNOWN, 1);
        assertThat(mFingerprintRepository.canAssumeUdfps()).isFalse();
        assertThat(mFingerprintRepository.canAssumeSfps()).isFalse();
        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
                TYPE_UNKNOWN, 1);
        assertThat(repository.canAssumeUdfps()).isFalse();
        assertThat(repository.canAssumeSfps()).isFalse();
    }

    @Test
    public void testCanAssumeSensorType_forRearSensor() {
        setupFingerprintFirstSensor(mFingerprintManager, TYPE_REAR, 1);
        assertThat(mFingerprintRepository.canAssumeUdfps()).isFalse();
        assertThat(mFingerprintRepository.canAssumeSfps()).isFalse();
        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
                TYPE_REAR, 1);
        assertThat(repository.canAssumeUdfps()).isFalse();
        assertThat(repository.canAssumeSfps()).isFalse();
    }

    @Test
    public void testCanAssumeSensorType_forUdfpsUltrasonicSensor() {
        setupFingerprintFirstSensor(mFingerprintManager, TYPE_UDFPS_ULTRASONIC, 1);
        assertThat(mFingerprintRepository.canAssumeUdfps()).isTrue();
        assertThat(mFingerprintRepository.canAssumeSfps()).isFalse();
        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
                TYPE_UDFPS_ULTRASONIC, 1);
        assertThat(repository.canAssumeUdfps()).isTrue();
        assertThat(repository.canAssumeSfps()).isFalse();
    }

    @Test
    public void testCanAssumeSensorType_forUdfpsOpticalSensor() {
        setupFingerprintFirstSensor(mFingerprintManager, TYPE_UDFPS_OPTICAL, 1);
        assertThat(mFingerprintRepository.canAssumeUdfps()).isTrue();
        assertThat(mFingerprintRepository.canAssumeSfps()).isFalse();
        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
                TYPE_UDFPS_OPTICAL, 1);
        assertThat(repository.canAssumeUdfps()).isTrue();
        assertThat(repository.canAssumeSfps()).isFalse();
    }

    @Test
    public void testCanAssumeSensorType_forPowerButtonSensor() {
        setupFingerprintFirstSensor(mFingerprintManager, TYPE_POWER_BUTTON, 1);
        assertThat(mFingerprintRepository.canAssumeUdfps()).isFalse();
        assertThat(mFingerprintRepository.canAssumeSfps()).isTrue();
        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
                TYPE_POWER_BUTTON, 1);
        assertThat(repository.canAssumeUdfps()).isFalse();
        assertThat(repository.canAssumeSfps()).isTrue();
    }

    @Test
    public void testCanAssumeSensorType_forHomeButtonSensor() {
        setupFingerprintFirstSensor(mFingerprintManager, TYPE_HOME_BUTTON, 1);
        assertThat(mFingerprintRepository.canAssumeUdfps()).isFalse();
        assertThat(mFingerprintRepository.canAssumeSfps()).isFalse();
        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
                TYPE_HOME_BUTTON, 1);
        assertThat(repository.canAssumeUdfps()).isFalse();
        assertThat(repository.canAssumeSfps()).isFalse();
    }

    @Test
    public void testGetMaxFingerprints() {
        setupFingerprintFirstSensor(mFingerprintManager, TYPE_UNKNOWN, 999);
        assertThat(mFingerprintRepository.getMaxFingerprints()).isEqualTo(999);
        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
                TYPE_UNKNOWN, 999);
        assertThat(repository.getMaxFingerprints()).isEqualTo(999);
    }

    @Test
    public void testGetNumOfEnrolledFingerprintsSize() {
        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
                TYPE_UNKNOWN, 999);
        setupFingerprintEnrolledFingerprints(mFingerprintManager, 10, 3);
        setupFingerprintEnrolledFingerprints(mFingerprintManager, 22, 99);

        assertThat(mFingerprintRepository.getNumOfEnrolledFingerprintsSize(10)).isEqualTo(3);
        assertThat(mFingerprintRepository.getNumOfEnrolledFingerprintsSize(22)).isEqualTo(99);
        assertThat(repository.getNumOfEnrolledFingerprintsSize(10)).isEqualTo(3);
        assertThat(repository.getNumOfEnrolledFingerprintsSize(22)).isEqualTo(99);
    }

    @Test
    public void testGetMaxFingerprintsInSuw() {
        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
                TYPE_UNKNOWN, 999);
        setupSuwMaxFingerprintsEnrollable(mContext, mResources, 333);
        assertThat(mFingerprintRepository.getMaxFingerprintsInSuw(mResources))
        assertThat(repository.getMaxFingerprintsInSuw(mResources))
                .isEqualTo(333);

        setupSuwMaxFingerprintsEnrollable(mContext, mResources, 20);
        assertThat(mFingerprintRepository.getMaxFingerprintsInSuw(mResources)).isEqualTo(20);
    }

    public static void setupSuwMaxFingerprintsEnrollable(
            @NonNull Context context,
            @NonNull Resources mockedResources,
            int numOfFp) {
        final int resId = ResourcesUtils.getResourcesId(context, "integer",
                "suw_max_fingerprints_enrollable");
        when(mockedResources.getInteger(resId)).thenReturn(numOfFp);
    }

    public static void setupFingerprintFirstSensor(
            @NonNull FingerprintManager mockedFingerprintManager,
            @FingerprintSensorProperties.SensorType int sensorType,
            int maxEnrollmentsPerUser) {

        final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
        props.add(new FingerprintSensorPropertiesInternal(
                0 /* sensorId */,
                SensorProperties.STRENGTH_STRONG,
                maxEnrollmentsPerUser,
                new ArrayList<>() /* componentInfo */,
                sensorType,
                true /* resetLockoutRequiresHardwareAuthToken */));
        when(mockedFingerprintManager.getSensorPropertiesInternal()).thenReturn(props);
        assertThat(repository.getMaxFingerprintsInSuw(mResources)).isEqualTo(20);
    }

    public static void setupFingerprintEnrolledFingerprints(
            @NonNull FingerprintManager mockedFingerprintManager,
            int userId,
            int enrolledFingerprints) {
        final ArrayList<Fingerprint> ret = new ArrayList<>();
        for (int i = 0; i < enrolledFingerprints; ++i) {
            ret.add(new Fingerprint("name", 0, 0, 0L));
        }
        when(mockedFingerprintManager.getEnrolledFingerprints(userId)).thenReturn(ret);
    }
}
+109 −68

File changed.

Preview size limit exceeded, changes collapsed.

+3 −3
Original line number Diff line number Diff line
@@ -20,10 +20,10 @@ import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHE
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_SKIP;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;
import static com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction.EXTRA_FINGERPRINT_ENROLLED_COUNT;
import static com.android.settings.biometrics2.data.repository.FingerprintRepositoryTest.setupFingerprintEnrolledFingerprints;
import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel.SAVED_STATE_IS_WAITING_ACTIVITY_RESULT;
import static com.android.settings.biometrics2.util.EnrollmentRequestUtil.newAllFalseRequest;
import static com.android.settings.biometrics2.util.EnrollmentRequestUtil.newIsSuwRequest;
import static com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newAllFalseRequest;
import static com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newIsSuwRequest;
import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints;

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

+2 −2
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

package com.android.settings.biometrics2.util;
package com.android.settings.biometrics2.utils;

import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY;

@@ -33,7 +33,7 @@ import androidx.annotation.NonNull;

import com.android.settings.biometrics2.ui.model.EnrollmentRequest;

public class EnrollmentRequestUtil {
public class EnrollmentRequestUtils {

    @NonNull
    public static EnrollmentRequest newAllFalseRequest(@NonNull Context context) {
Loading