From 23f4432437b2ab742971055b7eb79b346894f24b Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Mon, 6 Apr 2015 16:04:56 -0700 Subject: Add accessibility action for scrolling to a collection position Cleans up verbose R package in GridView, accessibility action docs, and some lint warnings in AccessibilityNodeInfo. Makes the action IDs for SHOW_ON_SCREEN and SCROLL_TO_POSITION public so that we can guarantee they won't change (and thus reference them in support lib). Change-Id: Ica53b7be7a68b84054b9bac1fc7958a21a42e089 --- core/java/android/widget/GridView.java | 50 ++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 8 deletions(-) (limited to 'core/java/android/widget/GridView.java') diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index c6e3dc8..be0ca71 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; import android.graphics.Rect; +import android.os.Bundle; import android.os.Trace; import android.util.AttributeSet; import android.util.MathUtils; @@ -32,12 +33,15 @@ import android.view.ViewDebug; import android.view.ViewGroup; import android.view.ViewRootImpl; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo; import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo; import android.view.animation.GridLayoutAnimationController; import android.widget.RemoteViews.RemoteView; +import com.android.internal.R; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -117,7 +121,7 @@ public class GridView extends AbsListView { } public GridView(Context context, AttributeSet attrs) { - this(context, attrs, com.android.internal.R.attr.gridViewStyle); + this(context, attrs, R.attr.gridViewStyle); } public GridView(Context context, AttributeSet attrs, int defStyleAttr) { @@ -128,30 +132,30 @@ public class GridView extends AbsListView { super(context, attrs, defStyleAttr, defStyleRes); final TypedArray a = context.obtainStyledAttributes( - attrs, com.android.internal.R.styleable.GridView, defStyleAttr, defStyleRes); + attrs, R.styleable.GridView, defStyleAttr, defStyleRes); int hSpacing = a.getDimensionPixelOffset( - com.android.internal.R.styleable.GridView_horizontalSpacing, 0); + R.styleable.GridView_horizontalSpacing, 0); setHorizontalSpacing(hSpacing); int vSpacing = a.getDimensionPixelOffset( - com.android.internal.R.styleable.GridView_verticalSpacing, 0); + R.styleable.GridView_verticalSpacing, 0); setVerticalSpacing(vSpacing); - int index = a.getInt(com.android.internal.R.styleable.GridView_stretchMode, STRETCH_COLUMN_WIDTH); + int index = a.getInt(R.styleable.GridView_stretchMode, STRETCH_COLUMN_WIDTH); if (index >= 0) { setStretchMode(index); } - int columnWidth = a.getDimensionPixelOffset(com.android.internal.R.styleable.GridView_columnWidth, -1); + int columnWidth = a.getDimensionPixelOffset(R.styleable.GridView_columnWidth, -1); if (columnWidth > 0) { setColumnWidth(columnWidth); } - int numColumns = a.getInt(com.android.internal.R.styleable.GridView_numColumns, 1); + int numColumns = a.getInt(R.styleable.GridView_numColumns, 1); setNumColumns(numColumns); - index = a.getInt(com.android.internal.R.styleable.GridView_gravity, -1); + index = a.getInt(R.styleable.GridView_gravity, -1); if (index >= 0) { setGravity(index); } @@ -2356,6 +2360,36 @@ public class GridView extends AbsListView { final CollectionInfo collectionInfo = CollectionInfo.obtain( rowsCount, columnsCount, false, selectionMode); info.setCollectionInfo(collectionInfo); + + if (columnsCount > 0 || rowsCount > 0) { + info.addAction(AccessibilityAction.ACTION_SCROLL_TO_POSITION); + } + } + + /** @hide */ + @Override + public boolean performAccessibilityActionInternal(int action, Bundle arguments) { + if (super.performAccessibilityActionInternal(action, arguments)) { + return true; + } + + switch (action) { + case R.id.accessibilityActionScrollToPosition: { + // GridView only supports scrolling in one direction, so we can + // ignore the column argument. + final int numColumns = getNumColumns(); + final int row = arguments.getInt(AccessibilityNodeInfo.ACTION_ARGUMENT_ROW_INT, -1); + final int position = Math.min(row * numColumns, getCount() - 1); + if (row >= 0) { + // The accessibility service gets data asynchronously, so + // we'll be a little lenient by clamping the last position. + smoothScrollToPosition(position); + return true; + } + } break; + } + + return false; } @Override -- cgit v1.1