Renamed the GetCredentialOption to CredentialOptions.

GetCredentialOptions is an awkward name and leads to
getGetCredentialOptions() getter.

However, not moving it to be a subclass of ./GetCredentialRequest.java
because it's also used in service/credentials/GetCredentialRequest.java.

Test: CtsCredentialManagerTestCases
Bug: 265809787
CTS-Coverage-Bug: 263109618
API-Coverage-Bug: 263109618
Change-Id: I120735b37754bd8684e944c0cc89c826b402ef9f
This commit is contained in:
Helen Qin
2023-01-19 01:54:19 +00:00
parent a3783bcb0d
commit 4db6d6f688
10 changed files with 114 additions and 110 deletions

View File

@@ -13509,6 +13509,18 @@ package android.credentials {
method public void unregisterCredentialDescription(@NonNull android.credentials.UnregisterCredentialDescriptionRequest);
}
public final class CredentialOption implements android.os.Parcelable {
ctor public CredentialOption(@NonNull String, @NonNull android.os.Bundle, @NonNull android.os.Bundle, boolean);
method public int describeContents();
method @NonNull public android.os.Bundle getCandidateQueryData();
method @NonNull public android.os.Bundle getCredentialRetrievalData();
method @NonNull public String getType();
method public boolean isSystemProviderRequired();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.credentials.CredentialOption> CREATOR;
field public static final String FLATTENED_REQUEST = "android.credentials.GetCredentialOption.FLATTENED_REQUEST_STRING";
}
public class GetCredentialException extends java.lang.Exception {
ctor public GetCredentialException(@NonNull String, @Nullable String);
ctor public GetCredentialException(@NonNull String, @Nullable String, @Nullable Throwable);
@@ -13521,31 +13533,19 @@ package android.credentials {
field @NonNull public static final String TYPE_USER_CANCELED = "android.credentials.GetCredentialException.TYPE_USER_CANCELED";
}
public final class GetCredentialOption implements android.os.Parcelable {
ctor public GetCredentialOption(@NonNull String, @NonNull android.os.Bundle, @NonNull android.os.Bundle, boolean);
method public int describeContents();
method @NonNull public android.os.Bundle getCandidateQueryData();
method @NonNull public android.os.Bundle getCredentialRetrievalData();
method @NonNull public String getType();
method public boolean isSystemProviderRequired();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.credentials.GetCredentialOption> CREATOR;
field public static final String FLATTENED_REQUEST = "android.credentials.GetCredentialOption.FLATTENED_REQUEST_STRING";
}
public final class GetCredentialRequest implements android.os.Parcelable {
method public int describeContents();
method @NonNull public java.util.List<android.credentials.CredentialOption> getCredentialOptions();
method @NonNull public android.os.Bundle getData();
method @NonNull public java.util.List<android.credentials.GetCredentialOption> getGetCredentialOptions();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.credentials.GetCredentialRequest> CREATOR;
}
public static final class GetCredentialRequest.Builder {
ctor public GetCredentialRequest.Builder(@NonNull android.os.Bundle);
method @NonNull public android.credentials.GetCredentialRequest.Builder addGetCredentialOption(@NonNull android.credentials.GetCredentialOption);
method @NonNull public android.credentials.GetCredentialRequest.Builder addCredentialOption(@NonNull android.credentials.CredentialOption);
method @NonNull public android.credentials.GetCredentialRequest build();
method @NonNull public android.credentials.GetCredentialRequest.Builder setGetCredentialOptions(@NonNull java.util.List<android.credentials.GetCredentialOption>);
method @NonNull public android.credentials.GetCredentialRequest.Builder setCredentialOptions(@NonNull java.util.List<android.credentials.CredentialOption>);
}
public final class GetCredentialResponse implements android.os.Parcelable {
@@ -40295,10 +40295,10 @@ package android.service.credentials {
}
public final class GetCredentialRequest implements android.os.Parcelable {
ctor public GetCredentialRequest(@NonNull android.service.credentials.CallingAppInfo, @NonNull android.credentials.GetCredentialOption);
ctor public GetCredentialRequest(@NonNull android.service.credentials.CallingAppInfo, @NonNull android.credentials.CredentialOption);
method public int describeContents();
method @NonNull public android.service.credentials.CallingAppInfo getCallingAppInfo();
method @NonNull public android.credentials.GetCredentialOption getGetCredentialOption();
method @NonNull public android.credentials.CredentialOption getGetCredentialOption();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.GetCredentialRequest> CREATOR;
}

View File

@@ -27,9 +27,11 @@ import com.android.internal.util.AnnotationValidations;
import com.android.internal.util.Preconditions;
/**
* A specific type of credential request.
* Information about a specific type of credential to be requested during a {@link
* CredentialManager#getCredential(GetCredentialRequest, Activity, CancellationSignal, Executor,
* OutcomeReceiver)} operation.
*/
public final class GetCredentialOption implements Parcelable {
public final class CredentialOption implements Parcelable {
/**
* Bundle key to the flattened version of the JSON request string. Framework will use this key
@@ -118,7 +120,7 @@ public final class GetCredentialOption implements Parcelable {
@Override
public String toString() {
return "GetCredentialOption {"
return "CredentialOption {"
+ "type=" + mType
+ ", requestData=" + mCredentialRetrievalData
+ ", candidateQueryData=" + mCandidateQueryData
@@ -127,17 +129,17 @@ public final class GetCredentialOption implements Parcelable {
}
/**
* Constructs a {@link GetCredentialOption}.
* Constructs a {@link CredentialOption}.
*
* @param type the requested credential type
* @param credentialRetrievalData the request data
* @param candidateQueryData the partial request data that will be sent to the provider
* during the initial credential candidate query stage
* @param isSystemProviderRequired whether the request must only be fulfilled by a system
* provider
* @param type the requested credential type
* @param credentialRetrievalData the request data
* @param candidateQueryData the partial request data that will be sent to the provider
* during the initial credential candidate query stage
* @param isSystemProviderRequired whether the request must only be fulfilled by a system
* provider
* @throws IllegalArgumentException If type is empty.
*/
public GetCredentialOption(
public CredentialOption(
@NonNull String type,
@NonNull Bundle credentialRetrievalData,
@NonNull Bundle candidateQueryData,
@@ -150,7 +152,7 @@ public final class GetCredentialOption implements Parcelable {
mIsSystemProviderRequired = isSystemProviderRequired;
}
private GetCredentialOption(@NonNull Parcel in) {
private CredentialOption(@NonNull Parcel in) {
String type = in.readString8();
Bundle data = in.readBundle();
Bundle candidateQueryData = in.readBundle();
@@ -165,16 +167,16 @@ public final class GetCredentialOption implements Parcelable {
mIsSystemProviderRequired = isSystemProviderRequired;
}
public static final @NonNull Parcelable.Creator<GetCredentialOption> CREATOR =
new Parcelable.Creator<GetCredentialOption>() {
@Override
public GetCredentialOption[] newArray(int size) {
return new GetCredentialOption[size];
}
@NonNull
public static final Parcelable.Creator<CredentialOption> CREATOR = new Parcelable.Creator<>() {
@Override
public CredentialOption[] newArray(int size) {
return new CredentialOption[size];
}
@Override
public GetCredentialOption createFromParcel(@NonNull Parcel in) {
return new GetCredentialOption(in);
}
};
@Override
public CredentialOption createFromParcel(@NonNull Parcel in) {
return new CredentialOption(in);
}
};
}

View File

@@ -39,7 +39,7 @@ public final class GetCredentialRequest implements Parcelable {
* The list of credential requests.
*/
@NonNull
private final List<GetCredentialOption> mGetCredentialOptions;
private final List<CredentialOption> mCredentialOptions;
/**
* The top request level data.
@@ -51,8 +51,8 @@ public final class GetCredentialRequest implements Parcelable {
* Returns the list of credential options to be requested.
*/
@NonNull
public List<GetCredentialOption> getGetCredentialOptions() {
return mGetCredentialOptions;
public List<CredentialOption> getCredentialOptions() {
return mCredentialOptions;
}
/**
@@ -65,7 +65,7 @@ public final class GetCredentialRequest implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeTypedList(mGetCredentialOptions, flags);
dest.writeTypedList(mCredentialOptions, flags);
dest.writeBundle(mData);
}
@@ -76,29 +76,29 @@ public final class GetCredentialRequest implements Parcelable {
@Override
public String toString() {
return "GetCredentialRequest {getCredentialOption=" + mGetCredentialOptions
return "GetCredentialRequest {credentialOption=" + mCredentialOptions
+ ", data=" + mData
+ "}";
}
private GetCredentialRequest(@NonNull List<GetCredentialOption> getCredentialOptions,
private GetCredentialRequest(@NonNull List<CredentialOption> credentialOptions,
@NonNull Bundle data) {
Preconditions.checkCollectionNotEmpty(
getCredentialOptions,
/*valueName=*/ "getCredentialOptions");
credentialOptions,
/*valueName=*/ "credentialOptions");
Preconditions.checkCollectionElementsNotNull(
getCredentialOptions,
/*valueName=*/ "getCredentialOptions");
mGetCredentialOptions = getCredentialOptions;
credentialOptions,
/*valueName=*/ "credentialOptions");
mCredentialOptions = credentialOptions;
mData = requireNonNull(data,
"data must not be null");
}
private GetCredentialRequest(@NonNull Parcel in) {
List<GetCredentialOption> getCredentialOptions = new ArrayList<GetCredentialOption>();
in.readTypedList(getCredentialOptions, GetCredentialOption.CREATOR);
mGetCredentialOptions = getCredentialOptions;
AnnotationValidations.validate(NonNull.class, null, mGetCredentialOptions);
List<CredentialOption> credentialOptions = new ArrayList<CredentialOption>();
in.readTypedList(credentialOptions, CredentialOption.CREATOR);
mCredentialOptions = credentialOptions;
AnnotationValidations.validate(NonNull.class, null, mCredentialOptions);
Bundle data = in.readBundle();
@@ -106,8 +106,8 @@ public final class GetCredentialRequest implements Parcelable {
AnnotationValidations.validate(NonNull.class, null, mData);
}
public static final @NonNull Parcelable.Creator<GetCredentialRequest> CREATOR =
new Parcelable.Creator<GetCredentialRequest>() {
@NonNull public static final Parcelable.Creator<GetCredentialRequest> CREATOR =
new Parcelable.Creator<>() {
@Override
public GetCredentialRequest[] newArray(int size) {
return new GetCredentialRequest[size];
@@ -123,7 +123,7 @@ public final class GetCredentialRequest implements Parcelable {
public static final class Builder {
@NonNull
private List<GetCredentialOption> mGetCredentialOptions = new ArrayList<>();
private List<CredentialOption> mCredentialOptions = new ArrayList<>();
@NonNull
private final Bundle mData;
@@ -136,43 +136,42 @@ public final class GetCredentialRequest implements Parcelable {
}
/**
* Adds a specific type of {@link GetCredentialOption}.
* Adds a specific type of {@link CredentialOption}.
*/
@NonNull
public Builder addGetCredentialOption(
@NonNull GetCredentialOption getCredentialOption) {
mGetCredentialOptions.add(requireNonNull(
getCredentialOption, "getCredentialOption must not be null"));
public Builder addCredentialOption(@NonNull CredentialOption credentialOption) {
mCredentialOptions.add(requireNonNull(
credentialOption, "credentialOption must not be null"));
return this;
}
/**
* Sets the list of {@link GetCredentialOption}.
* Sets the list of {@link CredentialOption}.
*/
@NonNull
public Builder setGetCredentialOptions(
@NonNull List<GetCredentialOption> getCredentialOptions) {
public Builder setCredentialOptions(
@NonNull List<CredentialOption> credentialOptions) {
Preconditions.checkCollectionElementsNotNull(
getCredentialOptions,
/*valueName=*/ "getCredentialOptions");
mGetCredentialOptions = new ArrayList<>(getCredentialOptions);
credentialOptions,
/*valueName=*/ "credentialOptions");
mCredentialOptions = new ArrayList<>(credentialOptions);
return this;
}
/**
* Builds a {@link GetCredentialRequest}.
*
* @throws IllegalArgumentException If getCredentialOptions is empty.
* @throws IllegalArgumentException If credentialOptions is empty.
*/
@NonNull
public GetCredentialRequest build() {
Preconditions.checkCollectionNotEmpty(
mGetCredentialOptions,
/*valueName=*/ "getCredentialOptions");
mCredentialOptions,
/*valueName=*/ "credentialOptions");
Preconditions.checkCollectionElementsNotNull(
mGetCredentialOptions,
/*valueName=*/ "getCredentialOptions");
return new GetCredentialRequest(mGetCredentialOptions, mData);
mCredentialOptions,
/*valueName=*/ "credentialOptions");
return new GetCredentialRequest(mCredentialOptions, mData);
}
}
}

View File

@@ -19,7 +19,6 @@ package android.service.credentials;
import android.annotation.NonNull;
import android.app.PendingIntent;
import android.content.Intent;
import android.credentials.GetCredentialOption;
import android.os.Parcel;
import android.os.Parcelable;
@@ -33,7 +32,7 @@ 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 GetCredentialOption} that have parameters
* <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.
*

View File

@@ -308,7 +308,7 @@ public abstract class CredentialProviderService extends Service {
*
* <p>This API denotes a query stage request for getting user's credentials from a given
* credential provider. The request contains a list of
* {@link android.credentials.GetCredentialOption} that have parameters to be used for
* {@link BeginGetCredentialOption} that have parameters to be used for
* populating candidate credentials, as a list of {@link CredentialEntry} to be set
* on the {@link BeginGetCredentialResponse}. This list is then shown to the user on a
* selector.

View File

@@ -17,7 +17,7 @@
package android.service.credentials;
import android.annotation.NonNull;
import android.credentials.GetCredentialOption;
import android.credentials.CredentialOption;
import android.os.Parcel;
import android.os.Parcelable;
@@ -32,28 +32,30 @@ import com.android.internal.util.AnnotationValidations;
*/
public final class GetCredentialRequest implements Parcelable {
/** Calling package of the app requesting for credentials. */
private final @NonNull CallingAppInfo mCallingAppInfo;
@NonNull
private final CallingAppInfo mCallingAppInfo;
/**
* Holds parameters to be used for retrieving a specific type of credential.
*/
private final @NonNull GetCredentialOption mGetCredentialOption;
@NonNull
private final CredentialOption mCredentialOption;
public GetCredentialRequest(@NonNull CallingAppInfo callingAppInfo,
@NonNull GetCredentialOption getCredentialOption) {
@NonNull CredentialOption credentialOption) {
this.mCallingAppInfo = callingAppInfo;
this.mGetCredentialOption = getCredentialOption;
this.mCredentialOption = credentialOption;
}
private GetCredentialRequest(@NonNull Parcel in) {
mCallingAppInfo = in.readTypedObject(CallingAppInfo.CREATOR);
AnnotationValidations.validate(NonNull.class, null, mCallingAppInfo);
mGetCredentialOption = in.readTypedObject(GetCredentialOption.CREATOR);
AnnotationValidations.validate(NonNull.class, null, mGetCredentialOption);
mCredentialOption = in.readTypedObject(CredentialOption.CREATOR);
AnnotationValidations.validate(NonNull.class, null, mCredentialOption);
}
public static final @NonNull Creator<GetCredentialRequest> CREATOR =
new Creator<GetCredentialRequest>() {
@NonNull public static final Creator<GetCredentialRequest> CREATOR =
new Creator<>() {
@Override
public GetCredentialRequest createFromParcel(Parcel in) {
return new GetCredentialRequest(in);
@@ -73,20 +75,22 @@ public final class GetCredentialRequest implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeTypedObject(mCallingAppInfo, flags);
dest.writeTypedObject(mGetCredentialOption, flags);
dest.writeTypedObject(mCredentialOption, flags);
}
/**
* Returns info pertaining to the app requesting credentials.
*/
public @NonNull CallingAppInfo getCallingAppInfo() {
@NonNull
public CallingAppInfo getCallingAppInfo() {
return mCallingAppInfo;
}
/**
* Returns the parameters needed to return a given type of credential.
*/
public @NonNull GetCredentialOption getGetCredentialOption() {
return mGetCredentialOption;
@NonNull
public CredentialOption getGetCredentialOption() {
return mCredentialOption;
}
}

View File

@@ -24,7 +24,7 @@ import android.content.Intent
import android.content.pm.SigningInfo
import android.credentials.CreateCredentialRequest
import android.credentials.Credential.TYPE_PASSWORD_CREDENTIAL
import android.credentials.GetCredentialOption
import android.credentials.CredentialOption
import android.credentials.GetCredentialRequest
import android.credentials.ui.Constants
import android.credentials.ui.Entry
@@ -496,8 +496,8 @@ class CredentialManagerRepo(
GetCredentialRequest.Builder(
Bundle()
)
.addGetCredentialOption(
GetCredentialOption(
.addCredentialOption(
CredentialOption(
TYPE_PUBLIC_KEY_CREDENTIAL,
Bundle(),
Bundle(), /*isSystemProviderRequired=*/

View File

@@ -61,7 +61,7 @@ class GetCredentialRequest constructor(
@JvmStatic
fun createFrom(from: android.credentials.GetCredentialRequest): GetCredentialRequest {
return GetCredentialRequest(
from.getCredentialOptions.map {
from.credentialOptions.map {
GetCredentialOption.createFrom(
it.type,
it.credentialRetrievalData,

View File

@@ -29,8 +29,8 @@ import android.credentials.ClearCredentialStateRequest;
import android.credentials.CreateCredentialException;
import android.credentials.CreateCredentialRequest;
import android.credentials.CredentialDescription;
import android.credentials.CredentialOption;
import android.credentials.GetCredentialException;
import android.credentials.GetCredentialOption;
import android.credentials.GetCredentialRequest;
import android.credentials.IClearCredentialStateCallback;
import android.credentials.ICreateCredentialCallback;
@@ -268,10 +268,10 @@ public final class CredentialManagerService
// All requested credential descriptions based on the given request.
Set<String> requestedCredentialDescriptions =
request.getGetCredentialOptions().stream().map(
getCredentialOption -> getCredentialOption
request.getCredentialOptions().stream().map(
credentialOption -> credentialOption
.getCredentialRetrievalData()
.getString(GetCredentialOption
.getString(CredentialOption
.FLATTENED_REQUEST))
.collect(Collectors.toSet());
@@ -342,11 +342,11 @@ public final class CredentialManagerService
// Initiate all provider sessions
List<ProviderSession> providerSessions =
initiateProviderSessions(
session,
request.getGetCredentialOptions().stream()
.map(GetCredentialOption::getType)
.collect(Collectors.toList()));
initiateProviderSessions(
session,
request.getCredentialOptions().stream()
.map(CredentialOption::getType)
.collect(Collectors.toList()));
if (providerSessions.isEmpty()) {
try {

View File

@@ -21,8 +21,8 @@ import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.content.Context;
import android.content.Intent;
import android.credentials.CredentialOption;
import android.credentials.GetCredentialException;
import android.credentials.GetCredentialOption;
import android.credentials.GetCredentialResponse;
import android.credentials.ui.Entry;
import android.credentials.ui.GetCredentialProviderData;
@@ -107,7 +107,7 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
) {
return new BeginGetCredentialRequest.Builder(callingAppInfo)
.setBeginGetCredentialOptions(
filteredRequest.getGetCredentialOptions().stream().map(
filteredRequest.getCredentialOptions().stream().map(
option -> {
return new BeginGetCredentialOption(
option.getType(),
@@ -121,8 +121,8 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
List<String> providerCapabilities,
android.credentials.GetCredentialRequest clientRequest
) {
List<GetCredentialOption> filteredOptions = new ArrayList<>();
for (GetCredentialOption option : clientRequest.getGetCredentialOptions()) {
List<CredentialOption> filteredOptions = new ArrayList<>();
for (CredentialOption option : clientRequest.getCredentialOptions()) {
if (providerCapabilities.contains(option.getType())) {
Log.i(TAG, "In createProviderRequest - capability found : "
+ option.getType());
@@ -135,7 +135,7 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
if (!filteredOptions.isEmpty()) {
return new android.credentials.GetCredentialRequest
.Builder(clientRequest.getData())
.setGetCredentialOptions(
.setCredentialOptions(
filteredOptions).build();
}
Log.i(TAG, "In createProviderRequest - returning null");
@@ -307,7 +307,7 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
private Intent setUpFillInIntent(String type) {
Intent intent = new Intent();
for (GetCredentialOption option : mCompleteRequest.getGetCredentialOptions()) {
for (CredentialOption option : mCompleteRequest.getCredentialOptions()) {
if (option.getType().equals(type)) {
intent.putExtra(
CredentialProviderService