diff options
6 files changed, 33 insertions, 15 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index e34ddafc9e64..261f8eaa0d18 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1181,6 +1181,7 @@ package android.credentials { method @Nullable public CharSequence getSettingsSubtitle(); method @NonNull public boolean hasCapability(@NonNull String); method public boolean isEnabled(); + method public boolean isPrimary(); method public boolean isSystemProvider(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.credentials.CredentialProviderInfo> CREATOR; diff --git a/core/java/android/credentials/CredentialProviderInfo.java b/core/java/android/credentials/CredentialProviderInfo.java index a0cb36da231c..95ca0112b8b3 100644 --- a/core/java/android/credentials/CredentialProviderInfo.java +++ b/core/java/android/credentials/CredentialProviderInfo.java @@ -107,7 +107,6 @@ public final class CredentialProviderInfo implements Parcelable { /** * Returns whether the provider is set as primary by the user. * - * @hide */ public boolean isPrimary() { return mIsPrimary; diff --git a/core/java/android/service/credentials/CredentialProviderInfoFactory.java b/core/java/android/service/credentials/CredentialProviderInfoFactory.java index 58bc4daa3cd7..0aa6a232d416 100644 --- a/core/java/android/service/credentials/CredentialProviderInfoFactory.java +++ b/core/java/android/service/credentials/CredentialProviderInfoFactory.java @@ -417,7 +417,8 @@ public final class CredentialProviderInfoFactory { si, /* isSystemProvider= */ true, disableSystemAppVerificationForTests, - enabledServices.contains(si.getComponentName()), false); + enabledServices.contains(si.getComponentName()), + false); if (cpi.isSystemProvider()) { providerInfos.add(cpi); } else { @@ -456,7 +457,7 @@ public final class CredentialProviderInfoFactory { int userId, int providerFilter, Set<ComponentName> enabledServices, - Set<String> primaryServices) { + Set<ComponentName> primaryServices) { requireNonNull(context, "context must not be null"); // Get the device policy. @@ -490,7 +491,7 @@ public final class CredentialProviderInfoFactory { int userId, int providerFilter, Set<ComponentName> enabledServices, - Set<String> primaryServices) { + Set<ComponentName> primaryServices) { requireNonNull(context, "context must not be null"); // Get the device policy. @@ -601,7 +602,7 @@ public final class CredentialProviderInfoFactory { @UserIdInt int userId, boolean disableSystemAppVerificationForTests, Set<ComponentName> enabledServices, - Set<String> primaryServices) { + Set<ComponentName> primaryServices) { final List<CredentialProviderInfo> services = new ArrayList<>(); final List<ResolveInfo> resolveInfos = context.getPackageManager() @@ -624,8 +625,7 @@ public final class CredentialProviderInfoFactory { /* isSystemProvider= */ false, disableSystemAppVerificationForTests, enabledServices.contains(serviceInfo.getComponentName()), - primaryServices.contains( - serviceInfo.getComponentName().flattenToString())); + primaryServices.contains(serviceInfo.getComponentName())); if (!cpi.isSystemProvider()) { services.add(cpi); } diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java index c37a038d8ef7..6899ad48b813 100644 --- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java @@ -38,6 +38,7 @@ import android.util.Slog; import com.android.server.credentials.metrics.ProviderStatusForMetrics; import java.util.ArrayList; +import java.util.List; import java.util.Set; /** @@ -49,7 +50,7 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR ICreateCredentialCallback, CreateCredentialResponse> implements ProviderSession.ProviderInternalCallback<CreateCredentialResponse> { private static final String TAG = "CreateRequestSession"; - private final Set<String> mPrimaryProviders; + private final Set<ComponentName> mPrimaryProviders; CreateRequestSession(@NonNull Context context, RequestSession.SessionLifetime sessionCallback, Object lock, int userId, int callingUid, @@ -57,7 +58,7 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR ICreateCredentialCallback callback, CallingAppInfo callingAppInfo, Set<ComponentName> enabledProviders, - Set<String> primaryProviders, + Set<ComponentName> primaryProviders, CancellationSignal cancellationSignal, long startedTimestamp) { super(context, sessionCallback, lock, userId, callingUid, request, callback, @@ -96,13 +97,18 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR mCredentialManagerUi.setStatus(CredentialManagerUi.UiStatus.USER_INTERACTION); cancelExistingPendingIntent(); try { + List<String> flattenedPrimaryProviders = new ArrayList<>(); + for (ComponentName cn : mPrimaryProviders) { + flattenedPrimaryProviders.add(cn.flattenToString()); + } + mPendingIntent = mCredentialManagerUi.createPendingIntent( RequestInfo.newCreateRequestInfo( mRequestId, mClientRequest, mClientAppInfo.getPackageName(), PermissionUtils.hasPermission(mContext, mClientAppInfo.getPackageName(), Manifest.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS), - /*defaultProviderId=*/new ArrayList<String>(mPrimaryProviders)), + /*defaultProviderId=*/flattenedPrimaryProviders), providerDataList); mClientCallback.onPendingIntent(mPendingIntent); } catch (RemoteException e) { diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java index 6747cea80115..d8c684fb8c1e 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java @@ -69,7 +69,6 @@ import com.android.server.infra.AbstractMasterSystemService; import com.android.server.infra.SecureSettingsServiceNameResolver; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; @@ -281,7 +280,7 @@ public final class CredentialManagerService } } - private static Set<String> getPrimaryProvidersForUserId(Context context, int userId) { + private static Set<ComponentName> getPrimaryProvidersForUserId(Context context, int userId) { final int resolvedUserId = ActivityManager.handleIncomingUser( Binder.getCallingPid(), Binder.getCallingUid(), userId, false, false, @@ -291,9 +290,22 @@ public final class CredentialManagerService /* isMultipleMode= */ true); String[] serviceNames = resolver.readServiceNameList(resolvedUserId); if (serviceNames == null) { - return new HashSet<String>(); + return new HashSet<ComponentName>(); } - return new HashSet<String>(Arrays.asList(serviceNames)); + + Set<ComponentName> services = new HashSet<>(); + for (String serviceName : serviceNames) { + ComponentName compName = ComponentName.unflattenFromString(serviceName); + if (compName == null) { + Slog.w( + TAG, + "Primary provider component name unflatten from string error: " + + serviceName); + continue; + } + services.add(compName); + } + return services; } @GuardedBy("mLock") diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java index 272452e1b2ae..b90f08e420e7 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerUi.java @@ -159,7 +159,7 @@ public class CredentialManagerUi { CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY, mEnabledProviders, // Don't need primary providers here. - new HashSet<String>()); + new HashSet<ComponentName>()); List<DisabledProviderData> disabledProviderDataList = allProviders.stream() .filter(provider -> !provider.isEnabled()) |