From 7379aee081bede5b955fa776e3d0df0d1925d783 Mon Sep 17 00:00:00 2001 From: MiltonWu Date: Fri, 7 Mar 2025 15:19:52 +0800 Subject: [PATCH] Add context to FingerprintExtPreferencesProvider Bug: 405274627 Test: atest FingerprintSettingsFragmentTest Flag: EXEMPT interface changed Change-Id: I66527bab885555df1dcab087862e5b1a96593ef5 --- .../FingerprintFeatureProvider.java | 2 +- .../fingerprint/FingerprintSettings.java | 25 +++++++++--- .../FingerprintExtPreferencesProvider.kt | 3 +- .../FingerprintSettingsFragmentTest.java | 40 +++++++++++++++++++ 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java b/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java index a029c2c4d85..7e828e08b3e 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java @@ -73,7 +73,7 @@ public interface FingerprintFeatureProvider { default FingerprintExtPreferencesProvider getExtPreferenceProvider( @NonNull Context context ) { - return new FingerprintExtPreferencesProvider(); + return new FingerprintExtPreferencesProvider(context); } /** diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 283e3420607..c4e9640c38e 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -468,12 +468,10 @@ public class FingerprintSettings extends SubSettings { * Add new preferences from FingerprintExtPreferencesProvider */ public void setupExtFingerprintPreferences() { - final FingerprintExtPreferencesProvider preferencesProvider = - FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider() - .getExtPreferenceProvider(requireContext()); + FingerprintExtPreferencesProvider preferencesProvider = getExtPreferenceProvider(); for (int index = 0; index < preferencesProvider.getSize(); ++index) { final RestrictedPreference preference = preferencesProvider.newPreference( - index, this::inflateFromResource, requireContext()); + index, this::inflateFromResource); if (preference == null || findPreference(preference.getKey()) != null) { continue; } @@ -485,6 +483,12 @@ public class FingerprintSettings extends SubSettings { } } + @NonNull + private FingerprintExtPreferencesProvider getExtPreferenceProvider() { + return FeatureFactory.getFeatureFactory().getFingerprintFeatureProvider() + .getExtPreferenceProvider(requireContext()); + } + /** * */ @@ -748,7 +752,8 @@ public class FingerprintSettings extends SubSettings { // This needs to be after setting ids, otherwise // |mRequireScreenOnToAuthPreferenceController.isChecked| is always checking the primary // user instead of the user with |mUserId|. - if (isSfps() || (screenOffUnlockUdfps() && isScreenOffUnlcokSupported())) { + if (isSfps() || (screenOffUnlockUdfps() && isScreenOffUnlcokSupported()) + || getExtPreferenceProvider().getSize() > 0) { scrollToPreference(fpPrefKey); addFingerprintUnlockCategory(); } @@ -1266,6 +1271,16 @@ public class FingerprintSettings extends SubSettings { } } + + if (mFingerprintUnlockCategoryPreferenceController == null + && getExtPreferenceProvider().getSize() > 0 && controllers != null) { + for (AbstractPreferenceController controller : controllers) { + if (KEY_FINGERPRINT_UNLOCK_CATEGORY.equals(controller.getPreferenceKey())) { + mFingerprintUnlockCategoryPreferenceController = + (FingerprintUnlockCategoryController) controller; + } + } + } return controllers; } diff --git a/src/com/android/settings/biometrics/fingerprint/feature/FingerprintExtPreferencesProvider.kt b/src/com/android/settings/biometrics/fingerprint/feature/FingerprintExtPreferencesProvider.kt index 1e3b38c3f5e..c88e1669950 100644 --- a/src/com/android/settings/biometrics/fingerprint/feature/FingerprintExtPreferencesProvider.kt +++ b/src/com/android/settings/biometrics/fingerprint/feature/FingerprintExtPreferencesProvider.kt @@ -27,14 +27,13 @@ import com.android.settingslib.RestrictedPreference * * @see com.android.settings.biometrics.fingerprint.FingerprintSettings */ -open class FingerprintExtPreferencesProvider { +open class FingerprintExtPreferencesProvider(protected val context: Context) { open val size: Int = 0 open fun newPreference( index: Int, inflater: PreferenceInflater, - context: Context ): RestrictedPreference? = null interface PreferenceInflater { diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java index 47ba523c7b2..495d5ec7a3a 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java @@ -70,6 +70,7 @@ import androidx.fragment.app.FragmentTransaction; import androidx.preference.Preference; import androidx.test.core.app.ApplicationProvider; +import com.android.settings.biometrics.fingerprint.feature.FingerprintExtPreferencesProvider; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ConfirmDeviceCredentialActivity; import com.android.settings.search.BaseSearchIndexProvider; @@ -79,6 +80,7 @@ import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import com.android.settings.testutils.shadow.ShadowSettingsPreferenceFragment; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.testutils.shadow.ShadowUtils; +import com.android.settingslib.RestrictedPreference; import com.android.settingslib.RestrictedSwitchPreference; import org.junit.After; @@ -123,6 +125,12 @@ public class FingerprintSettingsFragmentTest { private PackageManager mPackageManager; @Mock private BiometricManager mBiometricManager; + @Mock + private FingerprintExtPreferencesProvider mExtPreferencesProvider; + @Mock + private RestrictedPreference mRestrictedPreference0; + @Mock + private RestrictedPreference mRestrictedPreference1; @Captor private ArgumentCaptor mCancellationSignalArgumentCaptor = @@ -159,6 +167,11 @@ public class FingerprintSettingsFragmentTest { when(mFakeFeatureFactory.getFingerprintFeatureProvider() .getFingerprintSettingsFeatureProvider()) .thenReturn(mFingerprintSettingsFeatureProvider); + + when(mFakeFeatureFactory.getFingerprintFeatureProvider() + .getExtPreferenceProvider(mContext)) + .thenReturn(mExtPreferencesProvider); + when(mExtPreferencesProvider.getSize()).thenReturn(0); } @After @@ -417,6 +430,33 @@ public class FingerprintSettingsFragmentTest { assertThat(checkEnrolledPerf).isNull(); } + @Test + public void testHasExtPreferences() { + String key0 = "ExtKey0"; + String key1 = "ExtKey1"; + when(mRestrictedPreference0.getKey()).thenReturn(key0); + when(mRestrictedPreference1.getKey()).thenReturn(key1); + when(mExtPreferencesProvider.getSize()).thenReturn(2); + when(mExtPreferencesProvider.newPreference(eq(0), + any(FingerprintExtPreferencesProvider.PreferenceInflater.class))) + .thenReturn(mRestrictedPreference0); + when(mExtPreferencesProvider.newPreference(eq(1), + any(FingerprintExtPreferencesProvider.PreferenceInflater.class))) + .thenReturn(mRestrictedPreference1); + + Fingerprint fingerprint = new Fingerprint("Test", 0, 0); + doReturn(List.of(fingerprint)).when(mFingerprintManager).getEnrolledFingerprints(anyInt()); + setUpFragment(false, PRIMARY_USER_ID, TYPE_UDFPS_OPTICAL, 5); + + shadowOf(Looper.getMainLooper()).idle(); + + Preference preference0 = mFragment.findPreference(key0); + assertThat(preference0).isEqualTo(mRestrictedPreference0); + + Preference preference1 = mFragment.findPreference(key1); + assertThat(preference1).isEqualTo(mRestrictedPreference1); + } + private void setSensor(@FingerprintSensorProperties.SensorType int sensorType, int maxFingerprints) { final ArrayList props = new ArrayList<>();