Use isPrimary bit to determine top provider

If the cred man provider has the isPrimary
bit set then we should use it as top
provider.

Test: ondevice
Bug: 280454916
Change-Id: I8c5651909d3926f09549c64af68185f1ef633198
This commit is contained in:
Becca Hughes
2023-05-03 19:28:40 +00:00
parent 69fcc2ba5c
commit 3096997718
4 changed files with 52 additions and 24 deletions

View File

@@ -43,18 +43,18 @@ public final class CombinedProviderInfo {
private final List<CredentialProviderInfo> mCredentialProviderInfos; private final List<CredentialProviderInfo> mCredentialProviderInfos;
private final @Nullable AutofillServiceInfo mAutofillServiceInfo; private final @Nullable AutofillServiceInfo mAutofillServiceInfo;
private final boolean mIsDefaultAutofillProvider; private final boolean mIsDefaultAutofillProvider;
private final boolean mIsDefaultCredmanProvider; private final boolean mIsPrimaryCredmanProvider;
/** Constructs an information instance from both autofill and credential provider. */ /** Constructs an information instance from both autofill and credential provider. */
public CombinedProviderInfo( public CombinedProviderInfo(
@Nullable List<CredentialProviderInfo> cpis, @Nullable List<CredentialProviderInfo> cpis,
@Nullable AutofillServiceInfo asi, @Nullable AutofillServiceInfo asi,
boolean isDefaultAutofillProvider, boolean isDefaultAutofillProvider,
boolean isDefaultCredmanProvider) { boolean IsPrimaryCredmanProvider) {
mCredentialProviderInfos = new ArrayList<>(cpis); mCredentialProviderInfos = new ArrayList<>(cpis);
mAutofillServiceInfo = asi; mAutofillServiceInfo = asi;
mIsDefaultAutofillProvider = isDefaultAutofillProvider; mIsDefaultAutofillProvider = isDefaultAutofillProvider;
mIsDefaultCredmanProvider = isDefaultCredmanProvider; mIsPrimaryCredmanProvider = IsPrimaryCredmanProvider;
} }
/** Returns the credential provider info. */ /** Returns the credential provider info. */
@@ -149,8 +149,8 @@ public final class CombinedProviderInfo {
} }
/** Returns whether the provider is the default credman provider. */ /** Returns whether the provider is the default credman provider. */
public boolean isDefaultCredmanProvider() { public boolean isPrimaryCredmanProvider() {
return mIsDefaultCredmanProvider; return mIsPrimaryCredmanProvider;
} }
/** Returns the settings subtitle. */ /** 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; return null;
} }
@@ -250,14 +256,14 @@ public final class CombinedProviderInfo {
} }
// Check if we have any enabled cred man services. // Check if we have any enabled cred man services.
boolean isDefaultCredmanProvider = false; boolean isPrimaryCredmanProvider = false;
if (!cpi.isEmpty()) { if (!cpi.isEmpty()) {
isDefaultCredmanProvider = cpi.get(0).isEnabled(); isPrimaryCredmanProvider = cpi.get(0).isPrimary();
} }
cmpi.add( cmpi.add(
new CombinedProviderInfo( new CombinedProviderInfo(
cpi, selectedAsi, isDefaultAutofillProvider, isDefaultCredmanProvider)); cpi, selectedAsi, isDefaultAutofillProvider, isPrimaryCredmanProvider));
} }
return cmpi; return cmpi;

View File

@@ -321,7 +321,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
mEnabledPackageNames.clear(); mEnabledPackageNames.clear();
for (CredentialProviderInfo cpi : availableServices) { for (CredentialProviderInfo cpi : availableServices) {
if (cpi.isEnabled()) { if (cpi.isEnabled() && !cpi.isPrimary()) {
mEnabledPackageNames.add(cpi.getServiceInfo().packageName); mEnabledPackageNames.add(cpi.getServiceInfo().packageName);
} }
} }
@@ -560,16 +560,25 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
return; return;
} }
List<String> 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<String> primaryServices = new HashSet<>();
for (CredentialProviderInfo service : mServices) {
if (service.isPrimary()) {
primaryServices.add(service.getServiceInfo().getComponentName().flattenToString());
}
}
mCredentialManager.setEnabledProviders( mCredentialManager.setEnabledProviders(
new ArrayList<String>(), // TODO(240466271): pass down primary providers new ArrayList<>(primaryServices),
enabledServices, getEnabledSettings(),
getUser(), getUser(),
mExecutor, mExecutor,
new OutcomeReceiver<Void, SetEnabledProvidersException>() { new OutcomeReceiver<Void, SetEnabledProvidersException>() {
@Override @Override
public void onResult(Void result) { public void onResult(Void result) {
Log.i(TAG, "setEnabledProviders success"); Log.i(TAG, "setEnabledProviders success");
updateFromExternal();
} }
@Override @Override

View File

@@ -47,7 +47,9 @@ import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.widget.CandidateInfo; import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
public class DefaultCombinedPicker extends DefaultAppPickerFragment { public class DefaultCombinedPicker extends DefaultAppPickerFragment {
@@ -338,9 +340,9 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
return true; return true;
} }
private void setProviders(String autofillProvider, List<String> credManProviders) { private void setProviders(String autofillProvider, List<String> primaryCredManProviders) {
if (TextUtils.isEmpty(autofillProvider)) { if (TextUtils.isEmpty(autofillProvider)) {
if (credManProviders.size() > 0) { if (primaryCredManProviders.size() > 0) {
autofillProvider = autofillProvider =
CredentialManagerPreferenceController CredentialManagerPreferenceController
.AUTOFILL_CREDMAN_ONLY_PROVIDER_PLACEHOLDER; .AUTOFILL_CREDMAN_ONLY_PROVIDER_PLACEHOLDER;
@@ -350,13 +352,25 @@ public class DefaultCombinedPicker extends DefaultAppPickerFragment {
Settings.Secure.putStringForUser( Settings.Secure.putStringForUser(
getContext().getContentResolver(), AUTOFILL_SETTING, autofillProvider, mUserId); getContext().getContentResolver(), AUTOFILL_SETTING, autofillProvider, mUserId);
CredentialManager service = getCredentialProviderService(); final CredentialManager service = getCredentialProviderService();
if (service == null) { if (service == null) {
return; 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<String> 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( service.setEnabledProviders(
new ArrayList<String>(), // TODO(240466271): pass down primary providers. primaryCredManProviders,
credManProviders, credManProviders,
mUserId, mUserId,
ContextCompat.getMainExecutor(getContext()), ContextCompat.getMainExecutor(getContext()),

View File

@@ -135,12 +135,12 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
/** Provides Intent to setting activity for the specified autofill service. */ /** Provides Intent to setting activity for the specified autofill service. */
static final class AutofillSettingIntentProvider { static final class AutofillSettingIntentProvider {
private final String mSelectedKey; private final String mKey;
private final Context mContext; private final Context mContext;
private final int mUserId; private final int mUserId;
public AutofillSettingIntentProvider(Context context, int userId, String key) { public AutofillSettingIntentProvider(Context context, int userId, String key) {
mSelectedKey = key; mKey = key;
mContext = context; mContext = context;
mUserId = userId; mUserId = userId;
} }
@@ -153,10 +153,9 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
for (ResolveInfo resolveInfo : resolveInfos) { for (ResolveInfo resolveInfo : resolveInfos) {
final ServiceInfo serviceInfo = resolveInfo.serviceInfo; final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
final String flattenKey =
new ComponentName(serviceInfo.packageName, serviceInfo.name) // If there are multiple autofill services then pick the first one.
.flattenToString(); if (mKey.startsWith(serviceInfo.packageName)) {
if (TextUtils.equals(mSelectedKey, flattenKey)) {
final String settingsActivity; final String settingsActivity;
try { try {
settingsActivity = settingsActivity =
@@ -164,7 +163,7 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
.getSettingsActivity(); .getSettingsActivity();
} catch (SecurityException e) { } catch (SecurityException e) {
// Service does not declare the proper permission, ignore it. // 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; return null;
} }
if (TextUtils.isEmpty(settingsActivity)) { if (TextUtils.isEmpty(settingsActivity)) {