From fa1e3870d855afd083be319008d1eb59593f3f51 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Tue, 6 Jul 2021 11:30:17 +0800 Subject: [PATCH 1/2] Add comment to AndroidManifest - Wi-Fi result data will only be returned from WifiDialogActivity if the calling package has location permission. Test: add comment only, no test required. Bug: 185126813 Merged-In: I81c4d801c4ee211f43a1688a62daaff3b47eae1a Change-Id: I81c4d801c4ee211f43a1688a62daaff3b47eae1a (cherry picked from commit 56a88885ccc383269f02a49fff6bb503ed35c9d8) --- AndroidManifest.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2f53cc1e7c8..f7ca87c608a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2708,6 +2708,10 @@ + Date: Wed, 4 Aug 2021 17:19:20 -0700 Subject: [PATCH 2/2] Fix extra password confirm prompts during managed setup. Managed accounts may set the pin/pattern before enrollment begins. Fix: 191608999 Test: atest BiometricEnrollActivityTest Change-Id: I4065989ecc26ce72ffd0e06e7c6e68029a11908f --- .../biometrics/BiometricEnrollActivity.java | 2 +- tests/componenttests/Android.bp | 2 + .../BiometricEnrollActivityTest.java | 137 ++++++++++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java 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(); + } +}