Fix udfps fingerprint setting flow
1. on udfps + faceunlock devices, fingerprint settings shall not be
launched if no fingerprint enrolled.
2. on udfps device, after first fingerprint enrollment successfully,
fingerprint settings shall be shown.
3. Update FingerprintEnrollFindSensorTest to support udfps cases.
Bug: 243701933
Bug: 243003012
Test: manully adding first fingerprint on udfps + faceunlock device
Test: manully suw on udfps + faceunlock device
Test: run robotest for FingerprintEnrollFindSensorTest
and SetupFingerprintEnrollFindSensorTest
Merged-In: I62d945f2c2e980edf2a885234e54acae109e7672
Change-Id: I62d945f2c2e980edf2a885234e54acae109e7672
(cherry picked from commit 936dd31312
)
This commit is contained in:
@@ -67,7 +67,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
|
|||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
final FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class);
|
final FingerprintManager fingerprintManager = Utils.getFingerprintManagerOrNull(this);
|
||||||
final List<FingerprintSensorPropertiesInternal> props =
|
final List<FingerprintSensorPropertiesInternal> props =
|
||||||
fingerprintManager.getSensorPropertiesInternal();
|
fingerprintManager.getSensorPropertiesInternal();
|
||||||
mCanAssumeUdfps = props != null && props.size() == 1 && props.get(0).isAnyUdfpsType();
|
mCanAssumeUdfps = props != null && props.size() == 1 && props.get(0).isAnyUdfpsType();
|
||||||
@@ -138,8 +138,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
|
|||||||
// This is an entry point for SetNewPasswordController, e.g.
|
// This is an entry point for SetNewPasswordController, e.g.
|
||||||
// adb shell am start -a android.app.action.SET_NEW_PASSWORD
|
// adb shell am start -a android.app.action.SET_NEW_PASSWORD
|
||||||
if (mToken == null && BiometricUtils.containsGatekeeperPasswordHandle(getIntent())) {
|
if (mToken == null && BiometricUtils.containsGatekeeperPasswordHandle(getIntent())) {
|
||||||
final FingerprintManager fpm = getSystemService(FingerprintManager.class);
|
fingerprintManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
|
||||||
fpm.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
|
|
||||||
mChallenge = challenge;
|
mChallenge = challenge;
|
||||||
mSensorId = sensorId;
|
mSensorId = sensorId;
|
||||||
mToken = BiometricUtils.requestGatekeeperHat(this, getIntent(), mUserId, challenge);
|
mToken = BiometricUtils.requestGatekeeperHat(this, getIntent(), mUserId, challenge);
|
||||||
@@ -278,6 +277,7 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onStartButtonClick(View view) {
|
private void onStartButtonClick(View view) {
|
||||||
|
mNextClicked = true;
|
||||||
startActivityForResult(getFingerprintEnrollingIntent(), ENROLL_REQUEST);
|
startActivityForResult(getFingerprintEnrollingIntent(), ENROLL_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -364,10 +364,16 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
mHasFirstEnrolled);
|
mHasFirstEnrolled);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Need to authenticate a session token if none
|
// (mLaunchedConfirm or mIsEnrolling) means that we are waiting an activity result.
|
||||||
if (mToken == null && mLaunchedConfirm == false) {
|
if (!mLaunchedConfirm && !mIsEnrolling) {
|
||||||
mLaunchedConfirm = true;
|
// Need to authenticate a session token if none
|
||||||
launchChooseOrConfirmLock();
|
if (mToken == null) {
|
||||||
|
mLaunchedConfirm = true;
|
||||||
|
launchChooseOrConfirmLock();
|
||||||
|
} else if (!mHasFirstEnrolled) {
|
||||||
|
mIsEnrolling = true;
|
||||||
|
addFirstFingerprint();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
updateFooterColumns(activity);
|
updateFooterColumns(activity);
|
||||||
}
|
}
|
||||||
@@ -674,8 +680,7 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
updateAddPreference();
|
updateAddPreference();
|
||||||
if (!mHasFirstEnrolled && !mIsEnrolling) {
|
if (!mHasFirstEnrolled && !mIsEnrolling) {
|
||||||
mIsEnrolling = true;
|
mIsEnrolling = true;
|
||||||
addFirstFingerprint(
|
addFirstFingerprint();
|
||||||
BiometricUtils.getGatekeeperPasswordHandle(data));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -695,7 +700,7 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
}
|
}
|
||||||
} else if (requestCode == AUTO_ADD_FIRST_FINGERPRINT_REQUEST) {
|
} else if (requestCode == AUTO_ADD_FIRST_FINGERPRINT_REQUEST) {
|
||||||
mIsEnrolling = false;
|
mIsEnrolling = false;
|
||||||
mHasFirstEnrolled = false;
|
mHasFirstEnrolled = true;
|
||||||
if (resultCode != RESULT_FINISHED) {
|
if (resultCode != RESULT_FINISHED) {
|
||||||
Log.d(TAG, "Add first fingerprint fail, result:" + resultCode);
|
Log.d(TAG, "Add first fingerprint fail, result:" + resultCode);
|
||||||
finish();
|
finish();
|
||||||
@@ -771,7 +776,7 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addFirstFingerprint(@Nullable Long gkPwHandle) {
|
private void addFirstFingerprint() {
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
intent.setClassName(SETTINGS_PACKAGE_NAME,
|
intent.setClassName(SETTINGS_PACKAGE_NAME,
|
||||||
FingerprintEnrollIntroductionInternal.class.getName());
|
FingerprintEnrollIntroductionInternal.class.getName());
|
||||||
@@ -782,9 +787,6 @@ public class FingerprintSettings extends SubSettings {
|
|||||||
|
|
||||||
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
|
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
|
||||||
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
|
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
|
||||||
if (gkPwHandle != null) {
|
|
||||||
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, (long) gkPwHandle);
|
|
||||||
}
|
|
||||||
startActivityForResult(intent, AUTO_ADD_FIRST_FINGERPRINT_REQUEST);
|
startActivityForResult(intent, AUTO_ADD_FIRST_FINGERPRINT_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,11 +16,15 @@
|
|||||||
|
|
||||||
package com.android.settings.biometrics.fingerprint;
|
package com.android.settings.biometrics.fingerprint;
|
||||||
|
|
||||||
|
import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_REAR;
|
||||||
|
import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static com.google.common.truth.Truth.assertWithMessage;
|
import static com.google.common.truth.Truth.assertWithMessage;
|
||||||
|
|
||||||
import static org.mockito.Mockito.any;
|
import static org.mockito.Mockito.any;
|
||||||
import static org.mockito.Mockito.anyInt;
|
import static org.mockito.Mockito.anyInt;
|
||||||
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.eq;
|
import static org.mockito.Mockito.eq;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.robolectric.RuntimeEnvironment.application;
|
import static org.robolectric.RuntimeEnvironment.application;
|
||||||
@@ -28,9 +32,14 @@ import static org.robolectric.RuntimeEnvironment.application;
|
|||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Intent;
|
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.view.View;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.biometrics.BiometricEnrollBase;
|
import com.android.settings.biometrics.BiometricEnrollBase;
|
||||||
@@ -40,6 +49,8 @@ import com.android.settings.testutils.shadow.ShadowUtils;
|
|||||||
|
|
||||||
import com.google.android.setupcompat.PartnerCustomizationLayout;
|
import com.google.android.setupcompat.PartnerCustomizationLayout;
|
||||||
import com.google.android.setupcompat.template.FooterBarMixin;
|
import com.google.android.setupcompat.template.FooterBarMixin;
|
||||||
|
import com.google.android.setupcompat.template.FooterButton;
|
||||||
|
import com.google.android.setupdesign.GlifLayout;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@@ -51,17 +62,24 @@ import org.mockito.MockitoAnnotations;
|
|||||||
import org.robolectric.Robolectric;
|
import org.robolectric.Robolectric;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.Shadows;
|
import org.robolectric.Shadows;
|
||||||
|
import org.robolectric.android.controller.ActivityController;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
import org.robolectric.shadows.ShadowActivity;
|
import org.robolectric.shadows.ShadowActivity;
|
||||||
import org.robolectric.shadows.ShadowActivity.IntentForResult;
|
import org.robolectric.shadows.ShadowActivity.IntentForResult;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@Config(shadows = ShadowUtils.class)
|
@Config(shadows = ShadowUtils.class)
|
||||||
public class FingerprintEnrollFindSensorTest {
|
public class FingerprintEnrollFindSensorTest {
|
||||||
|
|
||||||
|
private static final int DEFAULT_ACTIVITY_RESULT = Activity.RESULT_CANCELED;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private FingerprintManager mFingerprintManager;
|
private FingerprintManager mFingerprintManager;
|
||||||
|
|
||||||
|
private ActivityController<FingerprintEnrollFindSensor> mActivityController;
|
||||||
|
|
||||||
private FingerprintEnrollFindSensor mActivity;
|
private FingerprintEnrollFindSensor mActivity;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -70,12 +88,40 @@ public class FingerprintEnrollFindSensorTest {
|
|||||||
ShadowUtils.setFingerprintManager(mFingerprintManager);
|
ShadowUtils.setFingerprintManager(mFingerprintManager);
|
||||||
FakeFeatureFactory.setupForTest();
|
FakeFeatureFactory.setupForTest();
|
||||||
|
|
||||||
mActivity = Robolectric.buildActivity(
|
mActivityController = Robolectric.buildActivity(
|
||||||
FingerprintEnrollFindSensor.class,
|
FingerprintEnrollFindSensor.class,
|
||||||
new Intent()
|
new Intent()
|
||||||
// Set the challenge token so the confirm screen will not be shown
|
// Set the challenge token so the confirm screen will not be shown
|
||||||
.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0]))
|
.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0])
|
||||||
.setup().get();
|
);
|
||||||
|
mActivity = mActivityController.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupActivity_onRearDevice() {
|
||||||
|
final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
|
||||||
|
props.add(newFingerprintSensorPropertiesInternal(TYPE_REAR));
|
||||||
|
doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
|
||||||
|
|
||||||
|
mActivityController.setup();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupActivity_onUdfpsDevice() {
|
||||||
|
final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
|
||||||
|
props.add(newFingerprintSensorPropertiesInternal(TYPE_UDFPS_OPTICAL));
|
||||||
|
doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal();
|
||||||
|
|
||||||
|
mActivityController.setup();
|
||||||
|
}
|
||||||
|
|
||||||
|
private FingerprintSensorPropertiesInternal newFingerprintSensorPropertiesInternal(
|
||||||
|
@FingerprintSensorProperties.SensorType int sensorType) {
|
||||||
|
return new FingerprintSensorPropertiesInternal(
|
||||||
|
0 /* sensorId */,
|
||||||
|
SensorProperties.STRENGTH_STRONG,
|
||||||
|
1 /* maxEnrollmentsPerUser */,
|
||||||
|
new ArrayList<ComponentInfoInternal>(),
|
||||||
|
sensorType,
|
||||||
|
true /* resetLockoutRequiresHardwareAuthToken */);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@@ -83,13 +129,7 @@ public class FingerprintEnrollFindSensorTest {
|
|||||||
ShadowUtils.reset();
|
ShadowUtils.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
private void verifyStartEnrollingActivity() {
|
||||||
public void enrollFingerprint_shouldProceed() {
|
|
||||||
EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback();
|
|
||||||
|
|
||||||
enrollmentCallback.onEnrollmentProgress(123);
|
|
||||||
enrollmentCallback.onEnrollmentError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, "test");
|
|
||||||
|
|
||||||
ShadowActivity shadowActivity = Shadows.shadowOf(mActivity);
|
ShadowActivity shadowActivity = Shadows.shadowOf(mActivity);
|
||||||
IntentForResult startedActivity =
|
IntentForResult startedActivity =
|
||||||
shadowActivity.getNextStartedActivityForResult();
|
shadowActivity.getNextStartedActivityForResult();
|
||||||
@@ -100,6 +140,7 @@ public class FingerprintEnrollFindSensorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void enrollFingerprintTwice_shouldStartOneEnrolling() {
|
public void enrollFingerprintTwice_shouldStartOneEnrolling() {
|
||||||
|
setupActivity_onRearDevice();
|
||||||
EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback();
|
EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback();
|
||||||
|
|
||||||
enrollmentCallback.onEnrollmentProgress(123);
|
enrollmentCallback.onEnrollmentProgress(123);
|
||||||
@@ -123,6 +164,8 @@ public class FingerprintEnrollFindSensorTest {
|
|||||||
@Config(qualifiers = "mcc999")
|
@Config(qualifiers = "mcc999")
|
||||||
@Test
|
@Test
|
||||||
public void layoutWithoutAnimation_shouldNotCrash() {
|
public void layoutWithoutAnimation_shouldNotCrash() {
|
||||||
|
setupActivity_onRearDevice();
|
||||||
|
|
||||||
EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback();
|
EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback();
|
||||||
enrollmentCallback.onEnrollmentProgress(123);
|
enrollmentCallback.onEnrollmentProgress(123);
|
||||||
enrollmentCallback.onEnrollmentError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, "test");
|
enrollmentCallback.onEnrollmentError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, "test");
|
||||||
@@ -137,6 +180,8 @@ public class FingerprintEnrollFindSensorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void clickSkip_shouldReturnResultSkip() {
|
public void clickSkip_shouldReturnResultSkip() {
|
||||||
|
setupActivity_onRearDevice();
|
||||||
|
|
||||||
PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
|
PartnerCustomizationLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
|
||||||
layout.getMixin(FooterBarMixin.class).getSecondaryButtonView().performClick();
|
layout.getMixin(FooterBarMixin.class).getSecondaryButtonView().performClick();
|
||||||
|
|
||||||
@@ -160,6 +205,8 @@ public class FingerprintEnrollFindSensorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onActivityResult_withNullIntentShouldNotCrash() {
|
public void onActivityResult_withNullIntentShouldNotCrash() {
|
||||||
|
setupActivity_onRearDevice();
|
||||||
|
|
||||||
// this should not crash
|
// this should not crash
|
||||||
mActivity.onActivityResult(BiometricEnrollBase.CONFIRM_REQUEST, Activity.RESULT_OK,
|
mActivity.onActivityResult(BiometricEnrollBase.CONFIRM_REQUEST, Activity.RESULT_OK,
|
||||||
null);
|
null);
|
||||||
@@ -167,74 +214,159 @@ public class FingerprintEnrollFindSensorTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onActivityResult_EnrollRequestResultFinishShallBeSentBack() {
|
public void enrollingFinishResultShallSentBack_onRearDevice() {
|
||||||
final int defaultActivityResult = Shadows.shadowOf(mActivity).getResultCode();
|
setupActivity_onRearDevice();
|
||||||
|
triggerEnrollProgressAndError_onRearDevice();
|
||||||
// Start enrolling
|
verifyStartEnrollingActivity();
|
||||||
EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback();
|
|
||||||
enrollmentCallback.onEnrollmentProgress(123);
|
|
||||||
enrollmentCallback.onEnrollmentError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, "test");
|
|
||||||
|
|
||||||
// onStop shall not change default activity result
|
// onStop shall not change default activity result
|
||||||
mActivity.onStop();
|
mActivityController.pause().stop();
|
||||||
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(defaultActivityResult);
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
// onActivityResult from Enrolling activity shall be sent back
|
gotEnrollingResult_verifyResultSentBack(BiometricEnrollBase.RESULT_FINISHED);
|
||||||
final int testResult = BiometricEnrollBase.RESULT_FINISHED;
|
|
||||||
mActivity.onActivityResult(BiometricEnrollBase.ENROLL_REQUEST, testResult, null);
|
|
||||||
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(testResult);
|
|
||||||
assertThat(mActivity.isFinishing()).isEqualTo(true);
|
|
||||||
|
|
||||||
// onStop shall not change last activity result
|
|
||||||
mActivity.onStop();
|
|
||||||
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(testResult);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onActivityResult_EnrollRequestResultSkipShallBeSentBack() {
|
public void enrollingSkipResultShallSentBack_onRearDevice() {
|
||||||
final int defaultActivityResult = Shadows.shadowOf(mActivity).getResultCode();
|
setupActivity_onRearDevice();
|
||||||
|
triggerEnrollProgressAndError_onRearDevice();
|
||||||
// Start enrolling
|
verifyStartEnrollingActivity();
|
||||||
EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback();
|
|
||||||
enrollmentCallback.onEnrollmentProgress(123);
|
|
||||||
enrollmentCallback.onEnrollmentError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, "test");
|
|
||||||
|
|
||||||
// onStop shall not change default activity result
|
// onStop shall not change default activity result
|
||||||
mActivity.onStop();
|
mActivityController.pause().stop();
|
||||||
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(defaultActivityResult);
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
// onActivityResult from Enrolling activity shall be sent back
|
gotEnrollingResult_verifyResultSentBack(BiometricEnrollBase.RESULT_SKIP);
|
||||||
final int testResult = BiometricEnrollBase.RESULT_SKIP;
|
|
||||||
mActivity.onActivityResult(BiometricEnrollBase.ENROLL_REQUEST, testResult, null);
|
|
||||||
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(testResult);
|
|
||||||
assertThat(mActivity.isFinishing()).isEqualTo(true);
|
|
||||||
|
|
||||||
// onStop shall not change last activity result
|
|
||||||
mActivity.onStop();
|
|
||||||
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(testResult);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onActivityResult_EnrollRequestResultTimeoutShallBeSentBack() {
|
public void enrollingTimeoutResultShallSentBack_onRearDevice() {
|
||||||
final int defaultActivityResult = Shadows.shadowOf(mActivity).getResultCode();
|
setupActivity_onRearDevice();
|
||||||
|
triggerEnrollProgressAndError_onRearDevice();
|
||||||
|
verifyStartEnrollingActivity();
|
||||||
|
|
||||||
// Start enrolling
|
// onStop shall not change default activity result
|
||||||
|
mActivityController.pause().stop();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
gotEnrollingResult_verifyResultSentBack(BiometricEnrollBase.RESULT_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void enrollingFinishResultShallSentBack_onUdfpsDevice_triggeredByLottieClick() {
|
||||||
|
setupActivity_onUdfpsDevice();
|
||||||
|
clickLottieView_onUdfpsDevice();
|
||||||
|
verifyStartEnrollingActivity();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
// onStop shall not change default activity result
|
||||||
|
mActivityController.pause().stop();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
gotEnrollingResult_verifyResultSentBack(BiometricEnrollBase.RESULT_FINISHED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void enrollingSkipResultShallSentBack_onUdfpsDevice_triggeredByLottieClick() {
|
||||||
|
setupActivity_onUdfpsDevice();
|
||||||
|
clickLottieView_onUdfpsDevice();
|
||||||
|
verifyStartEnrollingActivity();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
// onStop shall not change default activity result
|
||||||
|
mActivityController.pause().stop();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
gotEnrollingResult_verifyResultSentBack(BiometricEnrollBase.RESULT_SKIP);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void enrollingTimeoutResultShallSentBack_onUdfpsDevice_triggeredByLottieClick() {
|
||||||
|
setupActivity_onUdfpsDevice();
|
||||||
|
clickLottieView_onUdfpsDevice();
|
||||||
|
verifyStartEnrollingActivity();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
// onStop shall not change default activity result
|
||||||
|
mActivityController.pause().stop();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
gotEnrollingResult_verifyResultSentBack(BiometricEnrollBase.RESULT_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void enrollingFinishResultShallSentBack_onUdfpsDevice_triggeredByPrimaryButtonClick() {
|
||||||
|
setupActivity_onUdfpsDevice();
|
||||||
|
clickPrimaryButton_onUdfpsDevice();
|
||||||
|
verifyStartEnrollingActivity();
|
||||||
|
|
||||||
|
// onStop shall not change default activity result
|
||||||
|
mActivityController.pause().stop();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
gotEnrollingResult_verifyResultSentBack(BiometricEnrollBase.RESULT_FINISHED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void enrollingSkipResultShallSentBack_onUdfpsDevice_triggeredByPrimaryButtonClick() {
|
||||||
|
setupActivity_onUdfpsDevice();
|
||||||
|
clickPrimaryButton_onUdfpsDevice();
|
||||||
|
verifyStartEnrollingActivity();
|
||||||
|
|
||||||
|
// onStop shall not change default activity result
|
||||||
|
mActivityController.pause().stop();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
gotEnrollingResult_verifyResultSentBack(BiometricEnrollBase.RESULT_SKIP);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void enrollingTimeoutResultShallSentBack_onUdfpsDevice_triggeredByPrimaryButtonClick() {
|
||||||
|
setupActivity_onUdfpsDevice();
|
||||||
|
clickPrimaryButton_onUdfpsDevice();
|
||||||
|
verifyStartEnrollingActivity();
|
||||||
|
|
||||||
|
// onStop shall not change default activity result
|
||||||
|
mActivityController.pause().stop();
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(DEFAULT_ACTIVITY_RESULT);
|
||||||
|
|
||||||
|
gotEnrollingResult_verifyResultSentBack(BiometricEnrollBase.RESULT_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void triggerEnrollProgressAndError_onRearDevice() {
|
||||||
EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback();
|
EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback();
|
||||||
enrollmentCallback.onEnrollmentProgress(123);
|
enrollmentCallback.onEnrollmentProgress(123);
|
||||||
enrollmentCallback.onEnrollmentError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, "test");
|
enrollmentCallback.onEnrollmentError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, "test");
|
||||||
|
}
|
||||||
|
|
||||||
// onStop shall not change default activity result
|
private void clickPrimaryButton_onUdfpsDevice() {
|
||||||
mActivity.onStop();
|
final FooterBarMixin footerBarMixin =
|
||||||
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(defaultActivityResult);
|
((GlifLayout) mActivity.findViewById(R.id.setup_wizard_layout))
|
||||||
|
.getMixin(FooterBarMixin.class);
|
||||||
|
final FooterButton primaryButton = footerBarMixin.getPrimaryButton();
|
||||||
|
assertThat(primaryButton).isNotNull();
|
||||||
|
assertThat(primaryButton.getVisibility()).isEqualTo(View.VISIBLE);
|
||||||
|
primaryButton.onClick(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clickLottieView_onUdfpsDevice() {
|
||||||
|
final View lottieView = mActivity.findViewById(R.id.illustration_lottie);
|
||||||
|
assertThat(lottieView).isNotNull();
|
||||||
|
lottieView.performClick();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void gotEnrollingResult_verifyResultSentBack(int testActivityResult) {
|
||||||
// onActivityResult from Enrolling activity shall be sent back
|
// onActivityResult from Enrolling activity shall be sent back
|
||||||
final int testResult = BiometricEnrollBase.RESULT_TIMEOUT;
|
mActivityController.start().resume().visible();
|
||||||
mActivity.onActivityResult(BiometricEnrollBase.ENROLL_REQUEST, testResult, null);
|
Shadows.shadowOf(mActivity).receiveResult(
|
||||||
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(testResult);
|
new Intent(mActivity, FingerprintEnrollEnrolling.class),
|
||||||
|
testActivityResult,
|
||||||
|
null);
|
||||||
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(testActivityResult);
|
||||||
assertThat(mActivity.isFinishing()).isEqualTo(true);
|
assertThat(mActivity.isFinishing()).isEqualTo(true);
|
||||||
|
|
||||||
// onStop shall not change last activity result
|
// onStop shall not change last activity result
|
||||||
mActivity.onStop();
|
mActivityController.pause().stop();
|
||||||
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(testResult);
|
assertThat(Shadows.shadowOf(mActivity).getResultCode()).isEqualTo(testActivityResult);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user