diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index 67e4a63b30e..6ed95a03759 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -52,6 +52,7 @@ import android.widget.TextView; import androidx.appcompat.app.AlertDialog; +import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.biometrics.BiometricEnrollSidecar; import com.android.settings.biometrics.BiometricUtils; @@ -145,6 +146,15 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private OrientationEventListener mOrientationEventListener; private int mPreviousRotation = 0; + @VisibleForTesting + protected boolean shouldShowLottie() { + DisplayDensityUtils displayDensity = new DisplayDensityUtils(getApplicationContext()); + int currentDensityIndex = displayDensity.getCurrentIndex(); + final int currentDensity = displayDensity.getValues()[currentDensityIndex]; + final int defaultDensity = displayDensity.getDefaultDensity(); + return defaultDensity == currentDensity; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -178,12 +188,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title); } - DisplayDensityUtils displayDensity = - new DisplayDensityUtils(getApplicationContext()); - int currentDensityIndex = displayDensity.getCurrentIndex(); - final int currentDensity = displayDensity.getValues()[currentDensityIndex]; - final int defaultDensity = displayDensity.getDefaultDensity(); - mShouldShowLottie = defaultDensity == currentDensity; + mShouldShowLottie = shouldShowLottie(); // Only show the lottie if the current display density is the default density. // Otherwise, the lottie will overlap with the settings header text. boolean isLandscape = BiometricUtils.isReverseLandscape(getApplicationContext()) diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java index 9b39a034f0b..a67cb3a844e 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java @@ -20,22 +20,27 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; -import android.content.Intent; +import android.hardware.biometrics.ComponentInfoInternal; +import android.hardware.biometrics.SensorProperties; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback; +import android.hardware.fingerprint.FingerprintSensorProperties; +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.CancellationSignal; +import android.os.Vibrator; import android.widget.TextView; import com.android.settings.R; -import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.testutils.FakeFeatureFactory; -import com.android.settings.testutils.shadow.ShadowUtils; - -import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -43,36 +48,25 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; +import org.robolectric.android.controller.ActivityController; + +import java.util.ArrayList; +import java.util.List; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowUtils.class) public class FingerprintEnrollEnrollingTest { - @Mock - private FingerprintManager mFingerprintManager; + @Mock private FingerprintManager mFingerprintManager; + + @Mock private Vibrator mVibrator; private FingerprintEnrollEnrolling mActivity; @Before public void setUp() { MockitoAnnotations.initMocks(this); - ShadowUtils.setFingerprintManager(mFingerprintManager); - FakeFeatureFactory.setupForTest(); - mActivity = Robolectric.buildActivity( - FingerprintEnrollEnrolling.class, - new Intent() - // Set the challenge token so the confirm screen will not be shown - .putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0])) - .setup().get(); - } - - @After - public void tearDown() { - ShadowUtils.reset(); } @Test @@ -82,22 +76,62 @@ public class FingerprintEnrollEnrollingTest { enrollmentCallback.onEnrollmentProgress(123); enrollmentCallback.onEnrollmentHelp( - FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS, - "test enrollment help"); + FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS, "test enrollment help"); TextView errorText = mActivity.findViewById(R.id.error_text); assertThat(errorText.getText()).isEqualTo("test enrollment help"); } + @Test + public void fingerprintUdfpsEnrollSuccessProgress_shouldVibrate() { + initializeActivityFor(FingerprintSensorProperties.TYPE_UDFPS_OPTICAL); + + mActivity.onEnrollmentProgressChange(1, 1); + + verify(mVibrator).vibrate(anyInt(), anyString(), any(), anyString(), any()); + } + + @Test + public void fingerprintRearEnrollSuccessProgress_shouldNotVibrate() { + initializeActivityFor(FingerprintSensorProperties.TYPE_REAR); + + mActivity.onEnrollmentProgressChange(1, 1); + + verify(mVibrator, never()).vibrate(anyInt(), anyString(), any(), anyString(), any()); + } + + private void initializeActivityFor(int sensorType) { + final List componentInfo = new ArrayList<>(); + final FingerprintSensorPropertiesInternal prop = + new FingerprintSensorPropertiesInternal( + 0 /* sensorId */, + SensorProperties.STRENGTH_STRONG, + 1 /* maxEnrollmentsPerUser */, + componentInfo, + sensorType, + true /* resetLockoutRequiresHardwareAuthToken */); + final ArrayList props = new ArrayList<>(); + props.add(prop); + when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(props); + + mActivity = spy(FingerprintEnrollEnrolling.class); + doReturn(true).when(mActivity).shouldShowLottie(); + doReturn(mFingerprintManager).when(mActivity).getSystemService(FingerprintManager.class); + doReturn(mVibrator).when(mActivity).getSystemService(Vibrator.class); + + ActivityController.of(mActivity).create(); + } + private EnrollmentCallback verifyAndCaptureEnrollmentCallback() { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(EnrollmentCallback.class); - verify(mFingerprintManager).enroll( - any(byte[].class), - any(CancellationSignal.class), - anyInt(), - callbackCaptor.capture(), - eq(FingerprintManager.ENROLL_ENROLL)); + verify(mFingerprintManager) + .enroll( + any(byte[].class), + any(CancellationSignal.class), + anyInt(), + callbackCaptor.capture(), + eq(FingerprintManager.ENROLL_ENROLL)); return callbackCaptor.getValue(); }