From 32447c72fc72cd85c3a725612c6aaeb0c5efaf86 Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Mon, 28 Aug 2017 12:02:07 -0700 Subject: [PATCH] Traverse children from top left to bottom right for a11y (#4017) * order * comment fix * review comments --- .../io/flutter/view/AccessibilityBridge.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/shell/platform/android/io/flutter/view/AccessibilityBridge.java b/shell/platform/android/io/flutter/view/AccessibilityBridge.java index 0f9780f96..d01affa33 100644 --- a/shell/platform/android/io/flutter/view/AccessibilityBridge.java +++ b/shell/platform/android/io/flutter/view/AccessibilityBridge.java @@ -16,6 +16,8 @@ import android.view.accessibility.AccessibilityNodeProvider; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -144,12 +146,6 @@ class AccessibilityBridge extends AccessibilityNodeProvider { result.setSelected((object.flags & SEMANTICS_FLAG_IS_SELECTED) != 0); result.setText(object.label); - // TODO(ianh): use setTraversalBefore/setTraversalAfter to set - // the relative order of the views. For each set of siblings, - // the views should be ordered top-to-bottom, tie-breaking - // left-to-right (right-to-left in rtl environments), height, - // width, and finally by list order. - // Accessibility Focus if (mFocusedObject != null && mFocusedObject.id == virtualViewId) { result.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS); @@ -158,7 +154,16 @@ class AccessibilityBridge extends AccessibilityNodeProvider { } if (object.children != null) { - for (SemanticsObject child : object.children) { + List childrenInTraversalOrder = + new ArrayList(object.children); + Collections.sort(childrenInTraversalOrder, new Comparator() { + public int compare(SemanticsObject a, SemanticsObject b) { + final int top = Integer.compare(a.globalRect.top, b.globalRect.top); + // TODO(goderbauer): sort right-to-left in rtl environments. + return top == 0 ? Integer.compare(a.globalRect.left, b.globalRect.left) : top; + } + }); + for (SemanticsObject child : childrenInTraversalOrder) { result.addChild(mOwner, child.id); } } @@ -358,7 +363,7 @@ class AccessibilityBridge extends AccessibilityNodeProvider { private float[] transform; SemanticsObject parent; - List children; + List children; // In inverse hit test order (i.e. paint order). private boolean inverseTransformDirty = true; private float[] inverseTransform; -- GitLab