am ce9e2526
: Merge "Implement new accessibility APIs in lists, text view" into klp-dev
* commit 'ce9e2526d43159df931cc9c0ba7173960d8a6a06': Implement new accessibility APIs in lists, text view
This commit is contained in:
@ -30370,6 +30370,7 @@ package android.widget {
|
||||
method protected void layoutChildren();
|
||||
method public void onFilterComplete(int);
|
||||
method public void onGlobalLayout();
|
||||
method public void onInitializeAccessibilityNodeInfoForItem(android.view.View, int, android.view.accessibility.AccessibilityNodeInfo);
|
||||
method public boolean onRemoteAdapterConnected();
|
||||
method public void onRemoteAdapterDisconnected();
|
||||
method public void onRestoreInstanceState(android.os.Parcelable);
|
||||
|
@ -2309,33 +2309,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
|
||||
super.onInitializeAccessibilityNodeInfo(host, info);
|
||||
|
||||
final int position = getPositionForView(host);
|
||||
final ListAdapter adapter = getAdapter();
|
||||
|
||||
if ((position == INVALID_POSITION) || (adapter == null)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isEnabled() || !adapter.isEnabled(position)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (position == getSelectedItemPosition()) {
|
||||
info.setSelected(true);
|
||||
info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION);
|
||||
} else {
|
||||
info.addAction(AccessibilityNodeInfo.ACTION_SELECT);
|
||||
}
|
||||
|
||||
if (isClickable()) {
|
||||
info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
|
||||
info.setClickable(true);
|
||||
}
|
||||
|
||||
if (isLongClickable()) {
|
||||
info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
|
||||
info.setLongClickable(true);
|
||||
}
|
||||
|
||||
onInitializeAccessibilityNodeInfoForItem(host, position, info);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -2388,6 +2362,45 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes an {@link AccessibilityNodeInfo} with information about a
|
||||
* particular item in the list.
|
||||
*
|
||||
* @param view View representing the list item.
|
||||
* @param position Position of the list item within the adapter.
|
||||
* @param info Node info to populate.
|
||||
*/
|
||||
public void onInitializeAccessibilityNodeInfoForItem(
|
||||
View view, int position, AccessibilityNodeInfo info) {
|
||||
final ListAdapter adapter = getAdapter();
|
||||
if (position == INVALID_POSITION || adapter == null) {
|
||||
// The item doesn't exist, so there's not much we can do here.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isEnabled() || !adapter.isEnabled(position)) {
|
||||
info.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (position == getSelectedItemPosition()) {
|
||||
info.setSelected(true);
|
||||
info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION);
|
||||
} else {
|
||||
info.addAction(AccessibilityNodeInfo.ACTION_SELECT);
|
||||
}
|
||||
|
||||
if (isClickable()) {
|
||||
info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
|
||||
info.setClickable(true);
|
||||
}
|
||||
|
||||
if (isLongClickable()) {
|
||||
info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
|
||||
info.setLongClickable(true);
|
||||
}
|
||||
}
|
||||
|
||||
void positionSelector(int position, View sel) {
|
||||
if (position != INVALID_POSITION) {
|
||||
mSelectorPosition = position;
|
||||
|
@ -30,7 +30,10 @@ import android.view.ViewDebug;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
|
||||
import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
|
||||
import android.view.animation.GridLayoutAnimationController;
|
||||
import android.widget.AbsListView.LayoutParams;
|
||||
import android.widget.RemoteViews.RemoteView;
|
||||
|
||||
|
||||
@ -2259,5 +2262,37 @@ public class GridView extends AbsListView {
|
||||
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
||||
super.onInitializeAccessibilityNodeInfo(info);
|
||||
info.setClassName(GridView.class.getName());
|
||||
|
||||
final int columnsCount = getNumColumns();
|
||||
final int rowsCount = getCount() / columnsCount;
|
||||
final CollectionInfo collectionInfo = CollectionInfo.obtain(columnsCount, rowsCount, false);
|
||||
info.setCollectionInfo(collectionInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitializeAccessibilityNodeInfoForItem(
|
||||
View view, int position, AccessibilityNodeInfo info) {
|
||||
super.onInitializeAccessibilityNodeInfoForItem(view, position, info);
|
||||
|
||||
final int count = getCount();
|
||||
final int columnsCount = getNumColumns();
|
||||
final int rowsCount = count / columnsCount;
|
||||
|
||||
final int row;
|
||||
final int column;
|
||||
if (!mStackFromBottom) {
|
||||
column = position % columnsCount;
|
||||
row = position / columnsCount;
|
||||
} else {
|
||||
final int invertedIndex = count - 1 - position;
|
||||
|
||||
column = columnsCount - 1 - (invertedIndex % columnsCount);
|
||||
row = rowsCount - 1 - invertedIndex / columnsCount;
|
||||
}
|
||||
|
||||
final LayoutParams lp = (LayoutParams) view.getLayoutParams();
|
||||
final boolean isHeading = lp != null && lp.viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
|
||||
final CollectionItemInfo itemInfo = CollectionItemInfo.obtain(column, 1, row, 1, isHeading);
|
||||
info.setCollectionItemInfo(itemInfo);
|
||||
}
|
||||
}
|
||||
|
@ -42,6 +42,8 @@ import android.view.ViewParent;
|
||||
import android.view.ViewRootImpl;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
|
||||
import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
|
||||
import android.widget.RemoteViews.RemoteView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -3778,5 +3780,20 @@ public class ListView extends AbsListView {
|
||||
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
||||
super.onInitializeAccessibilityNodeInfo(info);
|
||||
info.setClassName(ListView.class.getName());
|
||||
|
||||
final int count = getCount();
|
||||
final CollectionInfo collectionInfo = CollectionInfo.obtain(1, count, false);
|
||||
info.setCollectionInfo(collectionInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInitializeAccessibilityNodeInfoForItem(
|
||||
View view, int position, AccessibilityNodeInfo info) {
|
||||
super.onInitializeAccessibilityNodeInfoForItem(view, position, info);
|
||||
|
||||
final LayoutParams lp = (LayoutParams) view.getLayoutParams();
|
||||
final boolean isHeading = lp != null && lp.viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
|
||||
final CollectionItemInfo itemInfo = CollectionItemInfo.obtain(0, 1, position, 1, isHeading);
|
||||
info.setCollectionItemInfo(itemInfo);
|
||||
}
|
||||
}
|
||||
|
@ -4406,6 +4406,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
public void setError(CharSequence error, Drawable icon) {
|
||||
createEditorIfNeeded();
|
||||
mEditor.setError(error, icon);
|
||||
notifyViewAccessibilityStateChangedIfNeeded();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -8147,6 +8148,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
||||
|
||||
if (mEditor != null) {
|
||||
info.setInputType(mEditor.mInputType);
|
||||
|
||||
if (mEditor.mError != null) {
|
||||
info.setContentInvalid(true);
|
||||
}
|
||||
}
|
||||
|
||||
if (!TextUtils.isEmpty(mText)) {
|
||||
|
Reference in New Issue
Block a user