summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Svetoslav <svetoslavganov@google.com> 2014-10-10 00:32:15 +0000
committer Android Git Automerger <android-git-automerger@android.com> 2014-10-10 00:32:15 +0000
commite78aa53123df02a021cf20f2d19af8d07e890058 (patch)
treea17a39de7416410cf705ee500977a08d61ceb9a4
parentbedae0dbf1ad202621e676ac909c47fb17c4ec68 (diff)
parent9ab1b1bbe62aa0424214bb5bbcfd707cb8ac8199 (diff)
am 9ab1b1bb: am c43caf52: Merge "Fix child view ordering for accessibility." into lmp-dev
* commit '9ab1b1bbe62aa0424214bb5bbcfd707cb8ac8199': Fix child view ordering for accessibility.
-rw-r--r--core/java/android/view/ViewGroup.java41
1 files changed, 40 insertions, 1 deletions
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 10b2bf4f5250..7538dffa59f6 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -7120,7 +7120,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
ViewLocationHolder holder = ViewLocationHolder.obtain(parent, child);
holders.add(holder);
}
- Collections.sort(holders);
+ sort(holders);
for (int i = 0; i < childCount; i++) {
ViewLocationHolder holder = holders.get(i);
children.set(i, holder.mView);
@@ -7130,6 +7130,23 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
}
+ private void sort(ArrayList<ViewLocationHolder> holders) {
+ // This is gross but the least risky solution. The current comparison
+ // strategy breaks transitivity but produces very good results. Coming
+ // up with a new strategy requires time which we do not have, so ...
+ try {
+ ViewLocationHolder.setComparisonStrategy(
+ ViewLocationHolder.COMPARISON_STRATEGY_STRIPE);
+ Collections.sort(holders);
+ } catch (IllegalArgumentException iae) {
+ // Note that in practice this occurs extremely rarely in a couple
+ // of pathological cases.
+ ViewLocationHolder.setComparisonStrategy(
+ ViewLocationHolder.COMPARISON_STRATEGY_LOCATION);
+ Collections.sort(holders);
+ }
+ }
+
private void clear() {
mChildren.clear();
}
@@ -7148,6 +7165,12 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
private static final SynchronizedPool<ViewLocationHolder> sPool =
new SynchronizedPool<ViewLocationHolder>(MAX_POOL_SIZE);
+ public static final int COMPARISON_STRATEGY_STRIPE = 1;
+
+ public static final int COMPARISON_STRATEGY_LOCATION = 2;
+
+ private static int sComparisonStrategy = COMPARISON_STRATEGY_STRIPE;
+
private final Rect mLocation = new Rect();
public View mView;
@@ -7163,6 +7186,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
return holder;
}
+ public static void setComparisonStrategy(int strategy) {
+ sComparisonStrategy = strategy;
+ }
+
public void recycle() {
clear();
sPool.release(this);
@@ -7174,6 +7201,18 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
if (another == null) {
return 1;
}
+
+ if (sComparisonStrategy == COMPARISON_STRATEGY_STRIPE) {
+ // First is above second.
+ if (mLocation.bottom - another.mLocation.top <= 0) {
+ return -1;
+ }
+ // First is below second.
+ if (mLocation.top - another.mLocation.bottom >= 0) {
+ return 1;
+ }
+ }
+
// We are ordering left-to-right, top-to-bottom.
if (mLayoutDirection == LAYOUT_DIRECTION_LTR) {
final int leftDifference = mLocation.left - another.mLocation.left;