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

Commit f8a8174c authored by Felipe Leme's avatar Felipe Leme
Browse files

Changes on Assist structure to handle virtual child for autofill:

- Removed overloaded newChild() methods.
- Added a setAutofillId(parent, virtualId).
- Changed view so AutofillId is set on all relevant methods.

Test: VirtualContainerActivityTest (with new tests) pass
Bug: 36056207

Change-Id: Ia11344f95c2756e83307c54052878e9dbe471873
parent 2eb54b6b
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -46308,7 +46308,6 @@ package android.view {
    method public abstract int addChildCount(int);
    method public abstract void asyncCommit();
    method public abstract android.view.ViewStructure asyncNewChild(int);
    method public abstract android.view.ViewStructure asyncNewChild(int, int, int);
    method public abstract int getChildCount();
    method public abstract android.os.Bundle getExtras();
    method public abstract java.lang.CharSequence getHint();
@@ -46317,11 +46316,11 @@ package android.view {
    method public abstract int getTextSelectionStart();
    method public abstract boolean hasExtras();
    method public abstract android.view.ViewStructure newChild(int);
    method public abstract android.view.ViewStructure newChild(int, int, int);
    method public abstract void setAccessibilityFocused(boolean);
    method public abstract void setActivated(boolean);
    method public abstract void setAlpha(float);
    method public abstract void setAutofillHint(java.lang.String[]);
    method public abstract void setAutofillId(android.view.ViewStructure, int);
    method public abstract void setAutofillOptions(java.lang.String[]);
    method public abstract void setAutofillType(int);
    method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
+1 −2
Original line number Diff line number Diff line
@@ -49771,7 +49771,6 @@ package android.view {
    method public abstract int addChildCount(int);
    method public abstract void asyncCommit();
    method public abstract android.view.ViewStructure asyncNewChild(int);
    method public abstract android.view.ViewStructure asyncNewChild(int, int, int);
    method public abstract int getChildCount();
    method public abstract android.os.Bundle getExtras();
    method public abstract java.lang.CharSequence getHint();
@@ -49780,11 +49779,11 @@ package android.view {
    method public abstract int getTextSelectionStart();
    method public abstract boolean hasExtras();
    method public abstract android.view.ViewStructure newChild(int);
    method public abstract android.view.ViewStructure newChild(int, int, int);
    method public abstract void setAccessibilityFocused(boolean);
    method public abstract void setActivated(boolean);
    method public abstract void setAlpha(float);
    method public abstract void setAutofillHint(java.lang.String[]);
    method public abstract void setAutofillId(android.view.ViewStructure, int);
    method public abstract void setAutofillOptions(java.lang.String[]);
    method public abstract void setAutofillType(int);
    method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
+1 −2
Original line number Diff line number Diff line
@@ -46677,7 +46677,6 @@ package android.view {
    method public abstract int addChildCount(int);
    method public abstract void asyncCommit();
    method public abstract android.view.ViewStructure asyncNewChild(int);
    method public abstract android.view.ViewStructure asyncNewChild(int, int, int);
    method public abstract int getChildCount();
    method public abstract android.os.Bundle getExtras();
    method public abstract java.lang.CharSequence getHint();
@@ -46686,11 +46685,11 @@ package android.view {
    method public abstract int getTextSelectionStart();
    method public abstract boolean hasExtras();
    method public abstract android.view.ViewStructure newChild(int);
    method public abstract android.view.ViewStructure newChild(int, int, int);
    method public abstract void setAccessibilityFocused(boolean);
    method public abstract void setActivated(boolean);
    method public abstract void setAlpha(float);
    method public abstract void setAutofillHint(java.lang.String[]);
    method public abstract void setAutofillId(android.view.ViewStructure, int);
    method public abstract void setAutofillOptions(java.lang.String[]);
    method public abstract void setAutofillType(int);
    method public abstract void setAutofillValue(android.view.autofill.AutofillValue);
+8 −28
Original line number Diff line number Diff line
package android.app.assist;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.content.ComponentName;
@@ -1583,23 +1584,22 @@ public class AssistStructure implements Parcelable {
            return mNode.mChildren != null ? mNode.mChildren.length : 0;
        }

        private void setAutofillId(ViewNode child, boolean forAutoFill, int virtualId) {
            if (forAutoFill) {
                child.mAutofillId = new AutofillId(mNode.mAutofillId, virtualId);
            }
        @Override
        public void setAutofillId(@NonNull ViewStructure parent, int virtualId) {
            mNode.mAutofillId = new AutofillId(parent.getAutofillId(), virtualId);
        }

        private ViewStructure newChild(int index, boolean forAutoFill, int virtualId, int flags) {
        @Override
        public ViewStructure newChild(int index) {
            ViewNode node = new ViewNode();
            setAutofillId(node, forAutoFill, virtualId);
            mNode.mChildren[index] = node;
            return new ViewNodeBuilder(mAssist, node, false);
        }

        private ViewStructure asyncNewChild(int index, boolean forAutoFill, int virtualId) {
        @Override
        public ViewStructure asyncNewChild(int index) {
            synchronized (mAssist) {
                ViewNode node = new ViewNode();
                setAutofillId(node, forAutoFill, virtualId);
                mNode.mChildren[index] = node;
                ViewNodeBuilder builder = new ViewNodeBuilder(mAssist, node, true);
                mAssist.mPendingAsyncChildren.add(builder);
@@ -1607,26 +1607,6 @@ public class AssistStructure implements Parcelable {
            }
        }

        @Override
        public ViewStructure newChild(int index) {
            return newChild(index, false, 0, 0);
        }

        @Override
        public ViewStructure newChild(int index, int virtualId, int flags) {
            return newChild(index, true, virtualId, flags);
        }

        @Override
        public ViewStructure asyncNewChild(int index) {
            return asyncNewChild(index, false, 0);
        }

        @Override
        public ViewStructure asyncNewChild(int index, int virtualId, int flags) {
            return asyncNewChild(index, true, virtualId);
        }

        @Override
        public void asyncCommit() {
            synchronized (mAssist) {
+14 −7
Original line number Diff line number Diff line
@@ -7275,11 +7275,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * fills in all data that can be inferred from the view itself.
     * @param flags optional flags (currently {@code 0}).
     */
    @CallSuper
    public void onProvideAutofillStructure(ViewStructure structure, int flags) {
        onProvideStructureForAssistOrAutofill(structure, true);
    }
    private void setAutofillId(ViewStructure structure) {
        // The autofill id needs to be unique, but its value doesn't matter,
        // so it's better to reuse the accessibility id to save space.
        structure.setAutofillId(getAccessibilityViewId());
    }
    private void onProvideStructureForAssistOrAutofill(ViewStructure structure,
            boolean forAutofill) {
        final int id = mID;
@@ -7299,13 +7304,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        }
        if (forAutofill) {
            setAutofillId(structure);
            final @AutofillType int autofillType = getAutofillType();
            // Don't need to fill autofill info if view does not support it.
            // For example, only TextViews that are editable support autofill
            if (autofillType != AUTOFILL_TYPE_NONE) {
                // The autofill id needs to be unique, but its value doesn't matter, so it's better
                // to reuse the accessibility id to save space.
                structure.setAutofillId(getAccessibilityViewId());
                structure.setAutofillType(autofillType);
                structure.setAutofillHint(getAutofillHint());
                structure.setAutofillValue(getAutofillValue());
@@ -7404,6 +7407,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    private void onProvideVirtualStructureForAssistOrAutofill(ViewStructure structure,
            boolean forAutofill) {
        if (forAutofill) {
            setAutofillId(structure);
        }
        // NOTE: currently flags are only used for AutoFill; if they're used for Assist as well,
        // this method should take a boolean with the type of request.
        AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
@@ -7671,6 +7677,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
                AccessibilityNodeInfo cinfo = provider.createAccessibilityNodeInfo(
                        AccessibilityNodeInfo.getVirtualDescendantId(info.getChildId(i)));
                ViewStructure child = structure.newChild(i);
                // TODO(b/33197203): add CTS test to autofill virtual children based on
                // Accessibility API.
                child.setAutofillId(structure, i);
                populateVirtualStructure(child, provider, cinfo, forAutofill);
                cinfo.recycle();
            }
@@ -7707,9 +7716,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        boolean blocked = forAutofill ? isAutofillBlocked() : isAssistBlocked();
        if (!blocked) {
            if (forAutofill) {
                // The autofill id needs to be unique, but its value doesn't matter,
                // so it's better to reuse the accessibility id to save space.
                structure.setAutofillId(getAccessibilityViewId());
                setAutofillId(structure);
                // NOTE: flags are not currently supported, hence 0
                onProvideAutofillStructure(structure, 0);
                onProvideAutofillVirtualStructure(structure, 0);
Loading