From 35df60f316555cf3bb28195c774cb41e7776a07b Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Fri, 30 Jul 2021 23:47:04 +0800 Subject: [PATCH 1/2] [Settings] eSIM existance detection rule change 1. eSIM retrieved from SubscriptionManager#getAvailableSubscriptionInfoList() should be considered as existed all the time. 2. When SIM are both inactive(or active), sorted the ordering based on ordering provided by telephony framework. Bug: 195090132 Bug: 195091953 Bug: 194197762 Test: local Change-Id: I2fe43a35e5b7965bde3b579e2297e9cdd89ec228 (cherry picked from commit 848d097b94c0adb73d88db14e46e5f103fe8b9d1) (cherry picked from commit 824deb0ee3727f23ab68a75176825c4c73f482a9) --- .../settings/network/helper/SubscriptionAnnotation.java | 3 +-- .../settings/network/helper/SubscriptionGrouping.java | 8 ++++++-- .../settings/network/helper/SubscriptionGroupingTest.java | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/network/helper/SubscriptionAnnotation.java b/src/com/android/settings/network/helper/SubscriptionAnnotation.java index 29d4fb5b900..79fbf68b6d9 100644 --- a/src/com/android/settings/network/helper/SubscriptionAnnotation.java +++ b/src/com/android/settings/network/helper/SubscriptionAnnotation.java @@ -90,16 +90,15 @@ public class SubscriptionAnnotation { mOrderWithinList = subInfoIndex; mType = mSubInfo.isEmbedded() ? TYPE_ESIM : TYPE_PSIM; + mIsExisted = true; if (mType == TYPE_ESIM) { int cardId = mSubInfo.getCardId(); - mIsExisted = eSimCardId.contains(cardId); mIsActive = activeSimSlotIndexList.contains(mSubInfo.getSimSlotIndex()); mIsAllowToDisplay = (cardId < 0) // always allow when eSIM not in slot || isDisplayAllowed(context); return; } - mIsExisted = true; mIsActive = (mSubInfo.getSimSlotIndex() > SubscriptionManager.INVALID_SIM_SLOT_INDEX) && activeSimSlotIndexList.contains(mSubInfo.getSimSlotIndex()); mIsAllowToDisplay = isDisplayAllowed(context); diff --git a/src/com/android/settings/network/helper/SubscriptionGrouping.java b/src/com/android/settings/network/helper/SubscriptionGrouping.java index cfb5ea92650..c4e0fd71bb8 100644 --- a/src/com/android/settings/network/helper/SubscriptionGrouping.java +++ b/src/com/android/settings/network/helper/SubscriptionGrouping.java @@ -16,6 +16,7 @@ package com.android.settings.network.helper; import android.os.ParcelUuid; +import android.util.Log; import androidx.annotation.Keep; import androidx.annotation.VisibleForTesting; @@ -44,9 +45,12 @@ import java.util.stream.Collectors; */ public class SubscriptionGrouping implements UnaryOperator> { + private static final String LOG_TAG = "SubscriptionGrouping"; // implementation of UnaryOperator public List apply(List listOfSubscriptions) { + Log.d(LOG_TAG, "Grouping " + listOfSubscriptions); + // group by GUID Map> groupedSubInfoList = listOfSubscriptions.stream() @@ -89,8 +93,8 @@ public class SubscriptionGrouping annoSelector = annoSelector // eSIM in front of pSIM .thenComparingInt(anno -> -anno.getType()) - // subscription ID in reverse order - .thenComparingInt(anno -> -anno.getSubscriptionId()); + // maintain the ordering given within constructor + .thenComparingInt(anno -> annoList.indexOf(anno)); return annoList.stream().sorted(annoSelector).findFirst().orElse(null); } } diff --git a/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java b/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java index 97bdb7433a7..bea720939a3 100644 --- a/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java +++ b/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java @@ -68,7 +68,7 @@ public class SubscriptionGroupingTest { List result = mTarget .apply(Arrays.asList(subAnno2, subAnno1, subAnno3)); assertThat(result.size()).isEqualTo(1); - assertThat(result.get(0)).isEqualTo(subAnno3); + assertThat(result.get(0)).isEqualTo(subAnno1); } @Test From c11e01f39d5d853453c57274b20470babfbc6611 Mon Sep 17 00:00:00 2001 From: Joe Bolinger 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(); + } +}