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 @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<CredentialProviderInfo> 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;

View File

@@ -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<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(
new ArrayList<String>(), // TODO(240466271): pass down primary providers
enabledServices,
new ArrayList<>(primaryServices),
getEnabledSettings(),
getUser(),
mExecutor,
new OutcomeReceiver<Void, SetEnabledProvidersException>() {
@Override
public void onResult(Void result) {
Log.i(TAG, "setEnabledProviders success");
updateFromExternal();
}
@Override

View File

@@ -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<String> credManProviders) {
private void setProviders(String autofillProvider, List<String> 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<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(
new ArrayList<String>(), // TODO(240466271): pass down primary providers.
primaryCredManProviders,
credManProviders,
mUserId,
ContextCompat.getMainExecutor(getContext()),

View File

@@ -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)) {