diff options
author | Alan Viverette <alanv@google.com> | 2013-08-28 10:43:07 -0700 |
---|---|---|
committer | Alan Viverette <alanv@google.com> | 2013-08-28 10:43:07 -0700 |
commit | 5b2081dc41cccd76780a2cb4e9a973505c13446c (patch) | |
tree | 8d46eeca6026120c4f9ad4785355056a8234d1ce /core | |
parent | 116c12ef4c5fc2d5e5e90a417c4386c1f9a3ddf6 (diff) | |
download | frameworks_base-5b2081dc41cccd76780a2cb4e9a973505c13446c.zip frameworks_base-5b2081dc41cccd76780a2cb4e9a973505c13446c.tar.gz frameworks_base-5b2081dc41cccd76780a2cb4e9a973505c13446c.tar.bz2 |
Implement new accessibility APIs in lists, text view
Sets contentInvalid for TextViews with errors, sets collection
and item properties in AbsListView, GridView, and ListView.
BUG: 10391326
Change-Id: I91191c8ce1e10a1112f74215e30b26349396344b
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/widget/AbsListView.java | 67 | ||||
-rw-r--r-- | core/java/android/widget/GridView.java | 35 | ||||
-rw-r--r-- | core/java/android/widget/ListView.java | 17 | ||||
-rw-r--r-- | core/java/android/widget/TextView.java | 5 |
4 files changed, 97 insertions, 27 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 285e6f2..be47bf0 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -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; diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index a7d546a..15daf83 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -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); } } diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 014306d..941ddfc 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -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); } } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index d5fc21c..a2d48a8 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -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)) { |