From b3fa2787eabd2be6d7780e215db0d9a5904ba47c Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Fri, 5 Dec 2014 13:02:24 -0800 Subject: [PATCH] When accessibility on cannot click on a view covered by a HorizontalScrollView In accessibility mode we send down and up events activate a view. We will later switch to accessibility actions but for now as a bridge-gap we compute a point on the screen where to click for activating the view. The heuristic we use has edge cases such as a view that handles all touch events but does not have any listeners. In this case we do not ignore the target view's area covered by a view that handles all touch events. As a result we click on the wrong target. While we cannot solve this generically, in the case of standard components such as HorizontalScrollView we can. bug:18612258 Change-Id: If8482aac0d0ea53c5c90367d099d1b8d3a4559ed --- core/java/android/view/View.java | 7 +++++-- core/java/android/view/ViewGroup.java | 5 ++++- .../java/android/widget/HorizontalScrollView.java | 15 ++++++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index b54d462730c8f..89cbbfd393df2 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -5938,9 +5938,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * layer. * * @param outRects List to which to add clickable areas. + * + * @hide */ - void addClickableRectsForAccessibility(List outRects) { - if (isClickable() || isLongClickable()) { + public void addClickableRectsForAccessibility(List outRects) { + if (isClickable() || isLongClickable() + || (mListenerInfo != null && mListenerInfo.mOnTouchListener != null)) { RectF bounds = new RectF(); bounds.set(0, 0, getWidth(), getHeight()); outRects.add(bounds); diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 1551504acdb24..64c8ca6c8d030 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -880,8 +880,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return true; } + /** + * @hide + */ @Override - void addClickableRectsForAccessibility(List outRects) { + public void addClickableRectsForAccessibility(List outRects) { int sizeBefore = outRects.size(); super.addClickableRectsForAccessibility(outRects); diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index 0c65c5044da3b..371b4804a1de3 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; +import android.graphics.RectF; import android.os.Build; import android.os.Bundle; import android.os.Parcel; @@ -757,10 +758,22 @@ public class HorizontalScrollView extends FrameLayout { } else { super.scrollTo(scrollX, scrollY); } - + awakenScrollBars(); } + /** + * @hide + */ + @Override + public void addClickableRectsForAccessibility(List outRects) { + // This class always consumes touch events, therefore if it + // covers a view we do not want to send a click over it. + RectF bounds = new RectF(); + bounds.set(0, 0, getWidth(), getHeight()); + outRects.add(bounds); + } + @Override public boolean performAccessibilityAction(int action, Bundle arguments) { if (super.performAccessibilityAction(action, arguments)) {