From 37cf60dd0beba0ecfd281a77806ae381afb17b26 Mon Sep 17 00:00:00 2001 From: Haoran Zhang Date: Thu, 11 Jan 2024 01:03:05 +0000 Subject: [Autofill-Credman] Adding a pending intent field in fill response. The proxy service can set this intent field in fill response so framework would start the intent and display the credential selector UI. Bug: b/319521495 Test: atest CtsAutofillServiceTestCases Change-Id: Id6da629587047f52a7282cc9a6ee8a38b236fe47 --- .../android/service/autofill/FillResponse.java | 37 ++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java index 7ea74d375ffb..09ec933880d4 100644 --- a/core/java/android/service/autofill/FillResponse.java +++ b/core/java/android/service/autofill/FillResponse.java @@ -28,6 +28,7 @@ import android.annotation.StringRes; import android.annotation.SuppressLint; import android.annotation.TestApi; import android.app.Activity; +import android.app.PendingIntent; import android.content.Intent; import android.content.IntentSender; import android.content.pm.ParceledListSlice; @@ -116,6 +117,7 @@ public final class FillResponse implements Parcelable { private final boolean mShowFillDialogIcon; private final boolean mShowSaveDialogIcon; private final @Nullable FieldClassification[] mDetectedFieldTypes; + private final @Nullable PendingIntent mDialogPendingIntent; /** * Creates a shollow copy of the provided FillResponse. @@ -150,7 +152,8 @@ public final class FillResponse implements Parcelable { r.mServiceDisplayNameResourceId, r.mShowFillDialogIcon, r.mShowSaveDialogIcon, - r.mDetectedFieldTypes); + r.mDetectedFieldTypes, + r.mDialogPendingIntent); } private FillResponse(ParceledListSlice datasets, SaveInfo saveInfo, Bundle clientState, @@ -163,7 +166,7 @@ public final class FillResponse implements Parcelable { int[] cancelIds, boolean supportsInlineSuggestions, int iconResourceId, int serviceDisplayNameResourceId, boolean showFillDialogIcon, boolean showSaveDialogIcon, - FieldClassification[] detectedFieldTypes) { + FieldClassification[] detectedFieldTypes, PendingIntent dialogPendingIntent) { mDatasets = datasets; mSaveInfo = saveInfo; mClientState = clientState; @@ -190,6 +193,7 @@ public final class FillResponse implements Parcelable { mShowFillDialogIcon = showFillDialogIcon; mShowSaveDialogIcon = showSaveDialogIcon; mDetectedFieldTypes = detectedFieldTypes; + mDialogPendingIntent = dialogPendingIntent; } private FillResponse(@NonNull Builder builder) { @@ -219,6 +223,7 @@ public final class FillResponse implements Parcelable { mShowFillDialogIcon = builder.mShowFillDialogIcon; mShowSaveDialogIcon = builder.mShowSaveDialogIcon; mDetectedFieldTypes = builder.mDetectedFieldTypes; + mDialogPendingIntent = builder.mDialogPendingIntent; } /** @hide */ @@ -399,6 +404,7 @@ public final class FillResponse implements Parcelable { private boolean mShowFillDialogIcon = true; private boolean mShowSaveDialogIcon = true; private FieldClassification[] mDetectedFieldTypes; + private PendingIntent mDialogPendingIntent; /** * Adds a new {@link FieldClassification} to this response, to @@ -1078,6 +1084,24 @@ public final class FillResponse implements Parcelable { return this; } + /** + * Sets credential dialog pending intent. Framework will use the intent to launch the + * selector UI. A replacement for previous fill bottom sheet. + * + * @throws IllegalStateException if {@link #build()} was already called. + * @throws NullPointerException if {@code pendingIntent} is {@code null}. + * + * @hide + */ + @NonNull + public Builder setDialogPendingIntent(@NonNull PendingIntent pendingIntent) { + throwIfDestroyed(); + Preconditions.checkNotNull(pendingIntent, + "can't pass a null object to setDialogPendingIntent"); + mDialogPendingIntent = pendingIntent; + return this; + } + /** * Builds a new {@link FillResponse} instance. * @@ -1187,6 +1211,9 @@ public final class FillResponse implements Parcelable { if (mAuthentication != null) { builder.append(", hasAuthentication"); } + if (mDialogPendingIntent != null) { + builder.append(", hasDialogPendingIntent"); + } if (mAuthenticationIds != null) { builder.append(", authenticationIds=").append(Arrays.toString(mAuthenticationIds)); } @@ -1232,6 +1259,7 @@ public final class FillResponse implements Parcelable { parcel.writeParcelable(mInlineTooltipPresentation, flags); parcel.writeParcelable(mDialogPresentation, flags); parcel.writeParcelable(mDialogHeader, flags); + parcel.writeParcelable(mDialogPendingIntent, flags); parcel.writeParcelableArray(mFillDialogTriggerIds, flags); parcel.writeParcelable(mHeader, flags); parcel.writeParcelable(mFooter, flags); @@ -1282,6 +1310,11 @@ public final class FillResponse implements Parcelable { if (dialogHeader != null) { builder.setDialogHeader(dialogHeader); } + final PendingIntent dialogPendingIntent = parcel.readParcelable(null, + PendingIntent.class); + if (dialogPendingIntent != null) { + builder.setDialogPendingIntent(dialogPendingIntent); + } final AutofillId[] triggerIds = parcel.readParcelableArray(null, AutofillId.class); if (triggerIds != null) { builder.setFillDialogTriggerIds(triggerIds); -- cgit v1.2.3-59-g8ed1b