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;
|
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) {
|
static void offsetRects(List<RectF> rects, float offsetX, float offsetY) {
|
||||||
final int rectCount = rects.size();
|
final int rectCount = rects.size();
|
||||||
for (int i = 0; i < rectCount; i++) {
|
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.
|
// Compute the intersection between the child and the sibling.
|
||||||
if (siblingBounds.intersect(bounds)) {
|
if (siblingBounds.intersect(bounds)) {
|
||||||
List<RectF> clickableRects = new ArrayList<>();
|
// Conservatively we consider an overlapping sibling to be
|
||||||
sibling.addClickableRectsForAccessibility(clickableRects);
|
// interactive and ignore it. This is not ideal as if the
|
||||||
|
// sibling completely covers the view despite handling no
|
||||||
final int clickableRectCount = clickableRects.size();
|
// touch events we will not be able to click on the view.
|
||||||
for (int j = 0; j < clickableRectCount; j++) {
|
intersections.add(siblingBounds);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -890,54 +874,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
|
|||||||
return true;
|
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) {
|
private void offsetChildRectToMyCoords(RectF rect, View child) {
|
||||||
if (!child.hasIdentityMatrix()) {
|
if (!child.hasIdentityMatrix()) {
|
||||||
child.getMatrix().mapRect(rect);
|
child.getMatrix().mapRect(rect);
|
||||||
|
|||||||
@@ -762,18 +762,6 @@ public class HorizontalScrollView extends FrameLayout {
|
|||||||
awakenScrollBars();
|
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
|
@Override
|
||||||
public boolean performAccessibilityAction(int action, Bundle arguments) {
|
public boolean performAccessibilityAction(int action, Bundle arguments) {
|
||||||
if (super.performAccessibilityAction(action, arguments)) {
|
if (super.performAccessibilityAction(action, arguments)) {
|
||||||
|
|||||||
@@ -1097,18 +1097,6 @@ public class Toolbar extends ViewGroup {
|
|||||||
return true;
|
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
|
* @hide
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -227,18 +227,6 @@ public class ActionBarContainer extends FrameLayout {
|
|||||||
return true;
|
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
|
@Override
|
||||||
public boolean onHoverEvent(MotionEvent ev) {
|
public boolean onHoverEvent(MotionEvent ev) {
|
||||||
super.onHoverEvent(ev);
|
super.onHoverEvent(ev);
|
||||||
|
|||||||
Reference in New Issue
Block a user