From fe4de4366a33c65d21175a9627580533fbce9a22 Mon Sep 17 00:00:00 2001 From: Reema Bajwa Date: Sun, 5 Feb 2023 06:09:42 +0000 Subject: [PATCH] Handling all UI event codes and exposing new type constant This change exposes a new type constant for CreateCredentialException :TYPE_NO_CREATE_OPTIONS. To be used when the provider does not return any options for create in the query phase. Test: built locally API-Coverage-Bug: 247549381 Change-Id: I031348d0f16238371a64e9548fdebc06cd9715f9 --- core/api/current.txt | 4 +- .../CreateCredentialException.java | 8 ++-- .../BeginCreateCredentialResponse.java | 13 ++++--- .../BeginGetCredentialResponse.java | 19 +++++---- .../credentials/CreateRequestSession.java | 12 ++++-- .../credentials/CredentialManagerService.java | 4 +- .../credentials/CredentialManagerUi.java | 39 ++++++++++++------- .../server/credentials/GetRequestSession.java | 6 +++ .../credentials/ProviderCreateSession.java | 15 +++++-- .../credentials/ProviderGetSession.java | 18 ++++++++- .../server/credentials/ProviderSession.java | 2 +- .../server/credentials/RequestSession.java | 5 +++ 12 files changed, 103 insertions(+), 42 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 6166f623f30ec..7c0a5be9d51bc 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -13465,7 +13465,7 @@ package android.credentials { ctor public CreateCredentialException(@NonNull String); method @NonNull public String getType(); field @NonNull public static final String TYPE_INTERRUPTED = "android.credentials.CreateCredentialException.TYPE_INTERRUPTED"; - field @NonNull public static final String TYPE_NO_CREDENTIAL = "android.credentials.CreateCredentialException.TYPE_NO_CREDENTIAL"; + field @NonNull public static final String TYPE_NO_CREATE_OPTIONS = "android.credentials.CreateCredentialException.TYPE_NO_CREATE_OPTIONS"; field @NonNull public static final String TYPE_UNKNOWN = "android.credentials.CreateCredentialException.TYPE_UNKNOWN"; field @NonNull public static final String TYPE_USER_CANCELED = "android.credentials.CreateCredentialException.TYPE_USER_CANCELED"; } @@ -40242,6 +40242,7 @@ package android.service.credentials { } public final class BeginCreateCredentialResponse implements android.os.Parcelable { + ctor public BeginCreateCredentialResponse(); method public int describeContents(); method @NonNull public java.util.List getCreateEntries(); method @Nullable public android.service.credentials.CreateEntry getRemoteCreateEntry(); @@ -40283,6 +40284,7 @@ package android.service.credentials { } public final class BeginGetCredentialResponse implements android.os.Parcelable { + ctor public BeginGetCredentialResponse(); method public int describeContents(); method @NonNull public java.util.List getActions(); method @NonNull public java.util.List getAuthenticationActions(); diff --git a/core/java/android/credentials/CreateCredentialException.java b/core/java/android/credentials/CreateCredentialException.java index 84cc9a84b23c6..c3440043a4c04 100644 --- a/core/java/android/credentials/CreateCredentialException.java +++ b/core/java/android/credentials/CreateCredentialException.java @@ -40,13 +40,13 @@ public class CreateCredentialException extends Exception { "android.credentials.CreateCredentialException.TYPE_UNKNOWN"; /** - * The error type value for when no credential is available for the given {@link - * CredentialManager#createCredential(CreateCredentialRequest, Activity, + * The error type value for when no create options are available from any provider(s), + * for the given {@link CredentialManager#createCredential(CreateCredentialRequest, Activity, * CancellationSignal, Executor, OutcomeReceiver)} request. */ @NonNull - public static final String TYPE_NO_CREDENTIAL = - "android.credentials.CreateCredentialException.TYPE_NO_CREDENTIAL"; + public static final String TYPE_NO_CREATE_OPTIONS = + "android.credentials.CreateCredentialException.TYPE_NO_CREATE_OPTIONS"; /** * The error type value for when the user intentionally cancelled the request. * diff --git a/core/java/android/service/credentials/BeginCreateCredentialResponse.java b/core/java/android/service/credentials/BeginCreateCredentialResponse.java index 8ca3a1a2ec992..f0f954dda1827 100644 --- a/core/java/android/service/credentials/BeginCreateCredentialResponse.java +++ b/core/java/android/service/credentials/BeginCreateCredentialResponse.java @@ -34,6 +34,14 @@ public final class BeginCreateCredentialResponse implements Parcelable { private final @NonNull List mCreateEntries; private final @Nullable CreateEntry mRemoteCreateEntry; + /** + * Creates an empty response instance, to be used when there are no {@link CreateEntry} + * to return. + */ + public BeginCreateCredentialResponse() { + this(/*createEntries=*/new ArrayList<>(), /*remoteCreateEntry=*/null); + } + private BeginCreateCredentialResponse(@NonNull Parcel in) { List createEntries = new ArrayList<>(); in.readTypedList(createEntries, CreateEntry.CREATOR); @@ -137,13 +145,8 @@ public final class BeginCreateCredentialResponse implements Parcelable { /** * Builds a new instance of {@link BeginCreateCredentialResponse}. - * - * @throws NullPointerException If {@code createEntries} is null. - * @throws IllegalArgumentException If {@code createEntries} is empty. */ public @NonNull BeginCreateCredentialResponse build() { - Preconditions.checkCollectionNotEmpty(mCreateEntries, "createEntries must " - + "not be null, or empty"); return new BeginCreateCredentialResponse(mCreateEntries, mRemoteCreateEntry); } } diff --git a/core/java/android/service/credentials/BeginGetCredentialResponse.java b/core/java/android/service/credentials/BeginGetCredentialResponse.java index 0f64c63d56fb9..3652742d4ff4d 100644 --- a/core/java/android/service/credentials/BeginGetCredentialResponse.java +++ b/core/java/android/service/credentials/BeginGetCredentialResponse.java @@ -44,6 +44,17 @@ public final class BeginGetCredentialResponse implements Parcelable { /** Remote credential entry to get the response from a different device. */ private final @Nullable CredentialEntry mRemoteCredentialEntry; + /** + * Creates an empty response instance, to be used when there are no {@link CredentialEntry}, + * or {@link Action} to return. + */ + public BeginGetCredentialResponse() { + this(/*credentialEntries=*/new ArrayList<>(), + /*authenticationActions=*/new ArrayList<>(), + /*actions=*/new ArrayList<>(), + /*remoteCredentialEntry=*/null); + } + private BeginGetCredentialResponse(@NonNull List credentialEntries, @NonNull List authenticationEntries, @NonNull List actions, @Nullable CredentialEntry remoteCredentialEntry) { @@ -243,16 +254,8 @@ public final class BeginGetCredentialResponse implements Parcelable { /** * Builds a {@link BeginGetCredentialResponse} instance. - * - * @throws IllegalStateException if {@code credentialEntries}, {@code actions} - * and {@code remoteCredentialEntry} are all null or empty. */ public @NonNull BeginGetCredentialResponse build() { - if (mCredentialEntries.isEmpty() && mActions.isEmpty() - && mRemoteCredentialEntry == null && mAuthenticationEntries.isEmpty()) { - throw new IllegalStateException("must set either an authentication, " - + "credential, action or remote entry"); - } return new BeginGetCredentialResponse(mCredentialEntries, mAuthenticationEntries, mActions, mRemoteCredentialEntry); } diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java index 2345e3f5a3f00..c8518c5587a8f 100644 --- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java @@ -97,7 +97,7 @@ public final class CreateRequestSession extends RequestSession PENDING_INTENT_INVOKED, CREDENTIAL_RECEIVED_FROM_SELECTION, SAVE_ENTRIES_RECEIVED, CANCELED, - NO_CREDENTIALS, COMPLETE + NO_CREDENTIALS, EMPTY_RESPONSE, COMPLETE } /** Converts exception to a provider session status. */ diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java index 9f1bd8f69ddec..fdd0e81db9d93 100644 --- a/services/credentials/java/com/android/server/credentials/RequestSession.java +++ b/services/credentials/java/com/android/server/credentials/RequestSession.java @@ -144,6 +144,11 @@ abstract class RequestSession implements CredentialManagerUi.CredentialMan finishSession(/*propagateCancellation=*/false); } + @Override + public void onUiSelectorInvocationFailure() { + Log.i(TAG, "onUiSelectorInvocationFailure"); + } + protected void finishSession(boolean propagateCancellation) { Log.i(TAG, "finishing session"); if (propagateCancellation) {