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

Commit 2cc31467 authored by Adam He's avatar Adam He
Browse files

Add support for app specific field classification.

Change-Id: I03e597235f66bf53fd4af39760f0d1136c7da48b
Fixes: 118617202
Test: atest CtsAutoFillServiceTestCases
Test: atest android.autofillservice.cts.FieldsClassificationTest
parent ddc2f878
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -40007,6 +40007,7 @@ package android.service.autofill {
    method public android.service.autofill.FillResponse.Builder setHeader(android.widget.RemoteViews);
    method public android.service.autofill.FillResponse.Builder setHeader(android.widget.RemoteViews);
    method public android.service.autofill.FillResponse.Builder setIgnoredIds(android.view.autofill.AutofillId...);
    method public android.service.autofill.FillResponse.Builder setIgnoredIds(android.view.autofill.AutofillId...);
    method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
    method public android.service.autofill.FillResponse.Builder setSaveInfo(android.service.autofill.SaveInfo);
    method public android.service.autofill.FillResponse.Builder setUserData(android.service.autofill.UserData);
  }
  }
  public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation {
  public final class ImageTransformation implements android.os.Parcelable android.service.autofill.Transformation {
+1 −1
Original line number Original line Diff line number Diff line
@@ -175,7 +175,7 @@ public abstract class AutofillFieldClassificationService extends Service {
    public float[][] onGetScores(@Nullable String algorithm,
    public float[][] onGetScores(@Nullable String algorithm,
            @Nullable Bundle algorithmOptions, @NonNull List<AutofillValue> actualValues,
            @Nullable Bundle algorithmOptions, @NonNull List<AutofillValue> actualValues,
            @NonNull List<String> userDataValues) {
            @NonNull List<String> userDataValues) {
        Log.e(TAG, "service implementation (" + getClass() + " does not implement onGetScore()");
        Log.e(TAG, "service implementation (" + getClass() + " does not implement onGetScores()");
        return null;
        return null;
    }
    }


+31 −0
Original line number Original line Diff line number Diff line
@@ -84,6 +84,7 @@ public final class FillResponse implements Parcelable {
    private final @Nullable AutofillId[] mFieldClassificationIds;
    private final @Nullable AutofillId[] mFieldClassificationIds;
    private final int mFlags;
    private final int mFlags;
    private int mRequestId;
    private int mRequestId;
    private final @Nullable UserData mUserData;


    private FillResponse(@NonNull Builder builder) {
    private FillResponse(@NonNull Builder builder) {
        mDatasets = (builder.mDatasets != null) ? new ParceledListSlice<>(builder.mDatasets) : null;
        mDatasets = (builder.mDatasets != null) ? new ParceledListSlice<>(builder.mDatasets) : null;
@@ -99,6 +100,7 @@ public final class FillResponse implements Parcelable {
        mFieldClassificationIds = builder.mFieldClassificationIds;
        mFieldClassificationIds = builder.mFieldClassificationIds;
        mFlags = builder.mFlags;
        mFlags = builder.mFlags;
        mRequestId = INVALID_REQUEST_ID;
        mRequestId = INVALID_REQUEST_ID;
        mUserData = builder.mUserData;
    }
    }


    /** @hide */
    /** @hide */
@@ -156,6 +158,11 @@ public final class FillResponse implements Parcelable {
        return mFieldClassificationIds;
        return mFieldClassificationIds;
    }
    }


    /** @hide */
    public @Nullable UserData getUserData() {
        return mUserData;
    }

    /** @hide */
    /** @hide */
    @TestApi
    @TestApi
    public int getFlags() {
    public int getFlags() {
@@ -198,6 +205,7 @@ public final class FillResponse implements Parcelable {
        private AutofillId[] mFieldClassificationIds;
        private AutofillId[] mFieldClassificationIds;
        private int mFlags;
        private int mFlags;
        private boolean mDestroyed;
        private boolean mDestroyed;
        private UserData mUserData;


        /**
        /**
         * Triggers a custom UI before before autofilling the screen with any data set in this
         * Triggers a custom UI before before autofilling the screen with any data set in this
@@ -505,6 +513,21 @@ public final class FillResponse implements Parcelable {
            return this;
            return this;
        }
        }


        /**
         * Sets a specific {@link UserData} for field classification for this request only.
         *
         * @return this builder
         * @throws IllegalStateException if the FillResponse
         * {@link #setAuthentication(AutofillId[], IntentSender, RemoteViews)
         * requires authentication}.
         */
        public Builder setUserData(@NonNull UserData userData) {
            throwIfDestroyed();
            throwIfAuthenticationCalled();
            mUserData = Preconditions.checkNotNull(userData);
            return this;
        }

        /**
        /**
         * Builds a new {@link FillResponse} instance.
         * Builds a new {@link FillResponse} instance.
         *
         *
@@ -599,6 +622,9 @@ public final class FillResponse implements Parcelable {
        if (mFieldClassificationIds != null) {
        if (mFieldClassificationIds != null) {
            builder.append(Arrays.toString(mFieldClassificationIds));
            builder.append(Arrays.toString(mFieldClassificationIds));
        }
        }
        if (mUserData != null) {
            builder.append(", userData=").append(mUserData);
        }
        return builder.append("]").toString();
        return builder.append("]").toString();
    }
    }


@@ -621,6 +647,7 @@ public final class FillResponse implements Parcelable {
        parcel.writeParcelable(mPresentation, flags);
        parcel.writeParcelable(mPresentation, flags);
        parcel.writeParcelable(mHeader, flags);
        parcel.writeParcelable(mHeader, flags);
        parcel.writeParcelable(mFooter, flags);
        parcel.writeParcelable(mFooter, flags);
        parcel.writeParcelable(mUserData, flags);
        parcel.writeParcelableArray(mIgnoredIds, flags);
        parcel.writeParcelableArray(mIgnoredIds, flags);
        parcel.writeLong(mDisableDuration);
        parcel.writeLong(mDisableDuration);
        parcel.writeParcelableArray(mFieldClassificationIds, flags);
        parcel.writeParcelableArray(mFieldClassificationIds, flags);
@@ -661,6 +688,10 @@ public final class FillResponse implements Parcelable {
            if (footer != null) {
            if (footer != null) {
                builder.setFooter(footer);
                builder.setFooter(footer);
            }
            }
            final UserData userData = parcel.readParcelable(null);
            if (userData != null) {
                builder.setUserData(userData);
            }


            builder.setIgnoredIds(parcel.readParcelableArray(null, AutofillId.class));
            builder.setIgnoredIds(parcel.readParcelableArray(null, AutofillId.class));
            final long disableDuration = parcel.readLong();
            final long disableDuration = parcel.readLong();
+9 −1
Original line number Original line Diff line number Diff line
@@ -1221,7 +1221,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
            return;
            return;
        }
        }


        final UserData userData = mService.getUserData();
        final UserData packageUserData = lastResponse.getUserData();

        final UserData userData;
        if (packageUserData != null) {
            // Replace default userData
            userData = packageUserData;
        } else {
            userData = mService.getUserData();
        }


        for (int i = 0; i < mViewStates.size(); i++) {
        for (int i = 0; i < mViewStates.size(); i++) {
            final ViewState viewState = mViewStates.valueAt(i);
            final ViewState viewState = mViewStates.valueAt(i);