API to allow Autofill Providers to give detection results to PCC.
Bug: 261106877
Test: atest android.autofillservice.cts.unittests.FillResponseTest
Change-Id: I58db4be31ea13327576bb097dd77b916f721b43a
diff --git a/core/api/current.txt b/core/api/current.txt
index 9851428..e223f2b 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -39547,6 +39547,7 @@
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<android.service.assist.classification.FieldClassification>);
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 2f5e820..fc629fb 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -2537,6 +2537,7 @@
}
public final class FillResponse implements android.os.Parcelable {
+ method @NonNull public java.util.Set<android.service.assist.classification.FieldClassification> getDetectedFieldClassifications();
method public int getFlags();
}
diff --git a/core/java/android/service/autofill/FillResponse.java b/core/java/android/service/autofill/FillResponse.java
index 385b0aa..fa7ace3 100644
--- a/core/java/android/service/autofill/FillResponse.java
+++ b/core/java/android/service/autofill/FillResponse.java
@@ -34,6 +34,7 @@
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.Arrays;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
/**
* Response for an {@link
@@ -113,6 +115,7 @@
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 @@
mServiceDisplayNameResourceId = builder.mServiceDisplayNameResourceId;
mShowFillDialogIcon = builder.mShowFillDialogIcon;
mShowSaveDialogIcon = builder.mShowSaveDialogIcon;
+ mDetectedFieldTypes = builder.mDetectedFieldTypes;
+ }
+
+ /** @hide */
+ @TestApi
+ @NonNull
+ public Set<FieldClassification> getDetectedFieldClassifications() {
+ return Set.of(mDetectedFieldTypes);
}
/** @hide */
@@ -312,6 +323,28 @@
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<FieldClassification> 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 @@
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 @@
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());