diff --git a/core/api/current.txt b/core/api/current.txt index ed81918a63f41..f0bcf2ba2e2e4 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) {