diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java index b3a950511d7..44a874bd8d3 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java +++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java @@ -284,7 +284,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { launchCredentialOnlyEnroll(); finish(); } else if (canUseFace && canUseFingerprint) { - if (mParentalOptionsRequired && mGkPwHandle != null) { + if (mGkPwHandle != null) { launchFaceAndFingerprintEnroll(); } else { setOrConfirmCredentialsNow(); diff --git a/tests/componenttests/Android.bp b/tests/componenttests/Android.bp index 7d9c4b26c5f..77ee1648d01 100644 --- a/tests/componenttests/Android.bp +++ b/tests/componenttests/Android.bp @@ -21,6 +21,8 @@ android_test { static_libs: [ "truth-prebuilt", "androidx.test.core", + "androidx.test.espresso.core", + "androidx.test.espresso.intents-nodeps", "androidx.test.runner", "androidx.test.rules", "androidx.test.ext.junit", diff --git a/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java new file mode 100644 index 00000000000..0ef57a0b676 --- /dev/null +++ b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2021 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.biometrics; + +import static android.provider.Settings.ACTION_BIOMETRIC_ENROLL; + +import static androidx.test.espresso.intent.Intents.intended; +import static androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent; + +import static com.google.common.truth.Truth.assertThat; + +import static org.junit.Assume.assumeTrue; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.UserHandle; + +import androidx.test.core.app.ActivityScenario; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.espresso.intent.Intents; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.MediumTest; + +import com.android.internal.widget.LockPatternChecker; +import com.android.internal.widget.LockPatternUtils; +import com.android.internal.widget.LockscreenCredential; +import com.android.settings.biometrics.face.FaceEnrollIntroduction; +import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction; +import com.android.settings.password.ChooseLockGeneric; +import com.android.settings.password.ChooseLockSettingsHelper; +import com.android.settings.password.ConfirmLockPassword; +import com.android.settings.testutils.AdbUtils; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@MediumTest +public class BiometricEnrollActivityTest { + + private static final String TAG = "BiometricEnrollActivityTest"; + private static final int ADB_TIMEOUT_MS = 5000; + private static final String TEST_PIN = "1234"; + + private final Context mContext = ApplicationProvider.getApplicationContext(); + private boolean mHasFace; + private boolean mHasFingerprint; + + @Before + public void setup() { + Intents.init(); + final PackageManager pm = mContext.getPackageManager(); + mHasFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT); + mHasFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE); + } + + @After + public void teardown() throws Exception { + Intents.release(); + AdbUtils.checkStringInAdbCommandOutput(TAG, "locksettings clear --old " + TEST_PIN, + "", "", ADB_TIMEOUT_MS); + } + + @Test + public void launchWithoutPin_setsPin() { + try (ActivityScenario scenario = + ActivityScenario.launch(getIntent())) { + intended(hasComponent(ChooseLockGeneric.class.getName())); + } + } + + @Test + public void launchWithPin_confirmsPin() throws Exception { + setPin(); + try (ActivityScenario scenario = + ActivityScenario.launch(getIntent())) { + intended(hasComponent(ConfirmLockPassword.InternalActivity.class.getName())); + } + } + + @Test + public void launchWithPinAndPwHandle_confirmsPin() throws Exception { + assumeTrue(mHasFace || mHasFingerprint); + + setPin(); + final Intent intent = getIntent(true /* useInternal */); + LockPatternChecker.verifyCredential(new LockPatternUtils(mContext), + LockscreenCredential.createPin(TEST_PIN), UserHandle.myUserId(), + LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, (response, timeoutMs) -> { + assertThat(response.containsGatekeeperPasswordHandle()).isTrue(); + intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, + response.getGatekeeperPasswordHandle()); + }).get(); + + + + try (ActivityScenario scenario = + ActivityScenario.launch(intent)) { + intended(hasComponent(mHasFace + ? FaceEnrollIntroduction.class.getName() + : FingerprintEnrollIntroduction.class.getName())); + } + } + + private Intent getIntent() { + return getIntent(false /* useInternal */); + } + + private Intent getIntent(boolean useInternal) { + final Intent intent = new Intent(mContext, useInternal + ? BiometricEnrollActivity.InternalActivity.class : BiometricEnrollActivity.class); + intent.setAction(ACTION_BIOMETRIC_ENROLL); + return intent; + } + + private static void setPin() throws Exception { + assertThat(AdbUtils.checkStringInAdbCommandOutput(TAG, "locksettings set-pin " + TEST_PIN, + "Pin set to ", "'" + TEST_PIN + "'", ADB_TIMEOUT_MS)).isTrue(); + } +}