From 02ca65edaaefd4ed52bd34c1a3f75439527ef7fc Mon Sep 17 00:00:00 2001 From: Becca Hughes Date: Fri, 21 Apr 2023 20:10:03 +0000 Subject: [PATCH] Hide provider from this list if autofill provider Since we are merging the two lists we should hide the provider from this list to avoid duplicates. Test: local & unit Bug: 279205251 Change-Id: I70ec4a4bda13bdcd5fd8f82f6ba6045e94d5daa9 --- ...CredentialManagerPreferenceController.java | 32 +++++++++++++++++++ ...entialManagerPreferenceControllerTest.java | 19 +++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java index 395f900f72b..0a8c2c3e3c4 100644 --- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java +++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java @@ -340,6 +340,21 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl @VisibleForTesting public Map buildPreferenceList( Context context, PreferenceGroup group) { + // Group the services by package name. + Map> groupedInfos = new HashMap<>(); + for (CredentialProviderInfo cpi : mServices) { + String packageName = cpi.getServiceInfo().packageName; + if (isProviderHiddenBecauseOfAutofill(packageName)) { + continue; + } + + if (!groupedInfos.containsKey(packageName)) { + groupedInfos.put(packageName, new ArrayList<>()); + } + + groupedInfos.get(packageName).add(cpi); + } + // Build the pref list. Map output = new HashMap<>(); for (CredentialProviderInfo service : mServices) { @@ -519,6 +534,23 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl return new NewProviderConfirmationDialogFragment(host, service, appName); } + /** If the provider is also the autofill provider then hide it. */ + @VisibleForTesting + public boolean isProviderHiddenBecauseOfAutofill(String packageName) { + final String autofillService = Settings.Secure.getStringForUser( + mContext.getContentResolver(), + Settings.Secure.AUTOFILL_SERVICE, + getUser()); + if (autofillService == null || TextUtils.isEmpty(autofillService)) { + return false; + } + if (packageName == null || TextUtils.isEmpty(packageName)) { + return false; + } + + return autofillService.startsWith(packageName); + } + @VisibleForTesting void completeEnableProviderDialogBox(int whichButton, ServiceInfo service, boolean setActivityResult) { int activityResult = -1; diff --git a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java index 5d0da6a2199..dd928108c3f 100644 --- a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java @@ -120,6 +120,25 @@ public class CredentialManagerPreferenceControllerTest { assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE); } + @Test + public void verifyHiddenIfAutofillSelectedProvider() { + CredentialManagerPreferenceController controller = + createControllerWithServices(Collections.emptyList()); + + // Set the autofill provider. + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.AUTOFILL_SERVICE, "com.example.test/AutofillClass", + UserHandle.myUserId()); + + // Verify the error cases + assertThat(controller.isProviderHiddenBecauseOfAutofill(null)).isFalse(); + assertThat(controller.isProviderHiddenBecauseOfAutofill("")).isFalse(); + assertThat(controller.isProviderHiddenBecauseOfAutofill("test")).isFalse(); + + // Verify the example. + assertThat(controller.isProviderHiddenBecauseOfAutofill("com.example.test")).isTrue(); + } + @Test public void displayPreference_noServices_noPreferencesAdded_useAutofillUri() { Settings.Secure.putStringForUser(