174 lines
7.0 KiB
Java
174 lines
7.0 KiB
Java
/*
|
|
* Copyright (C) 2022 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package android.service.credentials;
|
|
|
|
import android.annotation.NonNull;
|
|
import android.annotation.Nullable;
|
|
import android.app.PendingIntent;
|
|
import android.content.Intent;
|
|
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;
|
|
|
|
/**
|
|
* Query stage request for getting user's credentials from a given credential provider.
|
|
*
|
|
* <p>This request contains a list of {@link BeginGetCredentialOption} that have parameters
|
|
* to be used to query credentials, and return a list of {@link CredentialEntry} to be set
|
|
* on the {@link BeginGetCredentialResponse}. This list is then shown to the user on a selector.
|
|
*
|
|
* If a {@link PendingIntent} is set on a {@link CredentialEntry}, and the user selects that
|
|
* entry, a {@link GetCredentialRequest} with all parameters needed to get the actual
|
|
* {@link android.credentials.Credential} will be sent as part of the {@link Intent} fired
|
|
* through the {@link PendingIntent}.
|
|
*/
|
|
public final class BeginGetCredentialRequest implements Parcelable {
|
|
/** Info pertaining to the app requesting for credentials. */
|
|
@Nullable private final CallingAppInfo mCallingAppInfo;
|
|
|
|
/**
|
|
* List of credential options. Each {@link BeginGetCredentialOption} object holds parameters to
|
|
* be used for populating a list of {@link CredentialEntry} for a specific type of credential.
|
|
*
|
|
* This request does not reveal sensitive parameters. Complete list of parameters
|
|
* is retrieved through the {@link PendingIntent} set on each {@link CredentialEntry}
|
|
* on {@link BeginGetCredentialResponse} set on {@link BeginGetCredentialResponse},
|
|
* when the user selects one of these entries.
|
|
*/
|
|
@NonNull private final List<BeginGetCredentialOption> mBeginGetCredentialOptions;
|
|
|
|
private BeginGetCredentialRequest(@Nullable CallingAppInfo callingAppInfo,
|
|
@NonNull List<BeginGetCredentialOption> getBeginCredentialOptions) {
|
|
this.mCallingAppInfo = callingAppInfo;
|
|
this.mBeginGetCredentialOptions = getBeginCredentialOptions;
|
|
}
|
|
|
|
private BeginGetCredentialRequest(@NonNull Parcel in) {
|
|
mCallingAppInfo = in.readTypedObject(CallingAppInfo.CREATOR);
|
|
List<BeginGetCredentialOption> getBeginCredentialOptions = new ArrayList<>();
|
|
in.readTypedList(getBeginCredentialOptions, BeginGetCredentialOption.CREATOR);
|
|
mBeginGetCredentialOptions = getBeginCredentialOptions;
|
|
AnnotationValidations.validate(NonNull.class, null, mBeginGetCredentialOptions);
|
|
}
|
|
|
|
@NonNull
|
|
public static final Creator<BeginGetCredentialRequest> CREATOR =
|
|
new Creator<BeginGetCredentialRequest>() {
|
|
@Override
|
|
public BeginGetCredentialRequest createFromParcel(Parcel in) {
|
|
return new BeginGetCredentialRequest(in);
|
|
}
|
|
|
|
@Override
|
|
public BeginGetCredentialRequest[] newArray(int size) {
|
|
return new BeginGetCredentialRequest[size];
|
|
}
|
|
};
|
|
|
|
@Override
|
|
public int describeContents() {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
|
dest.writeTypedObject(mCallingAppInfo, flags);
|
|
dest.writeTypedList(mBeginGetCredentialOptions);
|
|
}
|
|
|
|
/**
|
|
* Returns info pertaining to the app requesting credentials.
|
|
*/
|
|
public @Nullable CallingAppInfo getCallingAppInfo() {
|
|
return mCallingAppInfo;
|
|
}
|
|
|
|
/**
|
|
* Returns the list of type specific credential options to list credentials for in
|
|
* {@link BeginGetCredentialResponse}.
|
|
*/
|
|
public @NonNull List<BeginGetCredentialOption> getBeginGetCredentialOptions() {
|
|
return mBeginGetCredentialOptions;
|
|
}
|
|
|
|
/**
|
|
* Builder for {@link BeginGetCredentialRequest}.
|
|
*/
|
|
public static final class Builder {
|
|
private CallingAppInfo mCallingAppInfo = null;
|
|
private List<BeginGetCredentialOption> mBeginGetCredentialOptions = new ArrayList<>();
|
|
|
|
/**
|
|
* Sets information pertaining to the calling app.
|
|
* @param callingAppInfo the info object containing the package name, and app signatures
|
|
*/
|
|
public @NonNull Builder setCallingAppInfo(@Nullable CallingAppInfo callingAppInfo) {
|
|
mCallingAppInfo = callingAppInfo;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the list of credential options.
|
|
*
|
|
* @throws NullPointerException If {@code getBeginCredentialOptions} itself or any of its
|
|
* elements is null.
|
|
* @throws IllegalArgumentException If {@code getBeginCredentialOptions} is empty.
|
|
*/
|
|
public @NonNull Builder setBeginGetCredentialOptions(
|
|
@NonNull List<BeginGetCredentialOption> getBeginCredentialOptions) {
|
|
Preconditions.checkCollectionNotEmpty(getBeginCredentialOptions,
|
|
"getBeginCredentialOptions");
|
|
Preconditions.checkCollectionElementsNotNull(getBeginCredentialOptions,
|
|
"getBeginCredentialOptions");
|
|
mBeginGetCredentialOptions = getBeginCredentialOptions;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Adds a single {@link BeginGetCredentialOption} object to the list of credential options.
|
|
*
|
|
* @throws NullPointerException If {@code beginGetCredentialOption} is null.
|
|
*/
|
|
public @NonNull Builder addBeginGetCredentialOption(
|
|
@NonNull BeginGetCredentialOption beginGetCredentialOption) {
|
|
Objects.requireNonNull(beginGetCredentialOption,
|
|
"beginGetCredentialOption must not be null");
|
|
mBeginGetCredentialOptions.add(beginGetCredentialOption);
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Builds a new {@link BeginGetCredentialRequest} instance.
|
|
*
|
|
* @throws NullPointerException If {@code beginGetCredentialOptions} is null.
|
|
* @throws IllegalArgumentException If {@code beginGetCredentialOptions} is empty, or if
|
|
* {@code callingAppInfo} is null or empty.
|
|
*/
|
|
public @NonNull BeginGetCredentialRequest build() {
|
|
Preconditions.checkCollectionNotEmpty(mBeginGetCredentialOptions,
|
|
"beginGetCredentialOptions");
|
|
return new BeginGetCredentialRequest(mCallingAppInfo, mBeginGetCredentialOptions);
|
|
}
|
|
}
|
|
}
|