Merge "Accessibility: Ignore overlapping siblings when computing a click location" into lmp-mr1-dev
This commit is contained in:
@@ -5932,23 +5932,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the clickable rectangles withing the bounds of this view. They
|
||||
* may overlap. This method is intended for use only by the accessibility
|
||||
* layer.
|
||||
*
|
||||
* @param outRects List to which to add clickable areas.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public void addClickableRectsForAccessibility(List<RectF> outRects) {
|
||||
if (isClickable() || isLongClickable()) {
|
||||
RectF bounds = new RectF();
|
||||
bounds.set(0, 0, getWidth(), getHeight());
|
||||
outRects.add(bounds);
|
||||
}
|
||||
}
|
||||
|
||||
static void offsetRects(List<RectF> rects, float offsetX, float offsetY) {
|
||||
final int rectCount = rects.size();
|
||||
for (int i = 0; i < rectCount; i++) {
|
||||
|
||||
@@ -855,27 +855,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
|
||||
|
||||
// Compute the intersection between the child and the sibling.
|
||||
if (siblingBounds.intersect(bounds)) {
|
||||
List<RectF> clickableRects = new ArrayList<>();
|
||||
sibling.addClickableRectsForAccessibility(clickableRects);
|
||||
|
||||
final int clickableRectCount = clickableRects.size();
|
||||
for (int j = 0; j < clickableRectCount; j++) {
|
||||
RectF clickableRect = clickableRects.get(j);
|
||||
|
||||
// Translate the clickable rect to our coordinates.
|
||||
offsetChildRectToMyCoords(clickableRect, sibling);
|
||||
|
||||
// Compute the intersection between the child and the clickable rects.
|
||||
if (clickableRect.intersect(bounds)) {
|
||||
// If a clickable rect completely covers the child, done.
|
||||
if (clickableRect.equals(bounds)) {
|
||||
releaseOrderedChildIterator();
|
||||
return false;
|
||||
}
|
||||
// Keep track of the intersection rectangle.
|
||||
intersections.add(clickableRect);
|
||||
}
|
||||
}
|
||||
// Conservatively we consider an overlapping sibling to be
|
||||
// interactive and ignore it. This is not ideal as if the
|
||||
// sibling completely covers the view despite handling no
|
||||
// touch events we will not be able to click on the view.
|
||||
intersections.add(siblingBounds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -890,54 +874,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public void addClickableRectsForAccessibility(List<RectF> outRects) {
|
||||
int sizeBefore = outRects.size();
|
||||
|
||||
super.addClickableRectsForAccessibility(outRects);
|
||||
|
||||
// If we added ourselves, then no need to visit children.
|
||||
if (outRects.size() > sizeBefore) {
|
||||
return;
|
||||
}
|
||||
|
||||
Iterator<View> iterator = obtainOrderedChildIterator();
|
||||
while (iterator.hasNext()) {
|
||||
View child = iterator.next();
|
||||
|
||||
// Cannot click on an invisible view.
|
||||
if (!isVisible(child)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
sizeBefore = outRects.size();
|
||||
|
||||
// Add clickable rects in the child bounds.
|
||||
child.addClickableRectsForAccessibility(outRects);
|
||||
|
||||
// Offset the clickable rects for out children to our coordinates.
|
||||
final int sizeAfter = outRects.size();
|
||||
for (int j = sizeBefore; j < sizeAfter; j++) {
|
||||
RectF rect = outRects.get(j);
|
||||
|
||||
// Translate the clickable rect to our coordinates.
|
||||
offsetChildRectToMyCoords(rect, child);
|
||||
|
||||
// If a clickable rect fills the parent, done.
|
||||
if ((int) rect.left == 0 && (int) rect.top == 0
|
||||
&& (int) rect.right == mRight && (int) rect.bottom == mBottom) {
|
||||
releaseOrderedChildIterator();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
releaseOrderedChildIterator();
|
||||
}
|
||||
|
||||
private void offsetChildRectToMyCoords(RectF rect, View child) {
|
||||
if (!child.hasIdentityMatrix()) {
|
||||
child.getMatrix().mapRect(rect);
|
||||
|
||||
@@ -762,18 +762,6 @@ public class HorizontalScrollView extends FrameLayout {
|
||||
awakenScrollBars();
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public void addClickableRectsForAccessibility(List<RectF> 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)) {
|
||||
|
||||
@@ -1097,18 +1097,6 @@ public class Toolbar extends ViewGroup {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public void addClickableRectsForAccessibility(List<RectF> 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
|
||||
@@ -227,18 +227,6 @@ public class ActionBarContainer extends FrameLayout {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@Override
|
||||
public void addClickableRectsForAccessibility(List<RectF> 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 onHoverEvent(MotionEvent ev) {
|
||||
super.onHoverEvent(ev);
|
||||
|
||||
Reference in New Issue
Block a user