Merge "Added test for FP Enroll vibration" into tm-d1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f733c0d7c9
@@ -52,6 +52,7 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
|
||||||
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.biometrics.BiometricEnrollSidecar;
|
import com.android.settings.biometrics.BiometricEnrollSidecar;
|
||||||
import com.android.settings.biometrics.BiometricUtils;
|
import com.android.settings.biometrics.BiometricUtils;
|
||||||
@@ -145,6 +146,15 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
|||||||
private OrientationEventListener mOrientationEventListener;
|
private OrientationEventListener mOrientationEventListener;
|
||||||
private int mPreviousRotation = 0;
|
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
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@@ -178,12 +188,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling {
|
|||||||
setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title);
|
setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title);
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayDensityUtils displayDensity =
|
mShouldShowLottie = shouldShowLottie();
|
||||||
new DisplayDensityUtils(getApplicationContext());
|
|
||||||
int currentDensityIndex = displayDensity.getCurrentIndex();
|
|
||||||
final int currentDensity = displayDensity.getValues()[currentDensityIndex];
|
|
||||||
final int defaultDensity = displayDensity.getDefaultDensity();
|
|
||||||
mShouldShowLottie = defaultDensity == currentDensity;
|
|
||||||
// Only show the lottie if the current display density is the default density.
|
// Only show the lottie if the current display density is the default density.
|
||||||
// Otherwise, the lottie will overlap with the settings header text.
|
// Otherwise, the lottie will overlap with the settings header text.
|
||||||
boolean isLandscape = BiometricUtils.isReverseLandscape(getApplicationContext())
|
boolean isLandscape = BiometricUtils.isReverseLandscape(getApplicationContext())
|
||||||
|
@@ -20,22 +20,27 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.mockito.Matchers.eq;
|
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.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;
|
||||||
import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback;
|
import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback;
|
||||||
|
import android.hardware.fingerprint.FingerprintSensorProperties;
|
||||||
|
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||||
import android.os.CancellationSignal;
|
import android.os.CancellationSignal;
|
||||||
|
import android.os.Vibrator;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
|
||||||
import com.android.settings.testutils.FakeFeatureFactory;
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
import com.android.settings.testutils.shadow.ShadowUtils;
|
|
||||||
|
|
||||||
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -43,36 +48,25 @@ import org.junit.runner.RunWith;
|
|||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.Robolectric;
|
|
||||||
import org.robolectric.RobolectricTestRunner;
|
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)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@Config(shadows = ShadowUtils.class)
|
|
||||||
public class FingerprintEnrollEnrollingTest {
|
public class FingerprintEnrollEnrollingTest {
|
||||||
|
|
||||||
@Mock
|
@Mock private FingerprintManager mFingerprintManager;
|
||||||
private FingerprintManager mFingerprintManager;
|
|
||||||
|
@Mock private Vibrator mVibrator;
|
||||||
|
|
||||||
private FingerprintEnrollEnrolling mActivity;
|
private FingerprintEnrollEnrolling mActivity;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
ShadowUtils.setFingerprintManager(mFingerprintManager);
|
|
||||||
|
|
||||||
FakeFeatureFactory.setupForTest();
|
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
|
@Test
|
||||||
@@ -82,22 +76,62 @@ public class FingerprintEnrollEnrollingTest {
|
|||||||
|
|
||||||
enrollmentCallback.onEnrollmentProgress(123);
|
enrollmentCallback.onEnrollmentProgress(123);
|
||||||
enrollmentCallback.onEnrollmentHelp(
|
enrollmentCallback.onEnrollmentHelp(
|
||||||
FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS,
|
FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS, "test enrollment help");
|
||||||
"test enrollment help");
|
|
||||||
|
|
||||||
TextView errorText = mActivity.findViewById(R.id.error_text);
|
TextView errorText = mActivity.findViewById(R.id.error_text);
|
||||||
assertThat(errorText.getText()).isEqualTo("test enrollment help");
|
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<ComponentInfoInternal> componentInfo = new ArrayList<>();
|
||||||
|
final FingerprintSensorPropertiesInternal prop =
|
||||||
|
new FingerprintSensorPropertiesInternal(
|
||||||
|
0 /* sensorId */,
|
||||||
|
SensorProperties.STRENGTH_STRONG,
|
||||||
|
1 /* maxEnrollmentsPerUser */,
|
||||||
|
componentInfo,
|
||||||
|
sensorType,
|
||||||
|
true /* resetLockoutRequiresHardwareAuthToken */);
|
||||||
|
final ArrayList<FingerprintSensorPropertiesInternal> 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() {
|
private EnrollmentCallback verifyAndCaptureEnrollmentCallback() {
|
||||||
ArgumentCaptor<EnrollmentCallback> callbackCaptor =
|
ArgumentCaptor<EnrollmentCallback> callbackCaptor =
|
||||||
ArgumentCaptor.forClass(EnrollmentCallback.class);
|
ArgumentCaptor.forClass(EnrollmentCallback.class);
|
||||||
verify(mFingerprintManager).enroll(
|
verify(mFingerprintManager)
|
||||||
any(byte[].class),
|
.enroll(
|
||||||
any(CancellationSignal.class),
|
any(byte[].class),
|
||||||
anyInt(),
|
any(CancellationSignal.class),
|
||||||
callbackCaptor.capture(),
|
anyInt(),
|
||||||
eq(FingerprintManager.ENROLL_ENROLL));
|
callbackCaptor.capture(),
|
||||||
|
eq(FingerprintManager.ENROLL_ENROLL));
|
||||||
|
|
||||||
return callbackCaptor.getValue();
|
return callbackCaptor.getValue();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user