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

Commit 9199498b authored by Feng Cao's avatar Feng Cao
Browse files

Add inline controller UI fields to the autofill response and IME inline response

Test: build
Bug: 147394280

Change-Id: I4949852bb042390b35962627617d062bcd9b24b9
parent 8409280f
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -42611,6 +42611,7 @@ package android.service.autofill {
  public static final class FillResponse.Builder {
    ctor public FillResponse.Builder();
    method @NonNull public android.service.autofill.FillResponse.Builder addDataset(@Nullable android.service.autofill.Dataset);
    method @NonNull public android.service.autofill.FillResponse.Builder addInlineAction(@NonNull android.service.autofill.InlinePresentation);
    method @NonNull public android.service.autofill.FillResponse build();
    method @NonNull public android.service.autofill.FillResponse.Builder disableAutofill(long);
    method @NonNull public android.service.autofill.FillResponse.Builder setAuthentication(@NonNull android.view.autofill.AutofillId[], @Nullable android.content.IntentSender, @Nullable android.widget.RemoteViews);
@@ -42640,10 +42641,11 @@ package android.service.autofill {
  }
  public final class InlinePresentation implements android.os.Parcelable {
    ctor public InlinePresentation(@NonNull android.app.slice.Slice, @NonNull android.view.inline.InlinePresentationSpec);
    ctor public InlinePresentation(@NonNull android.app.slice.Slice, @NonNull android.view.inline.InlinePresentationSpec, boolean);
    method public int describeContents();
    method @NonNull public android.view.inline.InlinePresentationSpec getInlinePresentationSpec();
    method @NonNull public android.app.slice.Slice getSlice();
    method public boolean isPinned();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.service.autofill.InlinePresentation> CREATOR;
  }
@@ -55581,10 +55583,13 @@ package android.view.inputmethod {
    method @Nullable public String[] getAutofillHints();
    method @NonNull public android.view.inline.InlinePresentationSpec getPresentationSpec();
    method @NonNull public String getSource();
    method @NonNull public String getType();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.view.inputmethod.InlineSuggestionInfo> CREATOR;
    field public static final String SOURCE_AUTOFILL = "android:autofill";
    field public static final String SOURCE_PLATFORM = "android:platform";
    field public static final String TYPE_ACTION = "android:autofill:action";
    field public static final String TYPE_SUGGESTION = "android:autofill:suggestion";
  }
  public final class InlineSuggestionsRequest implements android.os.Parcelable {
+42 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ public final class FillResponse implements Parcelable {
    private final @Nullable UserData mUserData;
    private final @Nullable int[] mCancelIds;
    private final boolean mSupportsInlineSuggestions;
    private final @Nullable ParceledListSlice<InlinePresentation> mInlineActions;

    private FillResponse(@NonNull Builder builder) {
        mDatasets = (builder.mDatasets != null) ? new ParceledListSlice<>(builder.mDatasets) : null;
@@ -105,6 +106,8 @@ public final class FillResponse implements Parcelable {
        mUserData = builder.mUserData;
        mCancelIds = builder.mCancelIds;
        mSupportsInlineSuggestions = builder.mSupportsInlineSuggestions;
        mInlineActions = (builder.mInlineActions != null) ? new ParceledListSlice<>(
                builder.mInlineActions) : null;
    }

    /** @hide */
@@ -202,6 +205,11 @@ public final class FillResponse implements Parcelable {
        return mSupportsInlineSuggestions;
    }

    /** @hide */
    public @Nullable List<InlinePresentation> getInlineActions() {
        return (mInlineActions != null) ? mInlineActions.getList() : null;
    }

    /**
     * Builder for {@link FillResponse} objects. You must to provide at least
     * one dataset or set an authentication intent with a presentation view.
@@ -223,6 +231,7 @@ public final class FillResponse implements Parcelable {
        private UserData mUserData;
        private int[] mCancelIds;
        private boolean mSupportsInlineSuggestions;
        private ArrayList<InlinePresentation> mInlineActions;

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

        /**
         * Adds a new {@link InlinePresentation} to this response representing an action UI.
         *
         * <p> For example, the UI can be associated with an intent which can open an activity for
         * the user to manage the Autofill provider settings.
         *
         * @return This builder.
         */
        @NonNull
        public Builder addInlineAction(@NonNull InlinePresentation inlineAction) {
            throwIfDestroyed();
            throwIfAuthenticationCalled();
            if (mInlineActions == null) {
                mInlineActions = new ArrayList<>();
            }
            mInlineActions.add(inlineAction);
            return this;
        }

        /**
         * Builds a new {@link FillResponse} instance.
         *
@@ -688,6 +716,10 @@ public final class FillResponse implements Parcelable {
        if (mCancelIds != null) {
            builder.append(", mCancelIds=").append(mCancelIds.length);
        }
        builder.append(", mSupportInlinePresentations=").append(mSupportsInlineSuggestions);
        if (mInlineActions != null) {
            builder.append(", mInlineActions=" + mInlineActions.getList());
        }
        return builder.append("]").toString();
    }

@@ -717,6 +749,7 @@ public final class FillResponse implements Parcelable {
        parcel.writeInt(mFlags);
        parcel.writeIntArray(mCancelIds);
        parcel.writeInt(mRequestId);
        parcel.writeParcelable(mInlineActions, flags);
    }

    public static final @android.annotation.NonNull Parcelable.Creator<FillResponse> CREATOR =
@@ -771,6 +804,15 @@ public final class FillResponse implements Parcelable {
            final int[] cancelIds = parcel.createIntArray();
            builder.setPresentationCancelIds(cancelIds);

            final ParceledListSlice<InlinePresentation> inlineActionsSlice = parcel.readParcelable(
                    null);
            final List<InlinePresentation> inlineActions =
                    (inlineActionsSlice != null) ? inlineActionsSlice.getList() : null;
            final int inlineActionsCount = (inlineActions != null) ? inlineActions.size() : 0;
            for (int i = 0; i < inlineActionsCount; i++) {
                builder.addInlineAction(inlineActions.get(i));
            }

            final FillResponse response = builder.build();
            response.setRequestId(parcel.readInt());

+52 −5
Original line number Diff line number Diff line
@@ -34,10 +34,22 @@ import com.android.internal.util.DataClass;
        genEqualsHashCode = true)
public final class InlinePresentation implements Parcelable {


    /**
     * Represents the UI content and the action for the inline suggestion.
     */
    private final @NonNull Slice mSlice;

    /**
     * Specifies the UI specification for the inline suggestion.
     */
    private final @NonNull InlinePresentationSpec mInlinePresentationSpec;

    /**
     * Indicates whether the UI should be pinned, hence non-scrollable, in the host.
     */
    private final boolean mPinned;



    // Code below generated by codegen v1.0.14.
@@ -53,30 +65,56 @@ public final class InlinePresentation implements Parcelable {
    //@formatter:off


    /**
     * Creates a new InlinePresentation.
     *
     * @param slice
     *   Represents the UI content and the action for the inline suggestion.
     * @param inlinePresentationSpec
     *   Specifies the UI specification for the inline suggestion.
     * @param pinned
     *   Indicates whether the UI should be pinned, hence non-scrollable, in the host.
     */
    @DataClass.Generated.Member
    public InlinePresentation(
            @NonNull Slice slice,
            @NonNull InlinePresentationSpec inlinePresentationSpec) {
            @NonNull InlinePresentationSpec inlinePresentationSpec,
            boolean pinned) {
        this.mSlice = slice;
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mSlice);
        this.mInlinePresentationSpec = inlinePresentationSpec;
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mInlinePresentationSpec);
        this.mPinned = pinned;

        // onConstructed(); // You can define this method to get a callback
    }

    /**
     * Represents the UI content and the action for the inline suggestion.
     */
    @DataClass.Generated.Member
    public @NonNull Slice getSlice() {
        return mSlice;
    }

    /**
     * Specifies the UI specification for the inline suggestion.
     */
    @DataClass.Generated.Member
    public @NonNull InlinePresentationSpec getInlinePresentationSpec() {
        return mInlinePresentationSpec;
    }

    /**
     * Indicates whether the UI should be pinned, hence non-scrollable, in the host.
     */
    @DataClass.Generated.Member
    public boolean isPinned() {
        return mPinned;
    }

    @Override
    @DataClass.Generated.Member
    public String toString() {
@@ -85,7 +123,8 @@ public final class InlinePresentation implements Parcelable {

        return "InlinePresentation { " +
                "slice = " + mSlice + ", " +
                "inlinePresentationSpec = " + mInlinePresentationSpec +
                "inlinePresentationSpec = " + mInlinePresentationSpec + ", " +
                "pinned = " + mPinned +
        " }";
    }

@@ -103,7 +142,8 @@ public final class InlinePresentation implements Parcelable {
        //noinspection PointlessBooleanExpression
        return true
                && java.util.Objects.equals(mSlice, that.mSlice)
                && java.util.Objects.equals(mInlinePresentationSpec, that.mInlinePresentationSpec);
                && java.util.Objects.equals(mInlinePresentationSpec, that.mInlinePresentationSpec)
                && mPinned == that.mPinned;
    }

    @Override
@@ -115,6 +155,7 @@ public final class InlinePresentation implements Parcelable {
        int _hash = 1;
        _hash = 31 * _hash + java.util.Objects.hashCode(mSlice);
        _hash = 31 * _hash + java.util.Objects.hashCode(mInlinePresentationSpec);
        _hash = 31 * _hash + Boolean.hashCode(mPinned);
        return _hash;
    }

@@ -124,6 +165,9 @@ public final class InlinePresentation implements Parcelable {
        // You can override field parcelling by defining methods like:
        // void parcelFieldName(Parcel dest, int flags) { ... }

        byte flg = 0;
        if (mPinned) flg |= 0x4;
        dest.writeByte(flg);
        dest.writeTypedObject(mSlice, flags);
        dest.writeTypedObject(mInlinePresentationSpec, flags);
    }
@@ -139,6 +183,8 @@ public final class InlinePresentation implements Parcelable {
        // You can override field unparcelling by defining methods like:
        // static FieldType unparcelFieldName(Parcel in) { ... }

        byte flg = in.readByte();
        boolean pinned = (flg & 0x4) != 0;
        Slice slice = (Slice) in.readTypedObject(Slice.CREATOR);
        InlinePresentationSpec inlinePresentationSpec = (InlinePresentationSpec) in.readTypedObject(InlinePresentationSpec.CREATOR);

@@ -148,6 +194,7 @@ public final class InlinePresentation implements Parcelable {
        this.mInlinePresentationSpec = inlinePresentationSpec;
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mInlinePresentationSpec);
        this.mPinned = pinned;

        // onConstructed(); // You can define this method to get a callback
    }
@@ -167,10 +214,10 @@ public final class InlinePresentation implements Parcelable {
    };

    @DataClass.Generated(
            time = 1578081082387L,
            time = 1579726472535L,
            codegenVersion = "1.0.14",
            sourceFile = "frameworks/base/core/java/android/service/autofill/InlinePresentation.java",
            inputSignatures = "private final @android.annotation.NonNull android.app.slice.Slice mSlice\nprivate final @android.annotation.NonNull android.view.inline.InlinePresentationSpec mInlinePresentationSpec\nclass InlinePresentation extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstDefs=true, genEqualsHashCode=true)")
            inputSignatures = "private final @android.annotation.NonNull android.app.slice.Slice mSlice\nprivate final @android.annotation.NonNull android.view.inline.InlinePresentationSpec mInlinePresentationSpec\nprivate final  boolean mPinned\nclass InlinePresentation extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstDefs=true, genEqualsHashCode=true)")
    @Deprecated
    private void __metadata() {}

+71 −6
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.view.inputmethod;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
import android.os.Parcelable;
import android.view.inline.InlinePresentationSpec;
@@ -45,6 +46,17 @@ public final class InlineSuggestionInfo implements Parcelable {
     */
    public static final @Source String SOURCE_PLATFORM = "android:platform";

    /**
     * UI type: the UI contains an Autofill suggestion that will autofill the fields when tapped.
     */
    public static final @Type String TYPE_SUGGESTION = "android:autofill:suggestion";

    /**
     * UI type: the UI contains an widget that will launch an intent when tapped.
     */
    @SuppressLint({"IntentName"})
    public static final @Type String TYPE_ACTION = "android:autofill:action";

    /** The presentation spec to which the inflated suggestion view abides. */
    private final @NonNull InlinePresentationSpec mPresentationSpec;

@@ -54,6 +66,9 @@ public final class InlineSuggestionInfo implements Parcelable {
    /** Hints for the type of data being suggested. */
    private final @Nullable String[] mAutofillHints;

    /** The type of the UI. */
    private final @NonNull @Type String mType;

    /**
     * Creates a new {@link InlineSuggestionInfo}, for testing purpose.
     *
@@ -65,7 +80,8 @@ public final class InlineSuggestionInfo implements Parcelable {
            @NonNull InlinePresentationSpec presentationSpec,
            @NonNull @Source String source,
            @Nullable String[] autofillHints) {
        return new InlineSuggestionInfo(presentationSpec, source, autofillHints);
        // TODO(b/147394280): Add CTS test for the type field.
        return new InlineSuggestionInfo(presentationSpec, source, autofillHints, TYPE_SUGGESTION);
    }


@@ -92,6 +108,15 @@ public final class InlineSuggestionInfo implements Parcelable {
    @DataClass.Generated.Member
    public @interface Source {}

    /** @hide */
    @android.annotation.StringDef(prefix = "TYPE_", value = {
        TYPE_SUGGESTION,
        TYPE_ACTION
    })
    @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE)
    @DataClass.Generated.Member
    public @interface Type {}

    /**
     * Creates a new InlineSuggestionInfo.
     *
@@ -101,13 +126,16 @@ public final class InlineSuggestionInfo implements Parcelable {
     *   The source from which the suggestion is provided.
     * @param autofillHints
     *   Hints for the type of data being suggested.
     * @param type
     *   The type of the UI.
     * @hide
     */
    @DataClass.Generated.Member
    public InlineSuggestionInfo(
            @NonNull InlinePresentationSpec presentationSpec,
            @NonNull @Source String source,
            @Nullable String[] autofillHints) {
            @Nullable String[] autofillHints,
            @NonNull @Type String type) {
        this.mPresentationSpec = presentationSpec;
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mPresentationSpec);
@@ -124,6 +152,18 @@ public final class InlineSuggestionInfo implements Parcelable {
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mSource);
        this.mAutofillHints = autofillHints;
        this.mType = type;

        if (!(java.util.Objects.equals(mType, TYPE_SUGGESTION))
                && !(java.util.Objects.equals(mType, TYPE_ACTION))) {
            throw new java.lang.IllegalArgumentException(
                    "type was " + mType + " but must be one of: "
                            + "TYPE_SUGGESTION(" + TYPE_SUGGESTION + "), "
                            + "TYPE_ACTION(" + TYPE_ACTION + ")");
        }

        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mType);

        // onConstructed(); // You can define this method to get a callback
    }
@@ -152,6 +192,14 @@ public final class InlineSuggestionInfo implements Parcelable {
        return mAutofillHints;
    }

    /**
     * The type of the UI.
     */
    @DataClass.Generated.Member
    public @NonNull @Type String getType() {
        return mType;
    }

    @Override
    @DataClass.Generated.Member
    public String toString() {
@@ -161,7 +209,8 @@ public final class InlineSuggestionInfo implements Parcelable {
        return "InlineSuggestionInfo { " +
                "presentationSpec = " + mPresentationSpec + ", " +
                "source = " + mSource + ", " +
                "autofillHints = " + java.util.Arrays.toString(mAutofillHints) +
                "autofillHints = " + java.util.Arrays.toString(mAutofillHints) + ", " +
                "type = " + mType +
        " }";
    }

@@ -180,7 +229,8 @@ public final class InlineSuggestionInfo implements Parcelable {
        return true
                && java.util.Objects.equals(mPresentationSpec, that.mPresentationSpec)
                && java.util.Objects.equals(mSource, that.mSource)
                && java.util.Arrays.equals(mAutofillHints, that.mAutofillHints);
                && java.util.Arrays.equals(mAutofillHints, that.mAutofillHints)
                && java.util.Objects.equals(mType, that.mType);
    }

    @Override
@@ -193,6 +243,7 @@ public final class InlineSuggestionInfo implements Parcelable {
        _hash = 31 * _hash + java.util.Objects.hashCode(mPresentationSpec);
        _hash = 31 * _hash + java.util.Objects.hashCode(mSource);
        _hash = 31 * _hash + java.util.Arrays.hashCode(mAutofillHints);
        _hash = 31 * _hash + java.util.Objects.hashCode(mType);
        return _hash;
    }

@@ -208,6 +259,7 @@ public final class InlineSuggestionInfo implements Parcelable {
        dest.writeTypedObject(mPresentationSpec, flags);
        dest.writeString(mSource);
        if (mAutofillHints != null) dest.writeStringArray(mAutofillHints);
        dest.writeString(mType);
    }

    @Override
@@ -225,6 +277,7 @@ public final class InlineSuggestionInfo implements Parcelable {
        InlinePresentationSpec presentationSpec = (InlinePresentationSpec) in.readTypedObject(InlinePresentationSpec.CREATOR);
        String source = in.readString();
        String[] autofillHints = (flg & 0x4) == 0 ? null : in.createStringArray();
        String type = in.readString();

        this.mPresentationSpec = presentationSpec;
        com.android.internal.util.AnnotationValidations.validate(
@@ -242,6 +295,18 @@ public final class InlineSuggestionInfo implements Parcelable {
        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mSource);
        this.mAutofillHints = autofillHints;
        this.mType = type;

        if (!(java.util.Objects.equals(mType, TYPE_SUGGESTION))
                && !(java.util.Objects.equals(mType, TYPE_ACTION))) {
            throw new java.lang.IllegalArgumentException(
                    "type was " + mType + " but must be one of: "
                            + "TYPE_SUGGESTION(" + TYPE_SUGGESTION + "), "
                            + "TYPE_ACTION(" + TYPE_ACTION + ")");
        }

        com.android.internal.util.AnnotationValidations.validate(
                NonNull.class, null, mType);

        // onConstructed(); // You can define this method to get a callback
    }
@@ -261,10 +326,10 @@ public final class InlineSuggestionInfo implements Parcelable {
    };

    @DataClass.Generated(
            time = 1578972121865L,
            time = 1579806757327L,
            codegenVersion = "1.0.14",
            sourceFile = "frameworks/base/core/java/android/view/inputmethod/InlineSuggestionInfo.java",
            inputSignatures = "public static final @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String SOURCE_AUTOFILL\npublic static final @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String SOURCE_PLATFORM\nprivate final @android.annotation.NonNull android.view.inline.InlinePresentationSpec mPresentationSpec\nprivate final @android.annotation.NonNull @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String mSource\nprivate final @android.annotation.Nullable java.lang.String[] mAutofillHints\npublic static @android.annotation.TestApi @android.annotation.NonNull android.view.inputmethod.InlineSuggestionInfo newInlineSuggestionInfo(android.view.inline.InlinePresentationSpec,java.lang.String,java.lang.String[])\nclass InlineSuggestionInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genHiddenConstDefs=true, genHiddenConstructor=true)")
            inputSignatures = "public static final @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String SOURCE_AUTOFILL\npublic static final @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String SOURCE_PLATFORM\npublic static final @android.view.inputmethod.InlineSuggestionInfo.Type java.lang.String TYPE_SUGGESTION\npublic static final @android.annotation.SuppressLint({\"IntentName\"}) @android.view.inputmethod.InlineSuggestionInfo.Type java.lang.String TYPE_ACTION\nprivate final @android.annotation.NonNull android.view.inline.InlinePresentationSpec mPresentationSpec\nprivate final @android.annotation.NonNull @android.view.inputmethod.InlineSuggestionInfo.Source java.lang.String mSource\nprivate final @android.annotation.Nullable java.lang.String[] mAutofillHints\nprivate final @android.annotation.NonNull @android.view.inputmethod.InlineSuggestionInfo.Type java.lang.String mType\npublic static @android.annotation.TestApi @android.annotation.NonNull android.view.inputmethod.InlineSuggestionInfo newInlineSuggestionInfo(android.view.inline.InlinePresentationSpec,java.lang.String,java.lang.String[])\nclass InlineSuggestionInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genHiddenConstDefs=true, genHiddenConstructor=true)")
    @Deprecated
    private void __metadata() {}

+4 −2
Original line number Diff line number Diff line
@@ -123,7 +123,8 @@ public final class InlineSuggestionFactory {
        // TODO(b/146453195): fill in the autofill hint properly.
        final InlineSuggestionInfo inlineSuggestionInfo = new InlineSuggestionInfo(
                inlinePresentation.getInlinePresentationSpec(),
                InlineSuggestionInfo.SOURCE_PLATFORM, new String[]{""});
                InlineSuggestionInfo.SOURCE_PLATFORM, new String[]{""},
                InlineSuggestionInfo.TYPE_SUGGESTION);
        final View.OnClickListener onClickListener = v -> {
            try {
                client.autofill(sessionId, dataset.getFieldIds(), dataset.getFieldValues());
@@ -146,7 +147,8 @@ public final class InlineSuggestionFactory {
        // TODO(b/146453195): fill in the autofill hint properly.
        final InlineSuggestionInfo inlineSuggestionInfo = new InlineSuggestionInfo(
                inlinePresentation.getInlinePresentationSpec(),
                InlineSuggestionInfo.SOURCE_AUTOFILL, new String[]{""});
                InlineSuggestionInfo.SOURCE_AUTOFILL, new String[]{""},
                InlineSuggestionInfo.TYPE_SUGGESTION);
        final View.OnClickListener onClickListener = v -> {
            client.fill(requestId, fieldIndex, dataset);
        };