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

Commit 05b8b413 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Improvements on ViewNodes received on partitioned requests:" into oc-dev

parents fe0277c0 cde040ae
Loading
Loading
Loading
Loading
+35 −1
Original line number Diff line number Diff line
@@ -599,6 +599,10 @@ public class AssistStructure implements Parcelable {
        boolean mSanitized;
        HtmlInfo mHtmlInfo;

        // POJO used to override some autofill-related values when the node is parcelized.
        // Not written to parcel.
        AutofillOverlay mAutofillOverlay;

        int mX;
        int mY;
        int mScrollX;
@@ -756,6 +760,7 @@ public class AssistStructure implements Parcelable {
            boolean writeSensitive = true;

            int flags = mFlags & ~FLAGS_ALL_CONTROL;

            if (mId != View.NO_ID) {
                flags |= FLAGS_HAS_ID;
            }
@@ -810,6 +815,13 @@ public class AssistStructure implements Parcelable {
                // Remove 'checked' from sanitized autofill request.
                writtenFlags = flags & ~FLAGS_CHECKED;
            }
            if (mAutofillOverlay != null) {
                if (mAutofillOverlay.focused) {
                    writtenFlags |= ViewNode.FLAGS_FOCUSED;
                } else {
                    writtenFlags &= ~ViewNode.FLAGS_FOCUSED;
                }
            }

            out.writeInt(writtenFlags);
            if ((flags&FLAGS_HAS_ID) != 0) {
@@ -829,7 +841,14 @@ public class AssistStructure implements Parcelable {
                out.writeParcelable(mAutofillId, 0);
                out.writeInt(mAutofillType);
                out.writeStringArray(mAutofillHints);
                final AutofillValue sanitizedValue = writeSensitive ? mAutofillValue : null;
                final AutofillValue sanitizedValue;
                if (mAutofillOverlay != null && mAutofillOverlay.value != null) {
                    sanitizedValue = mAutofillOverlay.value;
                } else if (writeSensitive) {
                    sanitizedValue = mAutofillValue;
                } else {
                    sanitizedValue = null;
                }
                out.writeParcelable(sanitizedValue,  0);
                out.writeStringArray(mAutofillOptions);
                if (mHtmlInfo instanceof Parcelable) {
@@ -959,6 +978,11 @@ public class AssistStructure implements Parcelable {
            return mAutofillValue;
        }

        /** @hide **/
        public void setAutofillOverlay(AutofillOverlay overlay) {
            mAutofillOverlay = overlay;
        }

        /**
         * Gets the options that can be used to autofill this structure.
         *
@@ -1340,6 +1364,16 @@ public class AssistStructure implements Parcelable {
        }
    }

    /**
     * POJO used to override some autofill-related values when the node is parcelized.
     *
     * @hide
     */
    static public class AutofillOverlay {
        public boolean focused;
        public AutofillValue value;
    }

    static class ViewNodeBuilder extends ViewStructure {
        final AssistStructure mAssist;
        final ViewNode mNode;
+32 −11
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import static com.android.server.autofill.Helper.VERBOSE;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.assist.AssistStructure;
import android.app.assist.AssistStructure.AutofillOverlay;
import android.app.assist.AssistStructure.ViewNode;
import android.app.assist.AssistStructure.WindowNode;
import android.content.ComponentName;
@@ -100,7 +101,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
    @NonNull private final String mPackageName;

    @GuardedBy("mLock")
    private final Map<AutofillId, ViewState> mViewStates = new ArrayMap<>();
    private final ArrayMap<AutofillId, ViewState> mViewStates = new ArrayMap<>();

    /**
     * Id of the View currently being displayed.
@@ -517,10 +518,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
                if (DEBUG) {
                    Slog.d(TAG, "Creating viewState for " + id + " on " + getFlagAsString(flags));
                }
                viewState = new ViewState(this, id, this, ViewState.STATE_INITIAL);
                viewState = new ViewState(this, id, value, this, ViewState.STATE_INITIAL);
                mViewStates.put(id, viewState);
            } else if ((flags & FLAG_VIEW_ENTERED) != 0) {
                viewState = startPartitionLocked(id);
                viewState = startPartitionLocked(id, value);
            } else {
                if (VERBOSE) Slog.v(TAG, "Ignored " + getFlagAsString(flags) + " for " + id);
                return;
@@ -584,25 +585,45 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
        Slog.w(TAG, "updateLocked(): unknown flags " + flags + ": " + getFlagAsString(flags));
    }

    private ViewState startPartitionLocked(AutofillId id) {
    private ViewState startPartitionLocked(AutofillId id, AutofillValue value) {
        if (DEBUG) {
            Slog.d(TAG, "Starting partition for view id " + id);
        }
        final ViewState viewState =
                new ViewState(this, id, this,ViewState.STATE_STARTED_PARTITION);
        mViewStates.put(id, viewState);
        final ViewState newViewState =
                new ViewState(this, id, value, this,ViewState.STATE_STARTED_PARTITION);
        mViewStates.put(id, newViewState);

        /*
         * TODO(b/33197203 , b/35707731): when start a new partition, it should
         *
         * - add autofilled fields as sanitized
         * - set focus on ViewStructure that triggered it
         * - pass the first onFillRequest() bundle
         * - optional: perhaps add a new flag onFilLRequest() to indicate it's a new partition?
         */

        // Must update value of nodes so:
        // - proper node is focused
        // - autofillValue is sent back to service when it was previously autofilled
        for (int i = 0; i < mViewStates.size(); i++) {
            final ViewState viewState = mViewStates.valueAt(i);

            final ViewNode node = findViewNodeByIdLocked(viewState.id);
            if (node == null) {
                Slog.w(TAG, "startPartitionLocked(): no node for " + viewState.id);
                continue;
            }

            final AutofillValue initialValue = viewState.getInitialValue();
            final AutofillValue filledValue = viewState.getAutofilledValue();
            final AutofillOverlay overlay = new AutofillOverlay();
            if (filledValue != null && !filledValue.equals(initialValue)) {
                overlay.value = filledValue;
            }
            overlay.focused = id.equals(viewState.id);
            node.setAutofillOverlay(overlay);
        }
        mRemoteFillService.onFillRequest(mStructure, null, 0);

        return viewState;
        return newViewState;
    }

    @Override
@@ -695,7 +716,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
            if (viewState != null)  {
                viewState.setState(state);
            } else {
                viewState = new ViewState(this, id, this, state);
                viewState = new ViewState(this, id, null, this, state);
                if (DEBUG) { // TODO(b/33197203): change to VERBOSE once stable
                    Slog.d(TAG, "Adding autofillable view with id " + id + " and state " + state);
                }
+12 −3
Original line number Diff line number Diff line
@@ -67,15 +67,17 @@ final class ViewState {
    private final Session mSession;
    private FillResponse mResponse;

    private AutofillValue mInitialValue;
    private AutofillValue mCurrentValue;
    private AutofillValue mAutofilledValue;
    private Rect mVirtualBounds;

    private int mState;

    ViewState(Session session, AutofillId id, Listener listener, int state) {
    ViewState(Session session, AutofillId id, AutofillValue value, Listener listener, int state) {
        mSession = session;
        this.id = id;
        mInitialValue = value;
        mListener = listener;
        mState = state;
    }
@@ -109,6 +111,11 @@ final class ViewState {
        mAutofilledValue = value;
    }

    @Nullable
    AutofillValue getInitialValue() {
        return mInitialValue;
    }

    @Nullable
    FillResponse getResponse() {
        return mResponse;
@@ -184,7 +191,8 @@ final class ViewState {

    @Override
    public String toString() {
        return "ViewState: [id=" + id + ", currentValue=" + mCurrentValue
        return "ViewState: [id=" + id + ", initialValue=" + mInitialValue
                + ", currentValue=" + mCurrentValue + ", autofilledValue=" + mAutofilledValue
                + ", bounds=" + mVirtualBounds + ", state=" + getStateAsString() + "]";
    }

@@ -192,6 +200,7 @@ final class ViewState {
        pw.print(prefix); pw.print("id:" ); pw.println(this.id);
        pw.print(prefix); pw.print("state:" ); pw.println(getStateAsString());
        pw.print(prefix); pw.print("has response:" ); pw.println(mResponse != null);
        pw.print(prefix); pw.print("initialValue:" ); pw.println(mInitialValue);
        pw.print(prefix); pw.print("currentValue:" ); pw.println(mCurrentValue);
        pw.print(prefix); pw.print("autofilledValue:" ); pw.println(mAutofilledValue);
        pw.print(prefix); pw.print("virtualBounds:" ); pw.println(mVirtualBounds);