diff --git a/core/api/current.txt b/core/api/current.txt index 33af0ea69426b..896d13a0e86fd 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -39613,6 +39613,7 @@ package android.service.autofill { method @Deprecated @NonNull public android.service.autofill.FillResponse.Builder setAuthentication(@NonNull android.view.autofill.AutofillId[], @Nullable android.content.IntentSender, @Nullable android.widget.RemoteViews, @Nullable android.service.autofill.InlinePresentation, @Nullable android.service.autofill.InlinePresentation); method @NonNull public android.service.autofill.FillResponse.Builder setAuthentication(@NonNull android.view.autofill.AutofillId[], @Nullable android.content.IntentSender, @Nullable android.service.autofill.Presentations); method @NonNull public android.service.autofill.FillResponse.Builder setClientState(@Nullable android.os.Bundle); + method @NonNull public android.service.autofill.FillResponse.Builder setDetectedFieldClassifications(@NonNull java.util.Set); method @NonNull public android.service.autofill.FillResponse.Builder setDialogHeader(@NonNull android.widget.RemoteViews); method @NonNull public android.service.autofill.FillResponse.Builder setFieldClassificationIds(@NonNull android.view.autofill.AutofillId...); method @NonNull public android.service.autofill.FillResponse.Builder setFillDialogTriggerIds(@NonNull android.view.autofill.AutofillId...); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 908d167e89d86..51e90d28abdc9 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2550,6 +2550,7 @@ package android.service.autofill { } public final class FillResponse implements android.os.Parcelable { + method @NonNull public java.util.Set getDetectedFieldClassifications(); method public int getFlags(); } diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java index 385b0aa8b867a..fa7ace3bbe0d7 100644 --- a/core/java/android/service/autofill/FillResponse.java +++ b/core/java/android/service/autofill/FillResponse.java @@ -34,6 +34,7 @@ import android.content.pm.ParceledListSlice; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; +import android.service.assist.classification.FieldClassification; import android.view.autofill.AutofillId; import android.widget.RemoteViews; @@ -45,6 +46,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.Set; /** * Response for an {@link @@ -113,6 +115,7 @@ public final class FillResponse implements Parcelable { private final @StringRes int mServiceDisplayNameResourceId; private final boolean mShowFillDialogIcon; private final boolean mShowSaveDialogIcon; + private final @Nullable FieldClassification[] mDetectedFieldTypes; private FillResponse(@NonNull Builder builder) { mDatasets = (builder.mDatasets != null) ? new ParceledListSlice<>(builder.mDatasets) : null; @@ -140,6 +143,14 @@ public final class FillResponse implements Parcelable { mServiceDisplayNameResourceId = builder.mServiceDisplayNameResourceId; mShowFillDialogIcon = builder.mShowFillDialogIcon; mShowSaveDialogIcon = builder.mShowSaveDialogIcon; + mDetectedFieldTypes = builder.mDetectedFieldTypes; + } + + /** @hide */ + @TestApi + @NonNull + public Set getDetectedFieldClassifications() { + return Set.of(mDetectedFieldTypes); } /** @hide */ @@ -312,6 +323,28 @@ public final class FillResponse implements Parcelable { private int mServiceDisplayNameResourceId; private boolean mShowFillDialogIcon = true; private boolean mShowSaveDialogIcon = true; + private FieldClassification[] mDetectedFieldTypes; + + /** + * Adds a new {@link FieldClassification} to this response, to + * help the platform provide more accurate detection results. + * + * Call this when a field has been detected with a type. + * + * Altough similiarly named with {@link setFieldClassificationIds}, + * it provides a different functionality - setFieldClassificationIds should + * be used when a field is only suspected to be Autofillable. + * This method should be used when a field is certainly Autofillable + * with a certain type. + */ + @NonNull + public Builder setDetectedFieldClassifications( + @NonNull Set fieldInfos) { + throwIfDestroyed(); + throwIfDisableAutofillCalled(); + mDetectedFieldTypes = fieldInfos.toArray(new FieldClassification[0]); + return this; + } /** * Triggers a custom UI before autofilling the screen with any data set in this @@ -1122,6 +1155,7 @@ public final class FillResponse implements Parcelable { parcel.writeParcelableArray(mIgnoredIds, flags); parcel.writeLong(mDisableDuration); parcel.writeParcelableArray(mFieldClassificationIds, flags); + parcel.writeParcelableArray(mDetectedFieldTypes, flags); parcel.writeInt(mIconResourceId); parcel.writeInt(mServiceDisplayNameResourceId); parcel.writeBoolean(mShowFillDialogIcon); @@ -1192,6 +1226,12 @@ public final class FillResponse implements Parcelable { builder.setFieldClassificationIds(fieldClassifactionIds); } + final FieldClassification[] detectedFields = + parcel.readParcelableArray(null, FieldClassification.class); + if (detectedFields != null) { + builder.setDetectedFieldClassifications(Set.of(detectedFields)); + } + builder.setIconResourceId(parcel.readInt()); builder.setServiceDisplayNameResourceId(parcel.readInt()); builder.setShowFillDialogIcon(parcel.readBoolean());