diff --git a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java index af06a0144b9..0446c209fc6 100644 --- a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java +++ b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java @@ -43,18 +43,18 @@ public final class CombinedProviderInfo { private final List mCredentialProviderInfos; private final @Nullable AutofillServiceInfo mAutofillServiceInfo; private final boolean mIsDefaultAutofillProvider; - private final boolean mIsDefaultCredmanProvider; + private final boolean mIsPrimaryCredmanProvider; /** Constructs an information instance from both autofill and credential provider. */ public CombinedProviderInfo( @Nullable List cpis, @Nullable AutofillServiceInfo asi, boolean isDefaultAutofillProvider, - boolean isDefaultCredmanProvider) { + boolean IsPrimaryCredmanProvider) { mCredentialProviderInfos = new ArrayList<>(cpis); mAutofillServiceInfo = asi; mIsDefaultAutofillProvider = isDefaultAutofillProvider; - mIsDefaultCredmanProvider = isDefaultCredmanProvider; + mIsPrimaryCredmanProvider = IsPrimaryCredmanProvider; } /** Returns the credential provider info. */ @@ -149,8 +149,8 @@ public final class CombinedProviderInfo { } /** Returns whether the provider is the default credman provider. */ - public boolean isDefaultCredmanProvider() { - return mIsDefaultCredmanProvider; + public boolean isPrimaryCredmanProvider() { + return mIsPrimaryCredmanProvider; } /** Returns the settings subtitle. */ @@ -192,7 +192,13 @@ public final class CombinedProviderInfo { } } - // TODO(280454916): Add logic here. + // If there is a primary cred man provider then return that. + for (CombinedProviderInfo cpi : providers) { + if (cpi.isPrimaryCredmanProvider()) { + return cpi; + } + } + return null; } @@ -250,14 +256,14 @@ public final class CombinedProviderInfo { } // Check if we have any enabled cred man services. - boolean isDefaultCredmanProvider = false; + boolean isPrimaryCredmanProvider = false; if (!cpi.isEmpty()) { - isDefaultCredmanProvider = cpi.get(0).isEnabled(); + isPrimaryCredmanProvider = cpi.get(0).isPrimary(); } cmpi.add( new CombinedProviderInfo( - cpi, selectedAsi, isDefaultAutofillProvider, isDefaultCredmanProvider)); + cpi, selectedAsi, isDefaultAutofillProvider, isPrimaryCredmanProvider)); } return cmpi; diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java index 00dadc058d9..bd7c485743d 100644 --- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java +++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java @@ -321,7 +321,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl mEnabledPackageNames.clear(); for (CredentialProviderInfo cpi : availableServices) { - if (cpi.isEnabled()) { + if (cpi.isEnabled() && !cpi.isPrimary()) { mEnabledPackageNames.add(cpi.getServiceInfo().packageName); } } @@ -560,16 +560,25 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl return; } - List enabledServices = getEnabledSettings(); + // Get the existing primary providers since we don't touch them in + // this part of the UI we should just copy them over. + Set primaryServices = new HashSet<>(); + for (CredentialProviderInfo service : mServices) { + if (service.isPrimary()) { + primaryServices.add(service.getServiceInfo().getComponentName().flattenToString()); + } + } + mCredentialManager.setEnabledProviders( - new ArrayList(), // TODO(240466271): pass down primary providers - enabledServices, + new ArrayList<>(primaryServices), + getEnabledSettings(), getUser(), mExecutor, new OutcomeReceiver() { @Override public void onResult(Void result) { Log.i(TAG, "setEnabledProviders success"); + updateFromExternal(); } @Override diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java index 2ee4f47df4f..793aa3c1cbe 100644 --- a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java +++ b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java @@ -47,7 +47,9 @@ import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.widget.CandidateInfo; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class DefaultCombinedPicker extends DefaultAppPickerFragment { @@ -338,9 +340,9 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment { return true; } - private void setProviders(String autofillProvider, List credManProviders) { + private void setProviders(String autofillProvider, List primaryCredManProviders) { if (TextUtils.isEmpty(autofillProvider)) { - if (credManProviders.size() > 0) { + if (primaryCredManProviders.size() > 0) { autofillProvider = CredentialManagerPreferenceController .AUTOFILL_CREDMAN_ONLY_PROVIDER_PLACEHOLDER; @@ -350,13 +352,25 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment { Settings.Secure.putStringForUser( getContext().getContentResolver(), AUTOFILL_SETTING, autofillProvider, mUserId); - CredentialManager service = getCredentialProviderService(); + final CredentialManager service = getCredentialProviderService(); if (service == null) { return; } + // Get the existing secondary providers since we don't touch them in + // this part of the UI we should just copy them over. + final List credManProviders = new ArrayList<>(); + for (CredentialProviderInfo cpi : + service.getCredentialProviderServices( + mUserId, CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)) { + + if (cpi.isEnabled()) { + credManProviders.add(cpi.getServiceInfo().getComponentName().flattenToString()); + } + } + service.setEnabledProviders( - new ArrayList(), // TODO(240466271): pass down primary providers. + primaryCredManProviders, credManProviders, mUserId, ContextCompat.getMainExecutor(getContext()), diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java index ca049bcdd48..64d4f0dd5ed 100644 --- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java +++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java @@ -135,12 +135,12 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon /** Provides Intent to setting activity for the specified autofill service. */ static final class AutofillSettingIntentProvider { - private final String mSelectedKey; + private final String mKey; private final Context mContext; private final int mUserId; public AutofillSettingIntentProvider(Context context, int userId, String key) { - mSelectedKey = key; + mKey = key; mContext = context; mUserId = userId; } @@ -153,10 +153,9 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon for (ResolveInfo resolveInfo : resolveInfos) { final ServiceInfo serviceInfo = resolveInfo.serviceInfo; - final String flattenKey = - new ComponentName(serviceInfo.packageName, serviceInfo.name) - .flattenToString(); - if (TextUtils.equals(mSelectedKey, flattenKey)) { + + // If there are multiple autofill services then pick the first one. + if (mKey.startsWith(serviceInfo.packageName)) { final String settingsActivity; try { settingsActivity = @@ -164,7 +163,7 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon .getSettingsActivity(); } catch (SecurityException e) { // Service does not declare the proper permission, ignore it. - Log.w(TAG, "Error getting info for " + serviceInfo + ": " + e); + Log.e(TAG, "Error getting info for " + serviceInfo + ": " + e); return null; } if (TextUtils.isEmpty(settingsActivity)) {