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

Commit 5e7be029 authored by Helen Qin's avatar Helen Qin Committed by Android (Google) Code Review
Browse files

Merge "[Credential Manager] Expose CredMan Selection UI invocation APIs as system APIs" into main

parents 1ac3c2ba 519e96ae
Loading
Loading
Loading
Loading
+99 −0
Original line number Diff line number Diff line
@@ -4397,6 +4397,59 @@ package android.content.rollback {
package android.credentials.selection {
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class AuthenticationEntry implements android.os.Parcelable {
    ctor public AuthenticationEntry(@NonNull String, @NonNull String, @NonNull android.app.slice.Slice, int, @NonNull android.content.Intent);
    method public int describeContents();
    method @Nullable public android.content.Intent getFrameworkExtrasIntent();
    method @NonNull public String getKey();
    method @NonNull public android.app.slice.Slice getSlice();
    method @NonNull public int getStatus();
    method @NonNull public String getSubkey();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.AuthenticationEntry> CREATOR;
    field public static final int STATUS_LOCKED = 0; // 0x0
    field public static final int STATUS_UNLOCKED_BUT_EMPTY_LESS_RECENT = 1; // 0x1
    field public static final int STATUS_UNLOCKED_BUT_EMPTY_MOST_RECENT = 2; // 0x2
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class CancelSelectionRequest implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public String getAppPackageName();
    method @NonNull public android.credentials.selection.RequestToken getRequestToken();
    method public boolean shouldShowCancellationExplanation();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.CancelSelectionRequest> CREATOR;
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class CreateCredentialProviderInfo {
    method @NonNull public String getProviderName();
    method @Nullable public android.credentials.selection.Entry getRemoteEntry();
    method @NonNull public java.util.List<android.credentials.selection.Entry> getSaveEntries();
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public static final class CreateCredentialProviderInfo.Builder {
    ctor public CreateCredentialProviderInfo.Builder(@NonNull String);
    method @NonNull public android.credentials.selection.CreateCredentialProviderInfo build();
    method @NonNull public android.credentials.selection.CreateCredentialProviderInfo.Builder setRemoteEntry(@Nullable android.credentials.selection.Entry);
    method @NonNull public android.credentials.selection.CreateCredentialProviderInfo.Builder setSaveEntries(@NonNull java.util.List<android.credentials.selection.Entry>);
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class DisabledProviderInfo {
    ctor public DisabledProviderInfo(@NonNull String);
    method @NonNull public String getProviderName();
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class Entry implements android.os.Parcelable {
    ctor public Entry(@NonNull String, @NonNull String, @NonNull android.app.slice.Slice, @NonNull android.content.Intent);
    method public int describeContents();
    method @Nullable public android.content.Intent getFrameworkExtrasIntent();
    method @NonNull public String getKey();
    method @NonNull public android.app.slice.Slice getSlice();
    method @NonNull public String getSubkey();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.Entry> CREATOR;
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class FailureResult {
    ctor public FailureResult(int, @Nullable String);
    method public int getErrorCode();
@@ -4406,6 +4459,32 @@ package android.credentials.selection {
    field public static final int ERROR_CODE_UI_FAILURE = 0; // 0x0
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class GetCredentialProviderInfo {
    method @NonNull public java.util.List<android.credentials.selection.Entry> getActionChips();
    method @NonNull public java.util.List<android.credentials.selection.AuthenticationEntry> getAuthenticationEntries();
    method @NonNull public java.util.List<android.credentials.selection.Entry> getCredentialEntries();
    method @NonNull public String getProviderName();
    method @Nullable public android.credentials.selection.Entry getRemoteEntry();
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public static final class GetCredentialProviderInfo.Builder {
    ctor public GetCredentialProviderInfo.Builder(@NonNull String);
    method @NonNull public android.credentials.selection.GetCredentialProviderInfo build();
    method @NonNull public android.credentials.selection.GetCredentialProviderInfo.Builder setActionChips(@NonNull java.util.List<android.credentials.selection.Entry>);
    method @NonNull public android.credentials.selection.GetCredentialProviderInfo.Builder setAuthenticationEntries(@NonNull java.util.List<android.credentials.selection.AuthenticationEntry>);
    method @NonNull public android.credentials.selection.GetCredentialProviderInfo.Builder setCredentialEntries(@NonNull java.util.List<android.credentials.selection.Entry>);
    method @NonNull public android.credentials.selection.GetCredentialProviderInfo.Builder setRemoteEntry(@Nullable android.credentials.selection.Entry);
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class IntentHelper {
    method @Nullable public static android.credentials.selection.CancelSelectionRequest extractCancelUiRequest(@NonNull android.content.Intent);
    method @NonNull public static java.util.List<android.credentials.selection.CreateCredentialProviderInfo> extractCreateCredentialProviderInfoList(@NonNull android.content.Intent);
    method @NonNull public static java.util.List<android.credentials.selection.DisabledProviderInfo> extractDisabledProviderInfoList(@NonNull android.content.Intent);
    method @NonNull public static java.util.List<android.credentials.selection.GetCredentialProviderInfo> extractGetCredentialProviderInfoList(@NonNull android.content.Intent);
    method @Nullable public static android.credentials.selection.RequestInfo extractRequestInfo(@NonNull android.content.Intent);
    method @Nullable public static android.os.ResultReceiver extractResultReceiver(@NonNull android.content.Intent);
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class ProviderPendingIntentResponse implements android.os.Parcelable {
    ctor public ProviderPendingIntentResponse(int, @Nullable android.content.Intent);
    method public int describeContents();
@@ -4415,6 +4494,26 @@ package android.credentials.selection {
    field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.ProviderPendingIntentResponse> CREATOR;
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class RequestInfo implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public String getAppPackageName();
    method @Nullable public android.credentials.CreateCredentialRequest getCreateCredentialRequest();
    method @NonNull public java.util.List<java.lang.String> getDefaultProviderIds();
    method @Nullable public android.credentials.GetCredentialRequest getGetCredentialRequest();
    method @NonNull public java.util.List<java.lang.String> getRegistryProviderIds();
    method @NonNull public android.credentials.selection.RequestToken getRequestToken();
    method @NonNull public String getType();
    method public boolean hasPermissionToOverrideDefault();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.RequestInfo> CREATOR;
    field @NonNull public static final String TYPE_CREATE = "android.credentials.selection.TYPE_CREATE";
    field @NonNull public static final String TYPE_GET = "android.credentials.selection.TYPE_GET";
    field @NonNull public static final String TYPE_UNDEFINED = "android.credentials.selection.TYPE_UNDEFINED";
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class RequestToken {
  }
  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class ResultHelper {
    method public static void sendFailureResult(@NonNull android.os.ResultReceiver, @NonNull android.credentials.selection.FailureResult);
    method public static void sendUserSelectionResult(@NonNull android.os.ResultReceiver, @NonNull android.credentials.selection.UserSelectionResult);
+11 −48
Original line number Diff line number Diff line
@@ -1267,22 +1267,6 @@ package android.credentials {

package android.credentials.selection {

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class AuthenticationEntry implements android.os.Parcelable {
    ctor public AuthenticationEntry(@NonNull String, @NonNull String, @NonNull android.app.slice.Slice, int);
    ctor public AuthenticationEntry(@NonNull String, @NonNull String, @NonNull android.app.slice.Slice, int, @NonNull android.content.Intent);
    method public int describeContents();
    method @Nullable public android.content.Intent getFrameworkExtrasIntent();
    method @NonNull public String getKey();
    method @NonNull public android.app.slice.Slice getSlice();
    method @NonNull public int getStatus();
    method @NonNull public String getSubkey();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.AuthenticationEntry> CREATOR;
    field public static final int STATUS_LOCKED = 0; // 0x0
    field public static final int STATUS_UNLOCKED_BUT_EMPTY_LESS_RECENT = 1; // 0x1
    field public static final int STATUS_UNLOCKED_BUT_EMPTY_MOST_RECENT = 2; // 0x2
  }

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public class BaseDialogResult implements android.os.Parcelable {
    ctor public BaseDialogResult(@Nullable android.os.IBinder);
    ctor protected BaseDialogResult(@NonNull android.os.Parcel);
@@ -1298,6 +1282,10 @@ package android.credentials.selection {
    field public static final int RESULT_CODE_DIALOG_USER_CANCELED = 0; // 0x0
  }

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class CancelSelectionRequest implements android.os.Parcelable {
    ctor @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public CancelSelectionRequest(@NonNull android.os.IBinder, boolean, @NonNull String);
  }

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class CreateCredentialProviderData extends android.credentials.selection.ProviderData implements android.os.Parcelable {
    ctor public CreateCredentialProviderData(@NonNull String, @NonNull java.util.List<android.credentials.selection.Entry>, @Nullable android.credentials.selection.Entry);
    method @Nullable public android.credentials.selection.Entry getRemoteEntry();
@@ -1317,19 +1305,6 @@ package android.credentials.selection {
    field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.DisabledProviderData> CREATOR;
  }

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class Entry implements android.os.Parcelable {
    ctor public Entry(@NonNull String, @NonNull String, @NonNull android.app.slice.Slice);
    ctor public Entry(@NonNull String, @NonNull String, @NonNull android.app.slice.Slice, @NonNull android.content.Intent);
    method public int describeContents();
    method @Nullable public android.content.Intent getFrameworkExtrasIntent();
    method @NonNull public String getKey();
    method @Nullable public android.app.PendingIntent getPendingIntent();
    method @NonNull public android.app.slice.Slice getSlice();
    method @NonNull public String getSubkey();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.Entry> CREATOR;
  }

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class FailureDialogResult extends android.credentials.selection.BaseDialogResult implements android.os.Parcelable {
    ctor public FailureDialogResult(@Nullable android.os.IBinder, @Nullable String);
    method public static void addToBundle(@NonNull android.credentials.selection.FailureDialogResult, @NonNull android.os.Bundle);
@@ -1357,6 +1332,7 @@ package android.credentials.selection {
  }

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public class IntentFactory {
    method @NonNull public static android.content.Intent createCancelUiIntent(@NonNull android.os.IBinder, boolean, @NonNull String);
    method @NonNull public static android.content.Intent createCredentialSelectorIntent(@NonNull android.credentials.selection.RequestInfo, @NonNull java.util.ArrayList<android.credentials.selection.ProviderData>, @NonNull java.util.ArrayList<android.credentials.selection.DisabledProviderData>, @NonNull android.os.ResultReceiver);
  }

@@ -1371,25 +1347,12 @@ package android.credentials.selection {
  }

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class RequestInfo implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public String getAppPackageName();
    method @Nullable public android.credentials.CreateCredentialRequest getCreateCredentialRequest();
    method @NonNull public java.util.List<java.lang.String> getDefaultProviderIds();
    method @Nullable public android.credentials.GetCredentialRequest getGetCredentialRequest();
    method @NonNull public java.util.List<java.lang.String> getRegistryProviderIds();
    method @NonNull public android.os.IBinder getToken();
    method @NonNull public String getType();
    method public boolean hasPermissionToOverrideDefault();
    method @NonNull public static android.credentials.selection.RequestInfo newCreateRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.CreateCredentialRequest, @NonNull String);
    method @NonNull public static android.credentials.selection.RequestInfo newCreateRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.CreateCredentialRequest, @NonNull String, boolean, @NonNull java.util.List<java.lang.String>);
    method @NonNull public static android.credentials.selection.RequestInfo newGetRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.GetCredentialRequest, @NonNull String, boolean);
    method @NonNull public static android.credentials.selection.RequestInfo newGetRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.GetCredentialRequest, @NonNull String);
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.credentials.selection.RequestInfo> CREATOR;
    field @NonNull public static final String EXTRA_REQUEST_INFO = "android.credentials.selection.extra.REQUEST_INFO";
    field @NonNull public static final String TYPE_CREATE = "android.credentials.selection.TYPE_CREATE";
    field @NonNull public static final String TYPE_GET = "android.credentials.selection.TYPE_GET";
    field @NonNull public static final String TYPE_UNDEFINED = "android.credentials.selection.TYPE_UNDEFINED";
    method @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") @NonNull public static android.credentials.selection.RequestInfo newCreateRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.CreateCredentialRequest, @NonNull String, boolean, @NonNull java.util.List<java.lang.String>);
    method @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") @NonNull public static android.credentials.selection.RequestInfo newGetRequestInfo(@NonNull android.os.IBinder, @NonNull android.credentials.GetCredentialRequest, @NonNull String, boolean);
  }

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class RequestToken {
    ctor @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public RequestToken(@NonNull android.os.IBinder);
  }

  @FlaggedApi("android.credentials.flags.configurable_selector_ui_enabled") public final class UserSelectionDialogResult extends android.credentials.selection.BaseDialogResult implements android.os.Parcelable {
+52 −22
Original line number Diff line number Diff line
@@ -23,9 +23,13 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
import android.annotation.SystemApi;
import android.app.slice.Slice;
import android.content.Context;
import android.content.Intent;
import android.credentials.GetCredentialRequest;
import android.os.CancellationSignal;
import android.os.OutcomeReceiver;
import android.os.Parcel;
import android.os.Parcelable;

@@ -33,17 +37,20 @@ import com.android.internal.util.AnnotationValidations;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.concurrent.Executor;

/**
 * An authentication entry.
 *
 * Applicable only for credential retrieval flow, authentication entries are a special type of
 * entries that require the user to unlock the given provider before its credential options can
 * be fully rendered.
 * Applicable only for
 * {@link android.credentials.CredentialManager#getCredential(Context, GetCredentialRequest,
 * CancellationSignal, Executor, OutcomeReceiver)} flow, authentication entries are a special type
 * of entries that require the user to unlock the given provider before its credential options
 * can be fully rendered.
 *
 * @hide
 */
@TestApi
@SystemApi
@FlaggedApi(FLAG_CONFIGURABLE_SELECTOR_UI_ENABLED)
public final class AuthenticationEntry implements Parcelable {
    @NonNull
@@ -67,17 +74,31 @@ public final class AuthenticationEntry implements Parcelable {
    public @interface Status {
    }

    /** This entry is still locked, as initially supplied by the provider. */
    /**
     * This entry is still locked, as initially supplied by the provider.
     *
     * This entry should be rendered in a way to signal that it is still locked, and when chosen
     * will lead to an unlock challenge (e.g. draw a trailing lock icon on this entry).
     */
    public static final int STATUS_LOCKED = 0;
    /**
     * This entry was unlocked but didn't contain any credential. Meanwhile, "less recent" means
     * there is another such entry that was unlocked more recently.
     *
     * This entry should be rendered in a way to signal that it was unlocked but turns out to
     * contain no credential that can be used, and as a result, it should be unclickable.
     */
    public static final int STATUS_UNLOCKED_BUT_EMPTY_LESS_RECENT = 1;
    /**
     * This is the most recent entry that was unlocked but didn't contain any credential.
     *
     * There will be at most one authentication entry with this status.
     *
     * This entry should be rendered in a way to signal that it was unlocked but turns out to
     * contain no credential that can be used, and as a result, it should be unclickable.
     *
     * If this was the last clickable option prior to unlocking, then the UI should display an
     * information that all options are exhausted then gracefully finish itself.
     */
    public static final int STATUS_UNLOCKED_BUT_EMPTY_MOST_RECENT = 2;

@@ -94,29 +115,36 @@ public final class AuthenticationEntry implements Parcelable {
    }

    /**
     * Constructor to be used for an entry that does not require further activities
     * to be invoked when selected.
     * Constructor to be used for an entry that requires a pending intent to be invoked
     * when clicked.
     *
     * @param key    the identifier of this entry that's unique within the context of the given
     *               CredentialManager request. This is used when constructing the
     *               {@link android.credentials.selection.UserSelectionResult#UserSelectionResult(
     *                String providerId, String entryKey, String entrySubkey,
     *                ProviderPendingIntentResponse providerPendingIntentResponse)}
     *
     * @param subkey the sub-identifier of this entry that's unique within the context of the
     *               {@code key}. This is used when constructing the
     *               {@link android.credentials.selection.UserSelectionResult#UserSelectionResult(
     *                String providerId, String entryKey, String entrySubkey,
     *                ProviderPendingIntentResponse providerPendingIntentResponse)}
     * @param intent the intent containing extra data that has to be filled in when launching this
     *               entry's provider PendingIntent
     * @param slice  the Slice to be displayed
     * @param status the entry status, depending on which the entry should be rendered differently
     */
    // TODO(b/322065508): remove this constructor.
    public AuthenticationEntry(@NonNull String key, @NonNull String subkey, @NonNull Slice slice,
            @Status int status) {
            @Status int status, @NonNull Intent intent) {
        mKey = key;
        mSubkey = subkey;
        mSlice = slice;
        mStatus = status;
    }

    /** Constructor to be used for an entry that requires a pending intent to be invoked
     * when clicked.
     */
    public AuthenticationEntry(@NonNull String key, @NonNull String subkey, @NonNull Slice slice,
            @Status int status, @NonNull Intent intent) {
        this(key, subkey, slice, status);
        mFrameworkExtrasIntent = intent;
    }

    /**
     * Returns the identifier of this entry that's unique within the context of the
     * Returns the identifier of this entry that's unique within the context of the given
     * CredentialManager request.
     */
    @NonNull
@@ -138,7 +166,7 @@ public final class AuthenticationEntry implements Parcelable {
        return mSlice;
    }

    /** Returns the entry status, depending on which the entry will be rendered differently. */
    /** Returns the entry status, depending on which the entry should be rendered differently. */
    @NonNull
    @Status
    public int getStatus() {
@@ -146,8 +174,10 @@ public final class AuthenticationEntry implements Parcelable {
    }

    /**
     * Returns the framework intent to be filled in when launching this entry's provider
     * PendingIntent.
     * Returns the intent containing extra data that has to be filled in when launching this
     * entry's provider PendingIntent.
     *
     * If null, the provider PendingIntent can be launched without any fill in intent.
     */
    @Nullable
    @SuppressLint("IntentBuilderName") // Not building a new intent.
+147 −0

File changed and moved.

Preview size limit exceeded, changes collapsed.

+6 −3
Original line number Diff line number Diff line
@@ -118,9 +118,12 @@ public final class CreateCredentialProviderData extends ProviderData implements
    @TestApi
    @FlaggedApi(FLAG_CONFIGURABLE_SELECTOR_UI_ENABLED)
    public static final class Builder {
        @NonNull private String mProviderFlattenedComponentName;
        @NonNull private List<Entry> mSaveEntries = new ArrayList<>();
        @Nullable private Entry mRemoteEntry = null;
        @NonNull
        private String mProviderFlattenedComponentName;
        @NonNull
        private List<Entry> mSaveEntries = new ArrayList<>();
        @Nullable
        private Entry mRemoteEntry = null;

        /** Constructor with required properties. */
        public Builder(@NonNull String providerFlattenedComponentName) {
Loading