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

Commit ba7a8847 authored by Tim Yu's avatar Tim Yu
Browse files

API to allow Autofill Providers to give detection results to PCC.

Bug: 261106877
Test: atest android.autofillservice.cts.unittests.FillResponseTest
Change-Id: I58db4be31ea13327576bb097dd77b916f721b43a
parent 6fe6b182
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -39547,6 +39547,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<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...);
+1 −0
Original line number Diff line number Diff line
@@ -2537,6 +2537,7 @@ package android.service.autofill {
  }

  public final class FillResponse implements android.os.Parcelable {
    method @NonNull public java.util.Set<android.service.assist.classification.FieldClassification> getDetectedFieldClassifications();
    method public int getFlags();
  }

+40 −0
Original line number Diff line number Diff line
@@ -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<FieldClassification> 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<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 @@ 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());