summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authoralanv <alanv@google.com>2012-05-08 14:47:24 -0700
committeralanv <alanv@google.com>2012-05-08 14:50:02 -0700
commitc1d7e770e123adfa992d013fa294693d077cbc78 (patch)
tree2eb21eefc5c1be4f980bfb63a5a8a69a456c7d7c /core
parent14326fd456f8b457e4ab7b53393b9b1e0d1726aa (diff)
downloadframeworks_base-c1d7e770e123adfa992d013fa294693d077cbc78.zip
frameworks_base-c1d7e770e123adfa992d013fa294693d077cbc78.tar.gz
frameworks_base-c1d7e770e123adfa992d013fa294693d077cbc78.tar.bz2
Delegate list item focus and click actions to the parent list.
Change-Id: Ie05c79f049896bfb498d4b33f0611da38f381140
Diffstat (limited to 'core')
-rw-r--r--core/java/android/widget/AbsListView.java78
1 files changed, 78 insertions, 0 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index a3b613b..59db8d6 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -25,6 +25,7 @@ import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
+import android.os.Bundle;
import android.os.Debug;
import android.os.Handler;
import android.os.Parcel;
@@ -57,6 +58,7 @@ import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
@@ -648,6 +650,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
private int mGlowPaddingLeft;
private int mGlowPaddingRight;
+ /**
+ * Used for interacting with list items from an accessibility service.
+ */
+ private ListItemAccessibilityDelegate mAccessibilityDelegate;
+
private int mLastAccessibilityScrollEventFromIndex;
private int mLastAccessibilityScrollEventToIndex;
@@ -2121,9 +2128,77 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
child.setLayoutParams(lp);
}
+ if (AccessibilityManager.getInstance(mContext).isEnabled()) {
+ if (mAccessibilityDelegate == null) {
+ mAccessibilityDelegate = new ListItemAccessibilityDelegate();
+ }
+ child.setAccessibilityDelegate(mAccessibilityDelegate);
+ }
+
return child;
}
+ class ListItemAccessibilityDelegate extends AccessibilityDelegate {
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+
+ final int position = getPositionForView(host);
+
+ if (position == INVALID_POSITION) {
+ return;
+ }
+
+ if (isClickable()) {
+ info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
+ info.setClickable(true);
+ }
+
+ if (isLongClickable()) {
+ info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
+ info.setLongClickable(true);
+ }
+
+ info.addAction(AccessibilityNodeInfo.ACTION_SELECT);
+
+ if (position == getSelectedItemPosition()) {
+ info.setSelected(true);
+ }
+ }
+
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle arguments) {
+ final int position = getPositionForView(host);
+
+ if (position == INVALID_POSITION) {
+ return false;
+ }
+
+ final long id = getItemIdAtPosition(position);
+
+ switch (action) {
+ case AccessibilityNodeInfo.ACTION_SELECT:
+ setSelection(position);
+ return true;
+ case AccessibilityNodeInfo.ACTION_CLICK:
+ if (!super.performAccessibilityAction(host, action, arguments)) {
+ return performItemClick(host, position, id);
+ }
+ return true;
+ case AccessibilityNodeInfo.ACTION_LONG_CLICK:
+ if (!super.performAccessibilityAction(host, action, arguments)) {
+ return performLongPress(host, position, id);
+ }
+ return true;
+ case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
+ smoothScrollToPosition(position);
+ break;
+ }
+
+ return super.performAccessibilityAction(host, action, arguments);
+ }
+ }
+
void positionSelector(int position, View sel) {
if (position != INVALID_POSITION) {
mSelectorPosition = position;
@@ -5651,6 +5726,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
// Don't reclaim header or footer views, or views that should be ignored
if (lp != null && mRecycler.shouldRecycleViewType(lp.viewType)) {
views.add(child);
+ child.setAccessibilityDelegate(null);
if (listener != null) {
// Pretend they went through the scrap heap
listener.onMovedToScrapHeap(child);
@@ -6206,6 +6282,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mScrapViews[viewType].add(scrap);
}
+ scrap.setAccessibilityDelegate(null);
if (mRecyclerListener != null) {
mRecyclerListener.onMovedToScrapHeap(scrap);
}
@@ -6267,6 +6344,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
lp.scrappedFromPosition = mFirstActivePosition + i;
scrapViews.add(victim);
+ victim.setAccessibilityDelegate(null);
if (hasListener) {
mRecyclerListener.onMovedToScrapHeap(victim);
}