/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.v4.view.accessibility;
import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.annotation.RestrictTo;
import android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat;
import android.support.v4.view.ViewCompat;
import android.text.InputType;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Helper for accessing {@link android.view.accessibility.AccessibilityNodeInfo} in a backwards
* compatible fashion.
*/
public class AccessibilityNodeInfoCompat {
public static class AccessibilityActionCompat {
/**
* Action that gives input focus to the node.
*/
public static final AccessibilityActionCompat ACTION_FOCUS =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_FOCUS, null);
/**
* Action that clears input focus of the node.
*/
public static final AccessibilityActionCompat ACTION_CLEAR_FOCUS =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_CLEAR_FOCUS, null);
/**
* Action that selects the node.
*/
public static final AccessibilityActionCompat ACTION_SELECT =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_SELECT, null);
/**
* Action that deselects the node.
*/
public static final AccessibilityActionCompat ACTION_CLEAR_SELECTION =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_CLEAR_SELECTION, null);
/**
* Action that clicks on the node info.
*/
public static final AccessibilityActionCompat ACTION_CLICK =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_CLICK, null);
/**
* Action that long clicks on the node.
*/
public static final AccessibilityActionCompat ACTION_LONG_CLICK =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_LONG_CLICK, null);
/**
* Action that gives accessibility focus to the node.
*/
public static final AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS, null);
/**
* Action that clears accessibility focus of the node.
*/
public static final AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null);
/**
* Action that requests to go to the next entity in this node's text
* at a given movement granularity. For example, move to the next character,
* word, etc.
*
* Arguments:
* {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT},
* {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}
* Example: Move to the previous character and do not extend selection.
*
*
*
* @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
* @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
*
* @see AccessibilityNodeInfoCompat#setMovementGranularities(int)
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
* @see AccessibilityNodeInfoCompat#getMovementGranularities()
* AccessibilityNodeInfoCompat.getMovementGranularities()
*
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_CHARACTER
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_WORD
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_LINE
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PARAGRAPH
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PAGE
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
*/
public static final AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, null);
/**
* Action that requests to go to the previous entity in this node's text
* at a given movement granularity. For example, move to the next character,
* word, etc.
*
* Arguments:
* {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT},
* {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}
* Example: Move to the next character and do not extend selection.
*
*
*
* @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
* @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
*
* @see AccessibilityNodeInfoCompat#setMovementGranularities(int)
* AccessibilityNodeInfoCompat.setMovementGranularities(int)
* @see AccessibilityNodeInfoCompat#getMovementGranularities()
* AccessibilityNodeInfoCompat.getMovementGranularities()
*
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_CHARACTER
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_WORD
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_LINE
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PARAGRAPH
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
* @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PAGE
* AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
*/
public static final AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, null);
/**
* Action to move to the next HTML element of a given type. For example, move
* to the BUTTON, INPUT, TABLE, etc.
*
*
*/
public static final AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT, null);
/**
* Action to move to the previous HTML element of a given type. For example, move
* to the BUTTON, INPUT, TABLE, etc.
*
*
*/
public static final AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_PREVIOUS_HTML_ELEMENT, null);
/**
* Action to scroll the node content forward.
*/
public static final AccessibilityActionCompat ACTION_SCROLL_FORWARD =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD, null);
/**
* Action to scroll the node content backward.
*/
public static final AccessibilityActionCompat ACTION_SCROLL_BACKWARD =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD, null);
/**
* Action to copy the current selection to the clipboard.
*/
public static final AccessibilityActionCompat ACTION_COPY =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_COPY, null);
/**
* Action to paste the current clipboard content.
*/
public static final AccessibilityActionCompat ACTION_PASTE =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_PASTE, null);
/**
* Action to cut the current selection and place it to the clipboard.
*/
public static final AccessibilityActionCompat ACTION_CUT =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_CUT, null);
/**
* Action to set the selection. Performing this action with no arguments
* clears the selection.
*
*
*
* @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_START_INT
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT
* @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_END_INT
* AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT
*/
public static final AccessibilityActionCompat ACTION_SET_SELECTION =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_SET_SELECTION, null);
/**
* Action to expand an expandable node.
*/
public static final AccessibilityActionCompat ACTION_EXPAND =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_EXPAND, null);
/**
* Action to collapse an expandable node.
*/
public static final AccessibilityActionCompat ACTION_COLLAPSE =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_COLLAPSE, null);
/**
* Action to dismiss a dismissable node.
*/
public static final AccessibilityActionCompat ACTION_DISMISS =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_DISMISS, null);
/**
* Action that sets the text of the node. Performing the action without argument,
* using null or empty {@link CharSequence} will clear the text. This
* action will also put the cursor at the end of text.
*
*/
public static final AccessibilityActionCompat ACTION_SET_TEXT =
new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_SET_TEXT, null);
/**
* Action that requests the node make its bounding rectangle visible
* on the screen, scrolling if necessary just enough.
*
* @see View#requestRectangleOnScreen(Rect)
*/
public static final AccessibilityActionCompat ACTION_SHOW_ON_SCREEN =
new AccessibilityActionCompat(IMPL.getActionShowOnScreen());
/**
* Action that scrolls the node to make the specified collection
* position visible on screen.
*
*
* @see AccessibilityNodeInfoCompat#getCollectionInfo()
*/
public static final AccessibilityActionCompat ACTION_SCROLL_TO_POSITION =
new AccessibilityActionCompat(IMPL.getActionScrollToPosition());
/**
* Action to scroll the node content up.
*/
public static final AccessibilityActionCompat ACTION_SCROLL_UP =
new AccessibilityActionCompat(IMPL.getActionScrollUp());
/**
* Action to scroll the node content left.
*/
public static final AccessibilityActionCompat ACTION_SCROLL_LEFT =
new AccessibilityActionCompat(IMPL.getActionScrollLeft());
/**
* Action to scroll the node content down.
*/
public static final AccessibilityActionCompat ACTION_SCROLL_DOWN =
new AccessibilityActionCompat(IMPL.getActionScrollDown());
/**
* Action to scroll the node content right.
*/
public static final AccessibilityActionCompat ACTION_SCROLL_RIGHT =
new AccessibilityActionCompat(IMPL.getActionScrollRight());
/**
* Action that context clicks the node.
*/
public static final AccessibilityActionCompat ACTION_CONTEXT_CLICK =
new AccessibilityActionCompat(IMPL.getActionContextClick());
/**
* Action that sets progress between {@link RangeInfoCompat#getMin() RangeInfo.getMin()} and
* {@link RangeInfoCompat#getMax() RangeInfo.getMax()}. It should use the same value type as
* {@link RangeInfoCompat#getType() RangeInfo.getType()}
*
* Arguments:
* {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_PROGRESS_VALUE}
*
* @see RangeInfoCompat
*/
public static final AccessibilityActionCompat ACTION_SET_PROGRESS =
new AccessibilityActionCompat(IMPL.getActionSetProgress());
final Object mAction;
/**
* Creates a new instance.
*
* @param actionId The action id.
* @param label The action label.
*/
public AccessibilityActionCompat(int actionId, CharSequence label) {
this(IMPL.newAccessibilityAction(actionId, label));
}
AccessibilityActionCompat(Object action) {
mAction = action;
}
/**
* Gets the id for this action.
*
* @return The action id.
*/
public int getId() {
return IMPL.getAccessibilityActionId(mAction);
}
/**
* Gets the label for this action. Its purpose is to describe the
* action to user.
*
* @return The label.
*/
public CharSequence getLabel() {
return IMPL.getAccessibilityActionLabel(mAction);
}
}
/**
* Class with information if a node is a collection.
*
* A collection of items has rows and columns and may be hierarchical.
* For example, a horizontal list is a collection with one column, as
* many rows as the list items, and is not hierarchical; A table is a
* collection with several rows, several columns, and is not hierarchical;
* A vertical tree is a hierarchical collection with one column and
* as many rows as the first level children.
*
*/
public static class CollectionInfoCompat {
/** Selection mode where items are not selectable. */
public static final int SELECTION_MODE_NONE = 0;
/** Selection mode where a single item may be selected. */
public static final int SELECTION_MODE_SINGLE = 1;
/** Selection mode where multiple items may be selected. */
public static final int SELECTION_MODE_MULTIPLE = 2;
final Object mInfo;
/**
* Returns a cached instance if such is available otherwise a new one.
*
* @param rowCount The number of rows.
* @param columnCount The number of columns.
* @param hierarchical Whether the collection is hierarchical.
* @param selectionMode The collection's selection mode, one of:
*
*
{@link #SELECTION_MODE_NONE}
*
{@link #SELECTION_MODE_SINGLE}
*
{@link #SELECTION_MODE_MULTIPLE}
*
*
* @return An instance.
*/
public static CollectionInfoCompat obtain(int rowCount, int columnCount,
boolean hierarchical, int selectionMode) {
return new CollectionInfoCompat(IMPL.obtainCollectionInfo(rowCount, columnCount,
hierarchical, selectionMode));
}
/**
* Returns a cached instance if such is available otherwise a new one.
*
* @param rowCount The number of rows.
* @param columnCount The number of columns.
* @param hierarchical Whether the collection is hierarchical.
*
* @return An instance.
*/
public static CollectionInfoCompat obtain(int rowCount, int columnCount,
boolean hierarchical) {
return new CollectionInfoCompat(IMPL.obtainCollectionInfo(rowCount, columnCount,
hierarchical));
}
CollectionInfoCompat(Object info) {
mInfo = info;
}
/**
* Gets the number of columns.
*
* @return The column count.
*/
public int getColumnCount() {
return IMPL.getCollectionInfoColumnCount(mInfo);
}
/**
* Gets the number of rows.
*
* @return The row count.
*/
public int getRowCount() {
return IMPL.getCollectionInfoRowCount(mInfo);
}
/**
* Gets if the collection is a hierarchically ordered.
*
* @return Whether the collection is hierarchical.
*/
public boolean isHierarchical() {
return IMPL.isCollectionInfoHierarchical(mInfo);
}
/**
* Gets the collection's selection mode.
*
* @return The collection's selection mode, one of:
*
*
{@link #SELECTION_MODE_NONE}
*
{@link #SELECTION_MODE_SINGLE}
*
{@link #SELECTION_MODE_MULTIPLE}
*
*/
public int getSelectionMode() {
return IMPL.getCollectionInfoSelectionMode(mInfo);
}
}
/**
* Class with information if a node is a collection item.
*
* A collection item is contained in a collection, it starts at
* a given row and column in the collection, and spans one or
* more rows and columns. For example, a header of two related
* table columns starts at the first row and the first column,
* spans one row and two columns.
*
*/
public static class CollectionItemInfoCompat {
final Object mInfo;
/**
* Returns a cached instance if such is available otherwise a new one.
*
* @param rowIndex The row index at which the item is located.
* @param rowSpan The number of rows the item spans.
* @param columnIndex The column index at which the item is located.
* @param columnSpan The number of columns the item spans.
* @param heading Whether the item is a heading.
* @param selected Whether the item is selected.
* @return An instance.
*/
public static CollectionItemInfoCompat obtain(int rowIndex, int rowSpan,
int columnIndex, int columnSpan, boolean heading, boolean selected) {
return new CollectionItemInfoCompat(IMPL.obtainCollectionItemInfo(rowIndex, rowSpan,
columnIndex, columnSpan, heading, selected));
}
/**
* Returns a cached instance if such is available otherwise a new one.
*
* @param rowIndex The row index at which the item is located.
* @param rowSpan The number of rows the item spans.
* @param columnIndex The column index at which the item is located.
* @param columnSpan The number of columns the item spans.
* @param heading Whether the item is a heading.
* @return An instance.
*/
public static CollectionItemInfoCompat obtain(int rowIndex, int rowSpan,
int columnIndex, int columnSpan, boolean heading) {
return new CollectionItemInfoCompat(IMPL.obtainCollectionItemInfo(rowIndex, rowSpan,
columnIndex, columnSpan, heading));
}
CollectionItemInfoCompat(Object info) {
mInfo = info;
}
/**
* Gets the column index at which the item is located.
*
* @return The column index.
*/
public int getColumnIndex() {
return IMPL.getCollectionItemColumnIndex(mInfo);
}
/**
* Gets the number of columns the item spans.
*
* @return The column span.
*/
public int getColumnSpan() {
return IMPL.getCollectionItemColumnSpan(mInfo);
}
/**
* Gets the row index at which the item is located.
*
* @return The row index.
*/
public int getRowIndex() {
return IMPL.getCollectionItemRowIndex(mInfo);
}
/**
* Gets the number of rows the item spans.
*
* @return The row span.
*/
public int getRowSpan() {
return IMPL.getCollectionItemRowSpan(mInfo);
}
/**
* Gets if the collection item is a heading. For example, section
* heading, table header, etc.
*
* @return If the item is a heading.
*/
public boolean isHeading() {
return IMPL.isCollectionItemHeading(mInfo);
}
/**
* Gets if the collection item is selected.
*
* @return If the item is selected.
*/
public boolean isSelected() {
return IMPL.isCollectionItemSelected(mInfo);
}
}
/**
* Class with information if a node is a range.
*/
public static class RangeInfoCompat {
/** Range type: integer. */
public static final int RANGE_TYPE_INT = 0;
/** Range type: float. */
public static final int RANGE_TYPE_FLOAT = 1;
/** Range type: percent with values from zero to one.*/
public static final int RANGE_TYPE_PERCENT = 2;
/**
* Obtains a cached instance if such is available otherwise a new one.
*
* @param type The type of the range.
* @param min The min value.
* @param max The max value.
* @param current The current value.
* @return The instance
*/
public static RangeInfoCompat obtain(int type, float min, float max, float current) {
return new RangeInfoCompat(IMPL.obtainRangeInfo(type, min, max, current));
}
final Object mInfo;
RangeInfoCompat(Object info) {
mInfo = info;
}
/**
* Gets the current value.
*
* @return The current value.
*/
public float getCurrent() {
return AccessibilityNodeInfoCompatKitKat.RangeInfo.getCurrent(mInfo);
}
/**
* Gets the max value.
*
* @return The max value.
*/
public float getMax() {
return AccessibilityNodeInfoCompatKitKat.RangeInfo.getMax(mInfo);
}
/**
* Gets the min value.
*
* @return The min value.
*/
public float getMin() {
return AccessibilityNodeInfoCompatKitKat.RangeInfo.getMin(mInfo);
}
/**
* Gets the range type.
*
* @return The range type.
*
* @see #RANGE_TYPE_INT
* @see #RANGE_TYPE_FLOAT
* @see #RANGE_TYPE_PERCENT
*/
public int getType() {
return AccessibilityNodeInfoCompatKitKat.RangeInfo.getType(mInfo);
}
}
static class AccessibilityNodeInfoBaseImpl {
public Object newAccessibilityAction(int actionId, CharSequence label) {
return null;
}
public AccessibilityNodeInfo obtain(View root, int virtualDescendantId) {
return null;
}
public void addAction(AccessibilityNodeInfo info, Object action) {
}
public boolean removeAction(AccessibilityNodeInfo info, Object action) {
return false;
}
public int getAccessibilityActionId(Object action) {
return 0;
}
public CharSequence getAccessibilityActionLabel(Object action) {
return null;
}
public void addChild(AccessibilityNodeInfo info, View child, int virtualDescendantId) {
}
public boolean removeChild(AccessibilityNodeInfo info, View child) {
return false;
}
public boolean removeChild(AccessibilityNodeInfo info, View root, int virtualDescendantId) {
return false;
}
public boolean isVisibleToUser(AccessibilityNodeInfo info) {
return false;
}
public boolean isAccessibilityFocused(AccessibilityNodeInfo info) {
return false;
}
public boolean performAction(AccessibilityNodeInfo info, int action, Bundle arguments) {
return false;
}
public void setMovementGranularities(AccessibilityNodeInfo info, int granularities) {
}
public int getMovementGranularities(AccessibilityNodeInfo info) {
return 0;
}
public void setVisibleToUser(AccessibilityNodeInfo info, boolean visibleToUser) {
}
public void setAccessibilityFocused(AccessibilityNodeInfo info, boolean focused) {
}
public void setSource(AccessibilityNodeInfo info, View root, int virtualDescendantId) {
}
public Object findFocus(AccessibilityNodeInfo info, int focus) {
return null;
}
public Object focusSearch(AccessibilityNodeInfo info, int direction) {
return null;
}
public void setParent(AccessibilityNodeInfo info, View root, int virtualDescendantId) {
}
public String getViewIdResourceName(AccessibilityNodeInfo info) {
return null;
}
public void setViewIdResourceName(AccessibilityNodeInfo info, String viewId) {
}
public int getLiveRegion(AccessibilityNodeInfo info) {
return ViewCompat.ACCESSIBILITY_LIVE_REGION_NONE;
}
public void setLiveRegion(AccessibilityNodeInfo info, int mode) {
// No-op
}
public Object getCollectionInfo(AccessibilityNodeInfo info) {
return null;
}
public void setCollectionInfo(AccessibilityNodeInfo info, Object collectionInfo) {
}
public Object getCollectionItemInfo(AccessibilityNodeInfo info) {
return null;
}
public void setCollectionItemInfo(AccessibilityNodeInfo info, Object collectionItemInfo) {
}
public Object getRangeInfo(AccessibilityNodeInfo info) {
return null;
}
public void setRangeInfo(AccessibilityNodeInfo info, Object rangeInfo) {
}
public List