Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b84c3f60 authored by Becca Hughes's avatar Becca Hughes
Browse files

Fix isPrimary bit not being set

*this is a cherry pick from main*

This CL updates the primary provider
logic from not working correctly
by replacing the use of strings with
component info so that it is parsed
and string formatting issues won't
affect the new logic.

Test: gts
Bug: 291215735
Change-Id: I230fe6e22fd441e7fb986e899a8cade38f9e3b36
Merged-In: I230fe6e22fd441e7fb986e899a8cade38f9e3b36
parent 7107826f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1154,6 +1154,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;
+0 −1
Original line number Diff line number Diff line
@@ -113,7 +113,6 @@ public final class CredentialProviderInfo implements Parcelable {
    /**
     * Returns whether the provider is set as primary by the user.
     *
     * @hide
     */
    public boolean isPrimary() {
        return mIsPrimary;
+6 −6
Original line number Diff line number Diff line
@@ -415,7 +415,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 {
@@ -454,7 +455,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.
@@ -488,7 +489,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.
@@ -599,7 +600,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()
@@ -622,8 +623,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);
                }
+9 −3
Original line number Diff line number Diff line
@@ -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) {
+16 −4
Original line number Diff line number Diff line
@@ -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")
Loading