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

Commit 77cbd50b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Change provider side GetCredRequest to contain single option"

parents 711dbe94 5f6159d3
Loading
Loading
Loading
Loading
+2 −8
Original line number Diff line number Diff line
@@ -39865,20 +39865,14 @@ package android.service.credentials {
  }
  public final class GetCredentialRequest implements android.os.Parcelable {
    ctor public GetCredentialRequest(@NonNull android.service.credentials.CallingAppInfo, @NonNull android.credentials.GetCredentialOption);
    method public int describeContents();
    method @NonNull public android.service.credentials.CallingAppInfo getCallingAppInfo();
    method @NonNull public java.util.List<android.credentials.GetCredentialOption> getGetCredentialOptions();
    method @NonNull public android.credentials.GetCredentialOption getGetCredentialOption();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.GetCredentialRequest> CREATOR;
  }
  public static final class GetCredentialRequest.Builder {
    ctor public GetCredentialRequest.Builder(@NonNull android.service.credentials.CallingAppInfo);
    method @NonNull public android.service.credentials.GetCredentialRequest.Builder addGetCredentialOption(@NonNull android.credentials.GetCredentialOption);
    method @NonNull public android.service.credentials.GetCredentialRequest build();
    method @NonNull public android.service.credentials.GetCredentialRequest.Builder setGetCredentialOptions(@NonNull java.util.List<android.credentials.GetCredentialOption>);
  }
}
package android.service.dreams {
+17 −83
Original line number Diff line number Diff line
@@ -22,37 +22,34 @@ import android.os.Parcel;
import android.os.Parcelable;

import com.android.internal.util.AnnotationValidations;
import com.android.internal.util.Preconditions;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * Request for getting user's credentials from a given credential provider.
 * Request for getting user's credential from a given credential provider.
 *
 * <p>Provider will receive this request once the user selects a given {@link CredentialEntry}
 * on the selector, that was sourced from provider's result to
 * {@link CredentialProviderService#onBeginGetCredential}.
 */
public final class GetCredentialRequest implements Parcelable {
    /** Calling package of the app requesting for credentials. */
    private final @NonNull CallingAppInfo mCallingAppInfo;

    /**
     * List of credential options. Each {@link GetCredentialOption} object holds parameters to
     * be used for retrieving specific type of credentials.
     * Holds parameters to be used for retrieving a specific type of credential.
     */
    private final @NonNull List<GetCredentialOption> mGetCredentialOptions;
    private final @NonNull GetCredentialOption mGetCredentialOption;

    private GetCredentialRequest(@NonNull CallingAppInfo callingAppInfo,
            @NonNull List<GetCredentialOption> getCredentialOptions) {
    public GetCredentialRequest(@NonNull CallingAppInfo callingAppInfo,
            @NonNull GetCredentialOption getCredentialOption) {
        this.mCallingAppInfo = callingAppInfo;
        this.mGetCredentialOptions = getCredentialOptions;
        this.mGetCredentialOption = getCredentialOption;
    }

    private GetCredentialRequest(@NonNull Parcel in) {
        mCallingAppInfo = in.readTypedObject(CallingAppInfo.CREATOR);
        List<GetCredentialOption> getCredentialOptions = new ArrayList<>();
        in.readTypedList(getCredentialOptions, GetCredentialOption.CREATOR);
        mGetCredentialOptions = getCredentialOptions;
        AnnotationValidations.validate(NonNull.class, null, mGetCredentialOptions);
        AnnotationValidations.validate(NonNull.class, null, mCallingAppInfo);
        mGetCredentialOption = in.readTypedObject(GetCredentialOption.CREATOR);
        AnnotationValidations.validate(NonNull.class, null, mGetCredentialOption);
    }

    public static final @NonNull Creator<GetCredentialRequest> CREATOR =
@@ -76,7 +73,7 @@ public final class GetCredentialRequest implements Parcelable {
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeTypedObject(mCallingAppInfo, flags);
        dest.writeTypedList(mGetCredentialOptions);
        dest.writeTypedObject(mGetCredentialOption, flags);
    }

    /**
@@ -87,72 +84,9 @@ public final class GetCredentialRequest implements Parcelable {
    }

    /**
     * Returns the list of type specific credential options to return credentials for.
     */
    public @NonNull List<GetCredentialOption> getGetCredentialOptions() {
        return mGetCredentialOptions;
    }

    /**
     * Builder for {@link GetCredentialRequest}.
     */
    public static final class Builder {
        private CallingAppInfo mCallingAppInfo;
        private List<GetCredentialOption> mGetCredentialOptions = new ArrayList<>();

        /**
         * Creates a new builder.
         * @param callingAppInfo info pertaining to the app requesting credentials
         *
         * @throws IllegalArgumentException If {@code callingPackag}e is null or empty.
         */
        public Builder(@NonNull CallingAppInfo callingAppInfo) {
            mCallingAppInfo = Objects.requireNonNull(callingAppInfo);
        }

        /**
         * Sets the list of credential options.
         *
         * @throws NullPointerException If {@code getCredentialOptions} itself or any of its
         * elements is null.
         * @throws IllegalArgumentException If {@code getCredentialOptions} is empty.
         */
        public @NonNull Builder setGetCredentialOptions(
                @NonNull List<GetCredentialOption> getCredentialOptions) {
            Preconditions.checkCollectionNotEmpty(getCredentialOptions,
                    "getCredentialOptions");
            Preconditions.checkCollectionElementsNotNull(getCredentialOptions,
                    "getCredentialOptions");
            mGetCredentialOptions = getCredentialOptions;
            return this;
        }

        /**
         * Adds a single {@link GetCredentialOption} object to the list of credential options.
         *
         * @throws NullPointerException If {@code getCredentialOption} is null.
         */
        public @NonNull Builder addGetCredentialOption(
                @NonNull GetCredentialOption getCredentialOption) {
            Objects.requireNonNull(getCredentialOption,
                    "getCredentialOption must not be null");
            mGetCredentialOptions.add(getCredentialOption);
            return this;
        }

        /**
         * Builds a new {@link GetCredentialRequest} instance.
         *
         * @throws NullPointerException If {@code getCredentialOptions} is null.
         * @throws IllegalArgumentException If {@code getCredentialOptions} is empty, or if
         * {@code callingAppInfo} is null or empty.
     * Returns the parameters needed to return a given type of credential.
     */
        public @NonNull GetCredentialRequest build() {
            Objects.requireNonNull(mCallingAppInfo,
                    "mCallingAppInfo");
            Preconditions.checkCollectionNotEmpty(mGetCredentialOptions,
                    "getCredentialOptions");
            return new GetCredentialRequest(mCallingAppInfo, mGetCredentialOptions);
        }
    public @NonNull GetCredentialOption getGetCredentialOption() {
        return mGetCredentialOption;
    }
}
+50 −35
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.annotation.UserIdInt;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.Signature;
import android.credentials.GetCredentialException;
import android.credentials.GetCredentialOption;
import android.credentials.GetCredentialResponse;
@@ -78,7 +79,8 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
    private Pair<String, Action> mUiAuthenticationAction = null;

    /** The complete request to be used in the second round. */
    private final GetCredentialRequest mCompleteRequest;
    private final android.credentials.GetCredentialRequest mCompleteRequest;
    private final CallingAppInfo mCallingAppInfo;

    private GetCredentialException mProviderException;

@@ -89,36 +91,42 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
            CredentialProviderInfo providerInfo,
            GetRequestSession getRequestSession,
            RemoteCredentialService remoteCredentialService) {
        GetCredentialRequest completeRequest =
                createProviderRequest(providerInfo.getCapabilities(),
                        getRequestSession.mClientRequest,
                        getRequestSession.mClientCallingPackage);
        if (completeRequest != null) {
            // TODO: Update to using query data when ready
            BeginGetCredentialRequest beginGetCredentialRequest =
                    new BeginGetCredentialRequest.Builder(
                            completeRequest.getCallingAppInfo())
        android.credentials.GetCredentialRequest filteredRequest =
                filterOptions(providerInfo.getCapabilities(),
                        getRequestSession.mClientRequest);
        if (filteredRequest != null) {
            BeginGetCredentialRequest beginGetCredentialRequest = constructQueryPhaseRequest(
                    filteredRequest, getRequestSession.mClientCallingPackage);

            return new ProviderGetSession(context, providerInfo, getRequestSession, userId,
                    remoteCredentialService, beginGetCredentialRequest, filteredRequest);
        }
        Log.i(TAG, "Unable to create provider session");
        return null;
    }

    private static BeginGetCredentialRequest constructQueryPhaseRequest(
            android.credentials.GetCredentialRequest filteredRequest,
            String clientCallingPackage
    ) {
        return new BeginGetCredentialRequest.Builder(
                new CallingAppInfo(clientCallingPackage,
                        new ArraySet<Signature>()))
                .setBeginGetCredentialOptions(
                                    completeRequest.getGetCredentialOptions().stream().map(
                        filteredRequest.getGetCredentialOptions().stream().map(
                                option -> {
                                                //TODO : Replace with option.getCandidateQueryData
                                                // when ready
                                    return new BeginGetCredentialOption(
                                            option.getType(),
                                            option.getCandidateQueryData());
                                }).collect(Collectors.toList()))
                .build();
            return new ProviderGetSession(context, providerInfo, getRequestSession, userId,
                    remoteCredentialService, beginGetCredentialRequest, completeRequest);
        }
        Log.i(TAG, "Unable to create provider session");
        return null;
    }

    @Nullable
    private static GetCredentialRequest createProviderRequest(List<String> providerCapabilities,
            android.credentials.GetCredentialRequest clientRequest,
            String clientCallingPackage) {
    private static android.credentials.GetCredentialRequest filterOptions(
            List<String> providerCapabilities,
            android.credentials.GetCredentialRequest clientRequest
    ) {
        List<GetCredentialOption> filteredOptions = new ArrayList<>();
        for (GetCredentialOption option : clientRequest.getGetCredentialOptions()) {
            if (providerCapabilities.contains(option.getType())) {
@@ -131,9 +139,9 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
            }
        }
        if (!filteredOptions.isEmpty()) {
            return new GetCredentialRequest.Builder(
                    new CallingAppInfo(clientCallingPackage,
                            new ArraySet<>())).setGetCredentialOptions(
            return new android.credentials.GetCredentialRequest
                    .Builder(clientRequest.getData())
                    .setGetCredentialOptions(
                            filteredOptions).build();
        }
        Log.i(TAG, "In createProviderRequest - returning null");
@@ -145,9 +153,10 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
            ProviderInternalCallback callbacks,
            int userId, RemoteCredentialService remoteCredentialService,
            BeginGetCredentialRequest beginGetRequest,
            GetCredentialRequest completeGetRequest) {
            android.credentials.GetCredentialRequest completeGetRequest) {
        super(context, info, beginGetRequest, callbacks, userId, remoteCredentialService);
        mCompleteRequest = completeGetRequest;
        mCallingAppInfo = beginGetRequest.getCallingAppInfo();
        setStatus(Status.PENDING);
    }

@@ -303,7 +312,8 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
            if (credentialEntry.getPendingIntent() != null) {
                credentialUiEntries.add(new Entry(CREDENTIAL_ENTRY_KEY, entryId,
                        credentialEntry.getSlice(), credentialEntry.getPendingIntent(),
                        /*fillInIntent=*/setUpFillInIntent(credentialEntry.getPendingIntent())));
                        setUpFillInIntent(credentialEntry.getPendingIntent(),
                                credentialEntry.getType())));
            } else {
                Log.i(TAG, "No pending intent. Should not happen.");
            }
@@ -311,12 +321,17 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
        return credentialUiEntries;
    }

    private Intent setUpFillInIntent(PendingIntent pendingIntent) {
    private Intent setUpFillInIntent(PendingIntent pendingIntent, String type) {
        Intent intent = pendingIntent.getIntent();
        for (GetCredentialOption option : mCompleteRequest.getGetCredentialOptions()) {
            if (option.getType().equals(type)) {
                intent.putExtra(
                        CredentialProviderService
                                .EXTRA_GET_CREDENTIAL_REQUEST,
                mCompleteRequest);
                        new GetCredentialRequest(mCallingAppInfo, option));
                return intent;
            }
        }
        return intent;
    }