summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2013-08-28 10:43:07 -0700
committerAlan Viverette <alanv@google.com>2013-08-28 10:43:07 -0700
commit5b2081dc41cccd76780a2cb4e9a973505c13446c (patch)
tree8d46eeca6026120c4f9ad4785355056a8234d1ce /core
parent116c12ef4c5fc2d5e5e90a417c4386c1f9a3ddf6 (diff)
downloadframeworks_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.java67
-rw-r--r--core/java/android/widget/GridView.java35
-rw-r--r--core/java/android/widget/ListView.java17
-rw-r--r--core/java/android/widget/TextView.java5
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)) {