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

Commit 4ad088b6 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Accessibility APIs] Add Expansion API" into main

parents 3c6c3f7c 4c90cfde
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -55041,6 +55041,7 @@ package android.view.accessibility {
    field public static final int CONTENT_CHANGE_TYPE_DRAG_STARTED = 128; // 0x80
    field public static final int CONTENT_CHANGE_TYPE_ENABLED = 4096; // 0x1000
    field public static final int CONTENT_CHANGE_TYPE_ERROR = 2048; // 0x800
    field @FlaggedApi("android.view.accessibility.a11y_expansion_state_api") public static final int CONTENT_CHANGE_TYPE_EXPANDED = 16384; // 0x4000
    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
@@ -55190,6 +55191,7 @@ package android.view.accessibility {
    method public CharSequence getContentDescription();
    method public int getDrawingOrder();
    method public CharSequence getError();
    method @FlaggedApi("android.view.accessibility.a11y_expansion_state_api") public int getExpandedState();
    method @Nullable public android.view.accessibility.AccessibilityNodeInfo.ExtraRenderingInfo getExtraRenderingInfo();
    method public android.os.Bundle getExtras();
    method public CharSequence getHintText();
@@ -55282,6 +55284,7 @@ package android.view.accessibility {
    method public void setEditable(boolean);
    method public void setEnabled(boolean);
    method public void setError(CharSequence);
    method @FlaggedApi("android.view.accessibility.a11y_expansion_state_api") public void setExpandedState(int);
    method public void setFocusable(boolean);
    method public void setFocused(boolean);
    method @FlaggedApi("android.view.accessibility.granular_scrolling") public void setGranularScrollingSupported(boolean);
@@ -55368,6 +55371,10 @@ package android.view.accessibility {
    field @FlaggedApi("android.view.accessibility.tri_state_checked") public static final int CHECKED_STATE_PARTIAL = 2; // 0x2
    field @FlaggedApi("android.view.accessibility.tri_state_checked") public static final int CHECKED_STATE_TRUE = 1; // 0x1
    field @NonNull public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityNodeInfo> CREATOR;
    field @FlaggedApi("android.view.accessibility.a11y_expansion_state_api") public static final int EXPANDED_STATE_COLLAPSED = 1; // 0x1
    field @FlaggedApi("android.view.accessibility.a11y_expansion_state_api") public static final int EXPANDED_STATE_FULL = 3; // 0x3
    field @FlaggedApi("android.view.accessibility.a11y_expansion_state_api") public static final int EXPANDED_STATE_PARTIAL = 2; // 0x2
    field @FlaggedApi("android.view.accessibility.a11y_expansion_state_api") public static final int EXPANDED_STATE_UNDEFINED = 0; // 0x0
    field public static final String EXTRA_DATA_RENDERING_INFO_KEY = "android.view.accessibility.extra.DATA_RENDERING_INFO_KEY";
    field public static final String EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH = "android.view.accessibility.extra.DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH";
    field public static final int EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_MAX_LENGTH = 20000; // 0x4e20
+12 −0
Original line number Diff line number Diff line
@@ -798,6 +798,18 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
    @FlaggedApi(Flags.FLAG_TRI_STATE_CHECKED)
    public static final int CONTENT_CHANGE_TYPE_CHECKED = 1 << 13;

    /**
     * Change type for {@link #TYPE_WINDOW_CONTENT_CHANGED} event: The source node changed its
     * expanded state which is returned by {@link AccessibilityNodeInfo#getExpandedState()}. The
     * view changing the node's expanded state should call {@link
     * AccessibilityNodeInfo#setExpandedState(int)} and then send this event.
     *
     * @see AccessibilityNodeInfo#getExpandedState()
     * @see AccessibilityNodeInfo#setExpandedState(int)
     */
    @FlaggedApi(Flags.FLAG_A11Y_EXPANSION_STATE_API)
    public static final int CONTENT_CHANGE_TYPE_EXPANDED = 1 << 14;

    // Speech state change types.

    /** Change type for {@link #TYPE_SPEECH_STATE_CHANGE} event: another service is speaking. */
+142 −0
Original line number Diff line number Diff line
@@ -756,6 +756,56 @@ public class AccessibilityNodeInfo implements Parcelable {
    public static final String ACTION_ARGUMENT_SCROLL_AMOUNT_FLOAT =
            "android.view.accessibility.action.ARGUMENT_SCROLL_AMOUNT_FLOAT";

    // Expanded state types.

    /**
     * Expanded state for a non-expandable element
     *
     * @see #getExpandedState()
     * @see #setExpandedState(int)
     */
    @FlaggedApi(Flags.FLAG_A11Y_EXPANSION_STATE_API)
    public static final int EXPANDED_STATE_UNDEFINED = 0;

    /**
     * Expanded state for a collapsed expandable element.
     *
     * @see #getExpandedState()
     * @see #setExpandedState(int)
     */
    @FlaggedApi(Flags.FLAG_A11Y_EXPANSION_STATE_API)
    public static final int EXPANDED_STATE_COLLAPSED = 1;

    /**
     * Expanded state for an expanded expandable element that can still be expanded further.
     *
     * @see #getExpandedState()
     * @see #setExpandedState(int)
     */
    @FlaggedApi(Flags.FLAG_A11Y_EXPANSION_STATE_API)
    public static final int EXPANDED_STATE_PARTIAL = 2;

    /**
     * Expanded state for a expanded expandable element that cannot be expanded further.
     *
     * @see #getExpandedState()
     * @see #setExpandedState(int)
     */
    @FlaggedApi(Flags.FLAG_A11Y_EXPANSION_STATE_API)
    public static final int EXPANDED_STATE_FULL = 3;

    /** @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(
            prefix = "EXPANDED_STATE_",
            value = {
                EXPANDED_STATE_UNDEFINED,
                EXPANDED_STATE_COLLAPSED,
                EXPANDED_STATE_PARTIAL,
                EXPANDED_STATE_FULL,
            })
    public @interface ExpandedState {}

    // Focus types.

    /**
@@ -1048,6 +1098,10 @@ public class AccessibilityNodeInfo implements Parcelable {
    private int mMaxTextLength = -1;
    private int mMovementGranularities;

    // TODO(b/362782158) Initialize mExpandedState explicitly with
    // the EXPANDED_STATE_UNDEFINED state when flagging is removed.
    private int mExpandedState;

    private int mTextSelectionStart = UNDEFINED_SELECTION_INDEX;
    private int mTextSelectionEnd = UNDEFINED_SELECTION_INDEX;
    private int mInputType = InputType.TYPE_NULL;
@@ -1930,6 +1984,47 @@ public class AccessibilityNodeInfo implements Parcelable {
        return mMovementGranularities;
    }

    /**
     * Sets the expanded state of the node.
     *
     * <p><strong>Note:</strong> Cannot be called from an {@link
     * android.accessibilityservice.AccessibilityService}. This class is made immutable before being
     * delivered to an {@link android.accessibilityservice.AccessibilityService}.
     *
     * @param state new expanded state of this node.
     * @throws IllegalArgumentException If state is not one of:
     *     <ul>
     *       <li>{@link #EXPANDED_STATE_UNDEFINED}
     *       <li>{@link #EXPANDED_STATE_COLLAPSED}
     *       <li>{@link #EXPANDED_STATE_PARTIAL}
     *       <li>{@link #EXPANDED_STATE_FULL}
     *     </ul>
     *
     * @throws IllegalStateException If called from an AccessibilityService
     */
    @FlaggedApi(Flags.FLAG_A11Y_EXPANSION_STATE_API)
    public void setExpandedState(@ExpandedState int state) {
        enforceValidExpandedState(state);
        enforceNotSealed();
        mExpandedState = state;
    }

    /**
     * Gets the expanded state for this node.
     *
     * @return The expanded state, one of:
     *     <ul>
     *       <li>{@link #EXPANDED_STATE_UNDEFINED}
     *       <li>{@link #EXPANDED_STATE_COLLAPSED}
     *       <li>{@link #EXPANDED_STATE_FULL}
     *       <li>{@link #EXPANDED_STATE_PARTIAL}
     *     </ul>
     */
    @FlaggedApi(Flags.FLAG_A11Y_EXPANSION_STATE_API)
    public @ExpandedState int getExpandedState() {
        return mExpandedState;
    }

    /**
     * Sets the minimum time duration between two content change events, which is used in throttling
     * content change events in accessibility services.
@@ -4369,6 +4464,20 @@ public class AccessibilityNodeInfo implements Parcelable {
        }
    }

    private void enforceValidExpandedState(int state) {
        if (Flags.a11yExpansionStateApi()) {
            switch (state) {
                case EXPANDED_STATE_UNDEFINED:
                case EXPANDED_STATE_COLLAPSED:
                case EXPANDED_STATE_PARTIAL:
                case EXPANDED_STATE_FULL:
                    return;
                default:
                    throw new IllegalArgumentException("Unknown expanded state: " + state);
            }
        }
    }

    /**
     * Enforces that this instance is not sealed.
     *
@@ -4623,6 +4732,11 @@ public class AccessibilityNodeInfo implements Parcelable {
        if (mChecked != DEFAULT.mChecked) {
            nonDefaultFields |= bitAt(fieldIndex);
        }
        fieldIndex++;
        if (mExpandedState != DEFAULT.mExpandedState) {
            nonDefaultFields |= bitAt(fieldIndex);
        }

        int totalFields = fieldIndex;
        parcel.writeLong(nonDefaultFields);

@@ -4794,6 +4908,9 @@ public class AccessibilityNodeInfo implements Parcelable {
        if (isBitSet(nonDefaultFields, fieldIndex++)) {
            parcel.writeInt(mChecked);
        }
        if (isBitSet(nonDefaultFields, fieldIndex++)) {
            parcel.writeInt(mExpandedState);
        }

        if (DEBUG) {
            fieldIndex--;
@@ -4883,6 +5000,7 @@ public class AccessibilityNodeInfo implements Parcelable {
        mLeashedParent = other.mLeashedParent;
        mLeashedParentNodeId = other.mLeashedParentNodeId;
        mChecked = other.mChecked;
        mExpandedState = other.mExpandedState;
    }

    private void initCopyInfos(AccessibilityNodeInfo other) {
@@ -5075,6 +5193,9 @@ public class AccessibilityNodeInfo implements Parcelable {
        if (isBitSet(nonDefaultFields, fieldIndex++)) {
            mChecked = parcel.readInt();
        }
        if (isBitSet(nonDefaultFields, fieldIndex++)) {
            mExpandedState = parcel.readInt();
        }

        mSealed = sealed;
    }
@@ -5249,6 +5370,26 @@ public class AccessibilityNodeInfo implements Parcelable {
        }
    }

    private static String getExpandedStateSymbolicName(int state) {
        if (Flags.a11yExpansionStateApi()) {
            switch (state) {
                case EXPANDED_STATE_UNDEFINED:
                    return "EXPANDED_STATE_UNDEFINED";
                case EXPANDED_STATE_COLLAPSED:
                    return "EXPANDED_STATE_COLLAPSED";
                case EXPANDED_STATE_PARTIAL:
                    return "EXPANDED_STATE_PARTIAL";
                case EXPANDED_STATE_FULL:
                    return "EXPANDED_STATE_FULL";
                default:
                    throw new IllegalArgumentException("Unknown expanded state: " + state);
            }
        } else {
            // TODO(b/362782158) Remove when flag is removed.
            return "";
        }
    }

    private static boolean canPerformRequestOverConnection(int connectionId,
            int windowId, long accessibilityNodeId) {
        final boolean hasWindowId = windowId != AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
@@ -5346,6 +5487,7 @@ public class AccessibilityNodeInfo implements Parcelable {
        builder.append("; containerTitle: ").append(mContainerTitle);
        builder.append("; viewIdResName: ").append(mViewIdResourceName);
        builder.append("; uniqueId: ").append(mUniqueId);
        builder.append("; expandedState: ").append(getExpandedStateSymbolicName(mExpandedState));

        builder.append("; checkable: ").append(isCheckable());
        builder.append("; checked: ").append(isChecked());
+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ public class AccessibilityNodeInfoTest {
    // The number of fields tested in the corresponding CTS AccessibilityNodeInfoTest:
    // See fullyPopulateAccessibilityNodeInfo, assertEqualsAccessibilityNodeInfo,
    // and assertAccessibilityNodeInfoCleared in that class.
    private static final int NUM_MARSHALLED_PROPERTIES = 45;
    private static final int NUM_MARSHALLED_PROPERTIES = 46;

    /**
     * The number of properties that are purposely not marshalled