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 protected void layoutChildren();
|
||||||
method public void onFilterComplete(int);
|
method public void onFilterComplete(int);
|
||||||
method public void onGlobalLayout();
|
method public void onGlobalLayout();
|
||||||
|
method public void onInitializeAccessibilityNodeInfoForItem(android.view.View, int, android.view.accessibility.AccessibilityNodeInfo);
|
||||||
method public boolean onRemoteAdapterConnected();
|
method public boolean onRemoteAdapterConnected();
|
||||||
method public void onRemoteAdapterDisconnected();
|
method public void onRemoteAdapterDisconnected();
|
||||||
method public void onRestoreInstanceState(android.os.Parcelable);
|
method public void onRestoreInstanceState(android.os.Parcelable);
|
||||||
|
@ -2309,33 +2309,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
|
|||||||
super.onInitializeAccessibilityNodeInfo(host, info);
|
super.onInitializeAccessibilityNodeInfo(host, info);
|
||||||
|
|
||||||
final int position = getPositionForView(host);
|
final int position = getPositionForView(host);
|
||||||
final ListAdapter adapter = getAdapter();
|
onInitializeAccessibilityNodeInfoForItem(host, position, info);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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) {
|
void positionSelector(int position, View sel) {
|
||||||
if (position != INVALID_POSITION) {
|
if (position != INVALID_POSITION) {
|
||||||
mSelectorPosition = position;
|
mSelectorPosition = position;
|
||||||
|
@ -30,7 +30,10 @@ import android.view.ViewDebug;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
import android.view.accessibility.AccessibilityEvent;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
|
||||||
|
import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
|
||||||
import android.view.animation.GridLayoutAnimationController;
|
import android.view.animation.GridLayoutAnimationController;
|
||||||
|
import android.widget.AbsListView.LayoutParams;
|
||||||
import android.widget.RemoteViews.RemoteView;
|
import android.widget.RemoteViews.RemoteView;
|
||||||
|
|
||||||
|
|
||||||
@ -2259,5 +2262,37 @@ public class GridView extends AbsListView {
|
|||||||
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
||||||
super.onInitializeAccessibilityNodeInfo(info);
|
super.onInitializeAccessibilityNodeInfo(info);
|
||||||
info.setClassName(GridView.class.getName());
|
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.ViewRootImpl;
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
import android.view.accessibility.AccessibilityEvent;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
|
||||||
|
import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
|
||||||
import android.widget.RemoteViews.RemoteView;
|
import android.widget.RemoteViews.RemoteView;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -3778,5 +3780,20 @@ public class ListView extends AbsListView {
|
|||||||
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
||||||
super.onInitializeAccessibilityNodeInfo(info);
|
super.onInitializeAccessibilityNodeInfo(info);
|
||||||
info.setClassName(ListView.class.getName());
|
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) {
|
public void setError(CharSequence error, Drawable icon) {
|
||||||
createEditorIfNeeded();
|
createEditorIfNeeded();
|
||||||
mEditor.setError(error, icon);
|
mEditor.setError(error, icon);
|
||||||
|
notifyViewAccessibilityStateChangedIfNeeded();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -8147,6 +8148,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
|
|||||||
|
|
||||||
if (mEditor != null) {
|
if (mEditor != null) {
|
||||||
info.setInputType(mEditor.mInputType);
|
info.setInputType(mEditor.mInputType);
|
||||||
|
|
||||||
|
if (mEditor.mError != null) {
|
||||||
|
info.setContentInvalid(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(mText)) {
|
if (!TextUtils.isEmpty(mText)) {
|
||||||
|
Reference in New Issue
Block a user