[BiometricsV2] Rewrite Activity to Kotlin
Refactor FingerprintEnrollmentActivity as kotlin
Bug: 286197261
Test: atest FingerprintEnrollmentActivity
Test: atest biometrics-enrollment-test
Change-Id: I45d2db832b0111cb865b657aee56f84b0b295efa
diff --git a/tests/uitests/Android.bp b/tests/uitests/Android.bp
index d4f09a3..407b5ec 100644
--- a/tests/uitests/Android.bp
+++ b/tests/uitests/Android.bp
@@ -26,7 +26,10 @@
platform_apis: true,
certificate: "platform",
test_suites: ["device-tests"],
- srcs: ["src/**/*.java"],
+ srcs: [
+ "src/**/*.java",
+ "src/**/*.kt",
+ ],
libs: [
"android.test.runner",
@@ -34,6 +37,7 @@
],
static_libs: [
+ "androidx.test.ext.junit",
"androidx.test.rules",
"androidx.test.uiautomator_uiautomator",
"app-helpers-core",
diff --git a/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.java b/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.java
deleted file mode 100644
index 0a84c15..0000000
--- a/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.java
+++ /dev/null
@@ -1,622 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.biometrics2.ui.view;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assume.assumeFalse;
-import static org.junit.Assume.assumeTrue;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
-import android.os.UserHandle;
-import android.support.test.uiautomator.By;
-import android.support.test.uiautomator.UiDevice;
-import android.support.test.uiautomator.UiObject2;
-import android.support.test.uiautomator.Until;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import com.android.internal.widget.LockPatternChecker;
-import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.LockscreenCredential;
-import com.android.settings.biometrics2.utils.LockScreenUtil;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.IOException;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-public class FingerprintEnrollmentActivityTest {
-
- private static final String TAG = "FingerprintEnrollmentActivityTest";
-
- private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
- private static final String ACTIVITY_CLASS_NAME =
- "com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity";
- private static final String SUW_ACTIVITY_CLASS_NAME = ACTIVITY_CLASS_NAME + "$SetupActivity";
- private static final String EXTRA_IS_SETUP_FLOW = "isSetupFlow";
- private static final String EXTRA_SKIP_INTRO = "skip_intro";
- private static final String EXTRA_SKIP_FIND_SENSOR = "skip_find_sensor";
- private static final String EXTRA_PAGE_TRANSITION_TYPE = "page_transition_type";
- private static final String EXTRA_KEY_GK_PW_HANDLE = "gk_pw_handle";
- private static final String TEST_PIN = "1234";
-
- private static final String DO_IT_LATER = "Do it later";
-
- private static final String UDFPS_ENROLLING_TITLE = "Touch & hold the fingerprint sensor";
- private static final String SFPS_ENROLLING_TITLE =
- "Lift, then touch. Move your finger slightly each time.";
- private static final String RFPS_ENROLLING_TITLE = "Lift, then touch again";
-
- private UiDevice mDevice;
- private byte[] mToken = new byte[]{};
- private Context mContext;
- private boolean mFingerprintPropCallbackLaunched;
- private boolean mCanAssumeUdfps;
- private boolean mCanAssumeSfps;
- private String mEnrollingTitle;
-
- private static final int IDLE_TIMEOUT = 10000;
-
- @Before
- public void setUp() throws InterruptedException {
- mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
- mContext = InstrumentationRegistry.getContext();
-
- // Stop every test if it is not a fingerprint device
- assumeTrue(mContext.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_FINGERPRINT));
-
- final FingerprintManager fingerprintManager = mContext.getSystemService(
- FingerprintManager.class);
- mFingerprintPropCallbackLaunched = false;
- fingerprintManager.addAuthenticatorsRegisteredCallback(
- new IFingerprintAuthenticatorsRegisteredCallback.Stub() {
- @Override
- public void onAllAuthenticatorsRegistered(
- List<FingerprintSensorPropertiesInternal> list) {
- mFingerprintPropCallbackLaunched = true;
-
- assertThat(list).isNotNull();
- assertThat(list).isNotEmpty();
- final FingerprintSensorPropertiesInternal prop = list.get(0);
- mCanAssumeUdfps = prop.isAnyUdfpsType();
- mCanAssumeSfps = prop.isAnySidefpsType();
- if (mCanAssumeUdfps) {
- mEnrollingTitle = UDFPS_ENROLLING_TITLE;
- } else if (mCanAssumeSfps) {
- mEnrollingTitle = SFPS_ENROLLING_TITLE;
- } else {
- mEnrollingTitle = RFPS_ENROLLING_TITLE;
- }
- }
- });
-
- for (long i = 0; i < IDLE_TIMEOUT && !mFingerprintPropCallbackLaunched; i += 100L) {
- Thread.sleep(100L);
- }
- assertThat(mFingerprintPropCallbackLaunched).isTrue();
-
- mDevice.pressHome();
-
- // Stop settings before performing test
- try {
- mDevice.executeShellCommand("am force-stop " + SETTINGS_PACKAGE_NAME);
- } catch (IOException e) {
- Log.e(TAG, "Fail to stop settings app", e);
- }
- }
-
- @After
- public void tearDown() throws Exception {
- LockScreenUtil.resetLockscreen(TEST_PIN);
- mDevice.pressHome();
- }
-
- @Test
- public void testIntroChooseLock() {
- final Intent intent = newActivityIntent(false);
- mContext.startActivity(intent);
- assertThat(mDevice.wait(Until.hasObject(By.text("Choose your backup screen lock method")),
- IDLE_TIMEOUT)).isTrue();
- }
-
- private void verifyIntroPage() {
- mDevice.waitForIdle();
- for (long i = 0; i < IDLE_TIMEOUT; i += 100L) {
- if (mDevice.wait(Until.hasObject(By.text("More")), 50L)) {
- break;
- } else if (mDevice.wait(Until.hasObject(By.text("I agree")), 50L)) {
- break;
- }
- }
-
- // Click more btn at most twice and the introduction should stay in the last page
- UiObject2 moreBtn;
- for (int i = 0; i < 2 && (moreBtn = mDevice.findObject(By.text("More"))) != null; ++i) {
- moreBtn.click();
- mDevice.waitForIdle();
- mDevice.wait(Until.hasObject(By.text("More")), IDLE_TIMEOUT);
- }
-
- assertThat(mDevice.wait(Until.hasObject(By.text("No thanks")), IDLE_TIMEOUT)).isTrue();
- assertThat(mDevice.wait(Until.hasObject(By.text("I agree")), IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testIntroWithGkPwHandle_withUdfps_clickStart() {
- assumeTrue(mCanAssumeUdfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchIntroWithGkPwHandle(false);
-
- // Intro page
- verifyIntroPage();
- final UiObject2 agreeBtn = mDevice.findObject(By.text("I agree"));
- assertThat(agreeBtn).isNotNull();
- agreeBtn.click();
-
- // FindUdfps page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "illustration_lottie"));
- assertThat(lottie).isNotNull();
- assertThat(lottie.isClickable()).isTrue();
- final UiObject2 startBtn = mDevice.findObject(By.text("Start"));
- assertThat(startBtn.isClickable()).isTrue();
- startBtn.click();
-
- // Enrolling page
- assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testIntroWithGkPwHandle_withUdfps_clickLottie() {
- assumeTrue(mCanAssumeUdfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchIntroWithGkPwHandle(false);
-
- // Intro page
- verifyIntroPage();
- final UiObject2 agreeBtn = mDevice.findObject(By.text("I agree"));
- assertThat(agreeBtn).isNotNull();
- agreeBtn.click();
-
- // FindUdfps page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "illustration_lottie"));
- assertThat(lottie).isNotNull();
- assertThat(lottie.isClickable()).isTrue();
- final UiObject2 startBtn = mDevice.findObject(By.text("Start"));
- assertThat(startBtn.isClickable()).isTrue();
- lottie.click();
-
- // Enrolling page
- assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testIntroWithGkPwHandle_withSfps() {
- assumeTrue(mCanAssumeSfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchIntroWithGkPwHandle(false);
-
- // Intro page
- verifyIntroPage();
- final UiObject2 agreeBtn = mDevice.findObject(By.text("I agree"));
- assertThat(agreeBtn).isNotNull();
- agreeBtn.click();
-
- // FindSfps page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "illustration_lottie"));
- assertThat(lottie).isNotNull();
-
- // We don't have view which can be clicked to run to next page, stop at here.
- }
-
- @Test
- public void testIntroWithGkPwHandle_withRfps() {
- assumeFalse(mCanAssumeUdfps || mCanAssumeSfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchIntroWithGkPwHandle(false);
-
- // Intro page
- verifyIntroPage();
- final UiObject2 agreeBtn = mDevice.findObject(By.text("I agree"));
- assertThat(agreeBtn).isNotNull();
- agreeBtn.click();
-
- // FindRfps page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "illustration_lottie"));
- if (lottie == null) {
- // FindSfps page shall have an animation view if no lottie view
- assertThat(mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "fingerprint_sensor_location_animation"))).isNotNull();
- }
- }
-
- @Test
- public void testIntroWithGkPwHandle_clickNoThanksInIntroPage() {
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchIntroWithGkPwHandle(false);
-
- // Intro page
- verifyIntroPage();
- final UiObject2 noThanksBtn = mDevice.findObject(By.text("No thanks"));
- assertThat(noThanksBtn).isNotNull();
- noThanksBtn.click();
-
- // Back to home
- mDevice.waitForWindowUpdate("com.android.settings", IDLE_TIMEOUT);
- assertThat(mDevice.findObject(By.text("No thanks"))).isNull();
- }
-
- @Test
- public void testIntroWithGkPwHandle_clickSkipInFindSensor() {
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchIntroWithGkPwHandle(false);
-
- // Intro page
- verifyIntroPage();
- final UiObject2 agreeBtn = mDevice.findObject(By.text("I agree"));
- assertThat(agreeBtn).isNotNull();
- agreeBtn.click();
-
- // FindSensor page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 doItLaterBtn = mDevice.findObject(By.text(DO_IT_LATER));
- assertThat(doItLaterBtn).isNotNull();
- assertThat(doItLaterBtn.isClickable()).isTrue();
- doItLaterBtn.click();
-
- // Back to home
- mDevice.waitForWindowUpdate("com.android.settings", IDLE_TIMEOUT);
- assertThat(mDevice.findObject(By.text(DO_IT_LATER))).isNull();
- }
-
- @Test
- public void testIntroWithGkPwHandle_clickSkipAnywayInFindFpsDialog_whenIsSuw() {
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchIntroWithGkPwHandle(true);
-
- // Intro page
- verifyIntroPage();
- final UiObject2 agreeBtn = mDevice.findObject(By.text("I agree"));
- assertThat(agreeBtn).isNotNull();
- agreeBtn.click();
-
- // FindSensor page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 doItLaterBtn = mDevice.findObject(By.text(DO_IT_LATER));
- assertThat(doItLaterBtn).isNotNull();
- assertThat(doItLaterBtn.isClickable()).isTrue();
- doItLaterBtn.click();
-
- // SkipSetupFindFpsDialog
- assertThat(mDevice.wait(Until.hasObject(By.text("Skip fingerprint?")),
- IDLE_TIMEOUT)).isTrue();
- final UiObject2 skipAnywayBtn = mDevice.findObject(By.text("Skip anyway"));
- assertThat(skipAnywayBtn).isNotNull();
- assertThat(skipAnywayBtn.isClickable()).isTrue();
- skipAnywayBtn.click();
-
- // Back to home
- mDevice.waitForWindowUpdate("com.android.settings", IDLE_TIMEOUT);
- assertThat(mDevice.findObject(By.text("Skip anyway"))).isNull();
- assertThat(mDevice.findObject(By.text(DO_IT_LATER))).isNull();
- }
-
- @Test
- public void testIntroWithGkPwHandle_clickGoBackInFindFpsDialog_whenIsSuw() {
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchIntroWithGkPwHandle(true);
-
- // Intro page
- verifyIntroPage();
- final UiObject2 agreeBtn = mDevice.findObject(By.text("I agree"));
- assertThat(agreeBtn).isNotNull();
- agreeBtn.click();
-
- // FindSensor page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 doItLaterBtn = mDevice.findObject(By.text(DO_IT_LATER));
- assertThat(doItLaterBtn).isNotNull();
- assertThat(doItLaterBtn.isClickable()).isTrue();
- doItLaterBtn.click();
-
- // SkipSetupFindFpsDialog
- assertThat(mDevice.wait(Until.hasObject(By.text("Skip fingerprint?")), IDLE_TIMEOUT))
- .isTrue();
- final UiObject2 goBackBtn = mDevice.findObject(By.text("Go back"));
- assertThat(goBackBtn).isNotNull();
- assertThat(goBackBtn.isClickable()).isTrue();
- goBackBtn.click();
-
- // FindSensor page again
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testIntroCheckPin() {
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
- final Intent intent = newActivityIntent(false);
- mContext.startActivity(intent);
- assertThat(mDevice.wait(Until.hasObject(By.text("Enter your device PIN to continue")),
- IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testEnrollingWithGkPwHandle() {
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchEnrollingWithGkPwHandle();
-
- // Enrolling screen
- mDevice.waitForIdle();
- assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testEnrollingIconTouchDialog_withSfps() {
- assumeTrue(mCanAssumeSfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchEnrollingWithGkPwHandle();
-
- // Enrolling screen
- mDevice.waitForIdle();
- assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue();
-
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "illustration_lottie"));
- assertThat(lottie).isNotNull();
-
- lottie.click();
- lottie.click();
- lottie.click();
-
- // IconTouchDialog
- mDevice.waitForIdle();
- assertThat(mDevice.wait(Until.hasObject(By.text("Touch the sensor instead")), IDLE_TIMEOUT))
- .isTrue();
- final UiObject2 okButton = mDevice.findObject(By.text("OK"));
- assertThat(okButton).isNotNull();
-
- okButton.click();
-
- // Enrolling screen again
- mDevice.waitForIdle();
- assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testEnrollingIconTouchDialog_withRfps() {
- assumeFalse(mCanAssumeUdfps || mCanAssumeSfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchEnrollingWithGkPwHandle();
-
- // Enrolling screen
- mDevice.waitForIdle();
- assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue();
-
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "fingerprint_progress_bar"));
- assertThat(lottie).isNotNull();
-
- lottie.click();
- lottie.click();
- lottie.click();
-
- // IconTouchDialog
- mDevice.waitForIdle();
- assertThat(mDevice.wait(Until.hasObject(By.text("Whoops, that\u2019s not the sensor")),
- IDLE_TIMEOUT)).isTrue();
- final UiObject2 okButton = mDevice.findObject(By.text("OK"));
- assertThat(okButton).isNotNull();
-
- okButton.click();
-
- // Enrolling screen again
- mDevice.waitForIdle();
- assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testFindUdfpsWithGkPwHandle_clickStart() {
- assumeTrue(mCanAssumeUdfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchFindSensorWithGkPwHandle();
-
- // FindUdfps page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "illustration_lottie"));
- assertThat(lottie).isNotNull();
- assertThat(lottie.isClickable()).isTrue();
- final UiObject2 startBtn = mDevice.findObject(By.text("Start"));
- assertThat(startBtn.isClickable()).isTrue();
- startBtn.click();
-
- // Enrolling page
- assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testFindUdfpsWithGkPwHandle_clickLottie() {
- assumeTrue(mCanAssumeUdfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchFindSensorWithGkPwHandle();
-
- // FindUdfps page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "illustration_lottie"));
- assertThat(lottie).isNotNull();
- assertThat(lottie.isClickable()).isTrue();
- final UiObject2 startBtn = mDevice.findObject(By.text("Start"));
- assertThat(startBtn.isClickable()).isTrue();
- lottie.click();
-
- // Enrolling page
- assertThat(mDevice.wait(Until.hasObject(By.text(mEnrollingTitle)), IDLE_TIMEOUT)).isTrue();
- }
-
- @Test
- public void testFindSfpsWithGkPwHandle() {
- assumeTrue(mCanAssumeSfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchFindSensorWithGkPwHandle();
-
- // FindSfps page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "illustration_lottie"));
- assertThat(lottie).isNotNull();
-
- // We don't have view which can be clicked to run to next page, stop at here.
- }
-
- @Test
- public void testFindRfpsWithGkPwHandle() {
- assumeFalse(mCanAssumeUdfps || mCanAssumeSfps);
-
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchFindSensorWithGkPwHandle();
-
- // FindRfps page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 lottie = mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "illustration_lottie"));
- if (lottie == null) {
- // FindSfps page shall have an animation view if no lottie view
- assertThat(mDevice.findObject(By.res(SETTINGS_PACKAGE_NAME,
- "fingerprint_sensor_location_animation"))).isNotNull();
- }
- }
-
-
- @Test
- public void testFindSensorWithGkPwHandle_clickSkipInFindSensor() {
- LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true);
-
- launchFindSensorWithGkPwHandle();
-
- // FindSensor page
- assertThat(mDevice.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- final UiObject2 doItLaterBtn = mDevice.findObject(By.text(DO_IT_LATER));
- assertThat(doItLaterBtn).isNotNull();
- assertThat(doItLaterBtn.isClickable()).isTrue();
- doItLaterBtn.click();
-
- // Back to home
- mDevice.waitForWindowUpdate("com.android.settings", IDLE_TIMEOUT);
- assertThat(mDevice.wait(Until.gone(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue();
- }
-
- private void launchIntroWithGkPwHandle(boolean isSuw) {
- LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext);
- final LockscreenCredential lockscreenCredential = LockscreenCredential.createPin(TEST_PIN);
- final int userId = UserHandle.myUserId();
- final LockPatternChecker.OnVerifyCallback onVerifyCallback = (response, timeoutMs) -> {
- final Intent intent = newActivityIntent(isSuw);
- intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, response.getGatekeeperPasswordHandle());
- mContext.startActivity(intent);
- };
- LockPatternChecker.verifyCredential(lockPatternUtils, lockscreenCredential,
- userId, LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, onVerifyCallback);
- }
-
- private void launchFindSensorWithGkPwHandle() {
- LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext);
- final LockscreenCredential lockscreenCredential = LockscreenCredential.createPin(TEST_PIN);
- final int userId = UserHandle.myUserId();
- final LockPatternChecker.OnVerifyCallback onVerifyCallback = (response, timeoutMs) -> {
- final Intent intent = newActivityIntent(false);
- intent.putExtra(EXTRA_SKIP_INTRO, true);
- intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, response.getGatekeeperPasswordHandle());
- mContext.startActivity(intent);
- };
- LockPatternChecker.verifyCredential(lockPatternUtils, lockscreenCredential,
- userId, LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, onVerifyCallback);
- }
-
- private void launchEnrollingWithGkPwHandle() {
- LockPatternUtils lockPatternUtils = new LockPatternUtils(mContext);
- final LockscreenCredential lockscreenCredential = LockscreenCredential.createPin(TEST_PIN);
- final int userId = UserHandle.myUserId();
- final LockPatternChecker.OnVerifyCallback onVerifyCallback = (response, timeoutMs) -> {
- final Intent intent = newActivityIntent(false);
- intent.putExtra(EXTRA_SKIP_FIND_SENSOR, true);
- intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, response.getGatekeeperPasswordHandle());
- mContext.startActivity(intent);
- };
- LockPatternChecker.verifyCredential(lockPatternUtils, lockscreenCredential,
- userId, LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, onVerifyCallback);
- }
-
- @NonNull
- private Intent newActivityIntent(boolean isSuw) {
- Intent intent = new Intent();
- intent.setClassName(SETTINGS_PACKAGE_NAME,
- isSuw ? SUW_ACTIVITY_CLASS_NAME : ACTIVITY_CLASS_NAME);
- if (isSuw) {
- intent.putExtra(EXTRA_IS_SETUP_FLOW, true);
- }
- intent.putExtra(EXTRA_PAGE_TRANSITION_TYPE, 1);
- intent.putExtra(Intent.EXTRA_USER_ID, mContext.getUserId());
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
- return intent;
- }
-}
diff --git a/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.kt b/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.kt
new file mode 100644
index 0000000..49c5ac9
--- /dev/null
+++ b/tests/uitests/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivityTest.kt
@@ -0,0 +1,632 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.biometrics2.ui.view
+
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager.FEATURE_FINGERPRINT
+import android.hardware.fingerprint.FingerprintManager
+import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
+import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback
+import android.os.UserHandle
+import android.support.test.uiautomator.By
+import android.support.test.uiautomator.UiDevice
+import android.support.test.uiautomator.UiObject2
+import android.support.test.uiautomator.Until
+import android.util.Log
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.internal.widget.LockPatternChecker
+import com.android.internal.widget.LockPatternUtils
+import com.android.internal.widget.LockscreenCredential
+import com.android.internal.widget.VerifyCredentialResponse
+import com.android.settings.biometrics2.utils.LockScreenUtil
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Assume
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.io.IOException
+
+@RunWith(AndroidJUnit4::class)
+class FingerprintEnrollmentActivityTest {
+
+ private val context: Context by lazy {
+ InstrumentationRegistry.getInstrumentation().context
+ }
+
+ private val fingerprintManager: FingerprintManager by lazy {
+ context.getSystemService(FingerprintManager::class.java)!!
+ }
+
+ private var fingerprintPropCallbackLaunched = false
+ private var canAssumeUdfps = false
+ private var canAssumeSfps = false
+ private var enrollingPageTitle: String = ""
+
+ private val device: UiDevice by lazy {
+ UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+ }
+
+ @Before
+ @Throws(InterruptedException::class)
+ fun setUp() {
+ // Stop every test if it is not a fingerprint device
+ Assume.assumeTrue(context.packageManager.hasSystemFeature(FEATURE_FINGERPRINT))
+
+ fingerprintPropCallbackLaunched = false
+ fingerprintManager.addAuthenticatorsRegisteredCallback(
+ object : IFingerprintAuthenticatorsRegisteredCallback.Stub() {
+ override fun onAllAuthenticatorsRegistered(
+ list: List<FingerprintSensorPropertiesInternal>
+ ) {
+ fingerprintPropCallbackLaunched = true
+ assertThat(list).isNotNull()
+ assertThat(list).isNotEmpty()
+ val prop = list[0]
+ canAssumeUdfps = prop.isAnyUdfpsType
+ canAssumeSfps = prop.isAnySidefpsType
+ enrollingPageTitle = if (canAssumeUdfps) {
+ UDFPS_ENROLLING_TITLE
+ } else if (canAssumeSfps) {
+ SFPS_ENROLLING_TITLE
+ } else {
+ RFPS_ENROLLING_TITLE
+ }
+ }
+ })
+ var i: Long = 0
+ while (i < IDLE_TIMEOUT && !fingerprintPropCallbackLaunched) {
+ Thread.sleep(100L)
+ i += 100L
+ }
+ assertThat(fingerprintPropCallbackLaunched).isTrue()
+ device.pressHome()
+
+ // Stop settings before performing test
+ try {
+ device.executeShellCommand("am force-stop $SETTINGS_PACKAGE_NAME")
+ } catch (e: IOException) {
+ Log.e(TAG, "Fail to stop settings app", e)
+ }
+ }
+
+ @After
+ @Throws(Exception::class)
+ fun tearDown() {
+ LockScreenUtil.resetLockscreen(TEST_PIN)
+ device.pressHome()
+ }
+
+ @Test
+ fun testIntroChooseLock() {
+ val intent = newActivityIntent(false)
+ context.startActivity(intent)
+ assertThat(
+ device.wait(
+ Until.hasObject(By.text("Choose your backup screen lock method")),
+ IDLE_TIMEOUT
+ )
+ ).isTrue()
+ }
+
+ private fun verifyIntroPage() {
+ device.waitForIdle()
+ run {
+ var i: Long = 0
+ while (i < IDLE_TIMEOUT) {
+ if (device.wait(Until.hasObject(By.text("More")), 50L)) {
+ break
+ } else if (device.wait(Until.hasObject(By.text("I agree")), 50L)) {
+ break
+ }
+ i += 100L
+ }
+ }
+
+ // Click more btn at most twice and the introduction should stay in the last page
+ var moreBtn: UiObject2? = null
+ var i = 0
+ while (i < 2 && device.findObject(By.text("More")).also { moreBtn = it } != null) {
+ moreBtn!!.click()
+ device.waitForIdle()
+ device.wait(Until.hasObject(By.text("More")), IDLE_TIMEOUT)
+ ++i
+ }
+ assertThat(device.wait(Until.hasObject(By.text("No thanks")), IDLE_TIMEOUT)).isTrue()
+ assertThat(device.wait(Until.hasObject(By.text("I agree")), IDLE_TIMEOUT)).isTrue()
+ }
+
+ @Test
+ fun testIntroWithGkPwHandle_withUdfps_clickStart() {
+ Assume.assumeTrue(canAssumeUdfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchIntroWithGkPwHandle(false)
+
+ // Intro page
+ verifyIntroPage()
+ val agreeBtn = device.findObject(By.text("I agree"))
+ assertThat(agreeBtn).isNotNull()
+ agreeBtn.click()
+
+ // FindUdfps page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(
+ By.res(SETTINGS_PACKAGE_NAME, "illustration_lottie")
+ )
+ assertThat(lottie).isNotNull()
+ assertThat(lottie.isClickable).isTrue()
+ val startBtn = device.findObject(By.text("Start"))
+ assertThat(startBtn.isClickable).isTrue()
+ startBtn.click()
+
+ // Enrolling page
+ assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+ }
+
+ @Test
+ fun testIntroWithGkPwHandle_withUdfps_clickLottie() {
+ Assume.assumeTrue(canAssumeUdfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchIntroWithGkPwHandle(false)
+
+ // Intro page
+ verifyIntroPage()
+ val agreeBtn = device.findObject(By.text("I agree"))
+ assertThat(agreeBtn).isNotNull()
+ agreeBtn.click()
+
+ // FindUdfps page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(By.res(SETTINGS_PACKAGE_NAME, "illustration_lottie"))
+ assertThat(lottie).isNotNull()
+ assertThat(lottie.isClickable).isTrue()
+ val startBtn = device.findObject(By.text("Start"))
+ assertThat(startBtn.isClickable).isTrue()
+ lottie.click()
+
+ // Enrolling page
+ assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+ }
+
+ @Test
+ fun testIntroWithGkPwHandle_withSfps() {
+ Assume.assumeTrue(canAssumeSfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchIntroWithGkPwHandle(false)
+
+ // Intro page
+ verifyIntroPage()
+ val agreeBtn = device.findObject(By.text("I agree"))
+ assertThat(agreeBtn).isNotNull()
+ agreeBtn.click()
+
+ // FindSfps page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(
+ By.res(SETTINGS_PACKAGE_NAME,"illustration_lottie")
+ )
+ assertThat(lottie).isNotNull()
+
+ // We don't have view which can be clicked to run to next page, stop at here.
+ }
+
+ @Test
+ fun testIntroWithGkPwHandle_withRfps() {
+ Assume.assumeFalse(canAssumeUdfps || canAssumeSfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchIntroWithGkPwHandle(false)
+
+ // Intro page
+ verifyIntroPage()
+ val agreeBtn = device.findObject(By.text("I agree"))
+ assertThat(agreeBtn).isNotNull()
+ agreeBtn.click()
+
+ // FindRfps page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(
+ By.res(SETTINGS_PACKAGE_NAME, "illustration_lottie")
+ )
+ if (lottie == null) {
+ // FindSfps page shall have an animation view if no lottie view
+ assertThat(
+ device.findObject(
+ By.res(SETTINGS_PACKAGE_NAME, "fingerprint_sensor_location_animation")
+ )
+ ).isNotNull()
+ }
+ }
+
+ @Test
+ fun testIntroWithGkPwHandle_clickNoThanksInIntroPage() {
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchIntroWithGkPwHandle(false)
+
+ // Intro page
+ verifyIntroPage()
+ val noThanksBtn = device.findObject(By.text("No thanks"))
+ assertThat(noThanksBtn).isNotNull()
+ noThanksBtn.click()
+
+ // Back to home
+ device.waitForWindowUpdate(SETTINGS_PACKAGE_NAME, IDLE_TIMEOUT)
+ assertThat(device.findObject(By.text("No thanks"))).isNull()
+ }
+
+ @Test
+ fun testIntroWithGkPwHandle_clickSkipInFindSensor() {
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchIntroWithGkPwHandle(false)
+
+ // Intro page
+ verifyIntroPage()
+ val agreeBtn = device.findObject(By.text("I agree"))
+ assertThat(agreeBtn).isNotNull()
+ agreeBtn.click()
+
+ // FindSensor page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val doItLaterBtn = device.findObject(By.text(DO_IT_LATER))
+ assertThat(doItLaterBtn).isNotNull()
+ assertThat(doItLaterBtn.isClickable).isTrue()
+ doItLaterBtn.click()
+
+ // Back to home
+ device.waitForWindowUpdate(SETTINGS_PACKAGE_NAME, IDLE_TIMEOUT)
+ assertThat(device.findObject(By.text(DO_IT_LATER))).isNull()
+ }
+
+ @Test
+ fun testIntroWithGkPwHandle_clickSkipAnywayInFindFpsDialog_whenIsSuw() {
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchIntroWithGkPwHandle(true)
+
+ // Intro page
+ verifyIntroPage()
+ val agreeBtn = device.findObject(By.text("I agree"))
+ assertThat(agreeBtn).isNotNull()
+ agreeBtn.click()
+
+ // FindSensor page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val doItLaterBtn = device.findObject(By.text(DO_IT_LATER))
+ assertThat(doItLaterBtn).isNotNull()
+ assertThat(doItLaterBtn.isClickable).isTrue()
+ doItLaterBtn.click()
+
+ // SkipSetupFindFpsDialog
+ assertThat(device.wait(Until.hasObject(By.text("Skip fingerprint?")), IDLE_TIMEOUT)).isTrue()
+ val skipAnywayBtn = device.findObject(By.text("Skip anyway"))
+ assertThat(skipAnywayBtn).isNotNull()
+ assertThat(skipAnywayBtn.isClickable).isTrue()
+ skipAnywayBtn.click()
+
+ // Back to home
+ device.waitForWindowUpdate(SETTINGS_PACKAGE_NAME, IDLE_TIMEOUT)
+ assertThat(device.findObject(By.text("Skip anyway"))).isNull()
+ assertThat(device.findObject(By.text(DO_IT_LATER))).isNull()
+ }
+
+ @Test
+ fun testIntroWithGkPwHandle_clickGoBackInFindFpsDialog_whenIsSuw() {
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchIntroWithGkPwHandle(true)
+
+ // Intro page
+ verifyIntroPage()
+ val agreeBtn = device.findObject(By.text("I agree"))
+ assertThat(agreeBtn).isNotNull()
+ agreeBtn.click()
+
+ // FindSensor page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val doItLaterBtn = device.findObject(By.text(DO_IT_LATER))
+ assertThat(doItLaterBtn).isNotNull()
+ assertThat(doItLaterBtn.isClickable).isTrue()
+ doItLaterBtn.click()
+
+ // SkipSetupFindFpsDialog
+ assertThat(device.wait(Until.hasObject(By.text("Skip fingerprint?")), IDLE_TIMEOUT)).isTrue()
+ val goBackBtn = device.findObject(By.text("Go back"))
+ assertThat(goBackBtn).isNotNull()
+ assertThat(goBackBtn.isClickable).isTrue()
+ goBackBtn.click()
+
+ // FindSensor page again
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ }
+
+ @Test
+ fun testIntroCheckPin() {
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ val intent = newActivityIntent(false)
+ context.startActivity(intent)
+ assertThat(
+ device.wait(
+ Until.hasObject(By.text("Enter your device PIN to continue")),
+ IDLE_TIMEOUT
+ )
+ ).isTrue()
+ }
+
+ @Test
+ fun testEnrollingWithGkPwHandle() {
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchEnrollingWithGkPwHandle()
+
+ // Enrolling screen
+ device.waitForIdle()
+ assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+ }
+
+ @Test
+ fun testEnrollingIconTouchDialog_withSfps() {
+ Assume.assumeTrue(canAssumeSfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchEnrollingWithGkPwHandle()
+
+ // Enrolling screen
+ device.waitForIdle()
+ assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(
+ By.res(SETTINGS_PACKAGE_NAME, "illustration_lottie")
+ )
+ assertThat(lottie).isNotNull()
+ lottie.click()
+ lottie.click()
+ lottie.click()
+
+ // IconTouchDialog
+ device.waitForIdle()
+ assertThat(
+ device.wait(
+ Until.hasObject(By.text("Touch the sensor instead")),
+ IDLE_TIMEOUT
+ )
+ )
+ .isTrue()
+ val okButton = device.findObject(By.text("OK"))
+ assertThat(okButton).isNotNull()
+ okButton.click()
+
+ // Enrolling screen again
+ device.waitForIdle()
+ assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+ }
+
+ @Test
+ fun testEnrollingIconTouchDialog_withRfps() {
+ Assume.assumeFalse(canAssumeUdfps || canAssumeSfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchEnrollingWithGkPwHandle()
+
+ // Enrolling screen
+ device.waitForIdle()
+ assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(
+ By.res(SETTINGS_PACKAGE_NAME, "fingerprint_progress_bar")
+ )
+ assertThat(lottie).isNotNull()
+ lottie.click()
+ lottie.click()
+ lottie.click()
+
+ // IconTouchDialog
+ device.waitForIdle()
+ assertThat(
+ device.wait(
+ Until.hasObject(By.text("Whoops, that\u2019s not the sensor")),
+ IDLE_TIMEOUT
+ )
+ ).isTrue()
+ val okButton = device.findObject(By.text("OK"))
+ assertThat(okButton).isNotNull()
+ okButton.click()
+
+ // Enrolling screen again
+ device.waitForIdle()
+ assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+ }
+
+ @Test
+ fun testFindUdfpsWithGkPwHandle_clickStart() {
+ Assume.assumeTrue(canAssumeUdfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchFindSensorWithGkPwHandle()
+
+ // FindUdfps page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(
+ By.res(SETTINGS_PACKAGE_NAME, "illustration_lottie")
+ )
+ assertThat(lottie).isNotNull()
+ assertThat(lottie.isClickable).isTrue()
+ val startBtn = device.findObject(By.text("Start"))
+ assertThat(startBtn.isClickable).isTrue()
+ startBtn.click()
+
+ // Enrolling page
+ assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+ }
+
+ @Test
+ fun testFindUdfpsWithGkPwHandle_clickLottie() {
+ Assume.assumeTrue(canAssumeUdfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchFindSensorWithGkPwHandle()
+
+ // FindUdfps page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(
+ By.res(SETTINGS_PACKAGE_NAME, "illustration_lottie")
+ )
+ assertThat(lottie).isNotNull()
+ assertThat(lottie.isClickable).isTrue()
+ val startBtn = device.findObject(By.text("Start"))
+ assertThat(startBtn.isClickable).isTrue()
+ lottie.click()
+
+ // Enrolling page
+ assertThat(device.wait(Until.hasObject(By.text(enrollingPageTitle)), IDLE_TIMEOUT)).isTrue()
+ }
+
+ @Test
+ fun testFindSfpsWithGkPwHandle() {
+ Assume.assumeTrue(canAssumeSfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchFindSensorWithGkPwHandle()
+
+ // FindSfps page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(
+ By.res(SETTINGS_PACKAGE_NAME, "illustration_lottie")
+ )
+ assertThat(lottie).isNotNull()
+
+ // We don't have view which can be clicked to run to next page, stop at here.
+ }
+
+ @Test
+ fun testFindRfpsWithGkPwHandle() {
+ Assume.assumeFalse(canAssumeUdfps || canAssumeSfps)
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchFindSensorWithGkPwHandle()
+
+ // FindRfps page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val lottie = device.findObject(
+ By.res(
+ SETTINGS_PACKAGE_NAME,
+ "illustration_lottie"
+ )
+ )
+ if (lottie == null) {
+ // FindSfps page shall have an animation view if no lottie view
+ assertThat(
+ device.findObject(
+ By.res(
+ SETTINGS_PACKAGE_NAME,
+ "fingerprint_sensor_location_animation"
+ )
+ )
+ ).isNotNull()
+ }
+ }
+
+ @Test
+ fun testFindSensorWithGkPwHandle_clickSkipInFindSensor() {
+ LockScreenUtil.setLockscreen(LockScreenUtil.LockscreenType.PIN, TEST_PIN, true)
+ launchFindSensorWithGkPwHandle()
+
+ // FindSensor page
+ assertThat(device.wait(Until.hasObject(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ val doItLaterBtn = device.findObject(By.text(DO_IT_LATER))
+ assertThat(doItLaterBtn).isNotNull()
+ assertThat(doItLaterBtn.isClickable).isTrue()
+ doItLaterBtn.click()
+
+ // Back to home
+ device.waitForWindowUpdate(SETTINGS_PACKAGE_NAME, IDLE_TIMEOUT)
+ assertThat(device.wait(Until.gone(By.text(DO_IT_LATER)), IDLE_TIMEOUT)).isTrue()
+ }
+
+ private fun launchIntroWithGkPwHandle(isSuw: Boolean) {
+ val lockPatternUtils = LockPatternUtils(context)
+ val lockscreenCredential = LockscreenCredential.createPin(TEST_PIN)
+ val userId = UserHandle.myUserId()
+ val onVerifyCallback =
+ LockPatternChecker.OnVerifyCallback { response: VerifyCredentialResponse, _: Int ->
+ val intent = newActivityIntent(isSuw)
+ intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, response.gatekeeperPasswordHandle)
+ context.startActivity(intent)
+ }
+ LockPatternChecker.verifyCredential(
+ lockPatternUtils, lockscreenCredential,
+ userId, LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, onVerifyCallback
+ )
+ }
+
+ private fun launchFindSensorWithGkPwHandle() {
+ val lockPatternUtils = LockPatternUtils(context)
+ val lockscreenCredential = LockscreenCredential.createPin(TEST_PIN)
+ val userId = UserHandle.myUserId()
+ val onVerifyCallback =
+ LockPatternChecker.OnVerifyCallback { response: VerifyCredentialResponse, _: Int ->
+ val intent = newActivityIntent(false)
+ intent.putExtra(EXTRA_SKIP_INTRO, true)
+ intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, response.gatekeeperPasswordHandle)
+ context.startActivity(intent)
+ }
+ LockPatternChecker.verifyCredential(
+ lockPatternUtils, lockscreenCredential,
+ userId, LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, onVerifyCallback
+ )
+ }
+
+ private fun launchEnrollingWithGkPwHandle() {
+ val lockPatternUtils = LockPatternUtils(context)
+ val lockscreenCredential = LockscreenCredential.createPin(TEST_PIN)
+ val userId = UserHandle.myUserId()
+ val onVerifyCallback =
+ LockPatternChecker.OnVerifyCallback { response: VerifyCredentialResponse, _: Int ->
+ val intent = newActivityIntent(false)
+ intent.putExtra(EXTRA_SKIP_FIND_SENSOR, true)
+ intent.putExtra(EXTRA_KEY_GK_PW_HANDLE, response.gatekeeperPasswordHandle)
+ context.startActivity(intent)
+ }
+ LockPatternChecker.verifyCredential(
+ lockPatternUtils, lockscreenCredential,
+ userId, LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, onVerifyCallback
+ )
+ }
+
+ private fun newActivityIntent(isSuw: Boolean): Intent {
+ val intent = Intent()
+ intent.setClassName(
+ SETTINGS_PACKAGE_NAME,
+ if (isSuw) SUW_ACTIVITY_CLASS_NAME else ACTIVITY_CLASS_NAME
+ )
+ if (isSuw) {
+ intent.putExtra(EXTRA_IS_SETUP_FLOW, true)
+ }
+ intent.putExtra(EXTRA_PAGE_TRANSITION_TYPE, 1)
+ intent.putExtra(Intent.EXTRA_USER_ID, context.userId)
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
+ return intent
+ }
+
+ companion object {
+ private const val TAG = "FingerprintEnrollmentActivityTest"
+ const val SETTINGS_PACKAGE_NAME = "com.android.settings"
+ private const val ACTIVITY_CLASS_NAME =
+ "com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity"
+ private const val SUW_ACTIVITY_CLASS_NAME = "$ACTIVITY_CLASS_NAME\$SetupActivity"
+ private const val EXTRA_IS_SETUP_FLOW = "isSetupFlow"
+ private const val EXTRA_SKIP_INTRO = "skip_intro"
+ private const val EXTRA_SKIP_FIND_SENSOR = "skip_find_sensor"
+ private const val EXTRA_PAGE_TRANSITION_TYPE = "page_transition_type"
+ private const val EXTRA_KEY_GK_PW_HANDLE = "gk_pw_handle"
+ private const val TEST_PIN = "1234"
+ private const val DO_IT_LATER = "Do it later"
+ private const val UDFPS_ENROLLING_TITLE = "Touch & hold the fingerprint sensor"
+ private const val SFPS_ENROLLING_TITLE =
+ "Lift, then touch. Move your finger slightly each time."
+ private const val RFPS_ENROLLING_TITLE = "Lift, then touch again"
+ private const val IDLE_TIMEOUT = 10000L
+ }
+}