diff options
| author | 2014-10-10 00:32:15 +0000 | |
|---|---|---|
| committer | 2014-10-10 00:32:15 +0000 | |
| commit | e78aa53123df02a021cf20f2d19af8d07e890058 (patch) | |
| tree | a17a39de7416410cf705ee500977a08d61ceb9a4 | |
| parent | bedae0dbf1ad202621e676ac909c47fb17c4ec68 (diff) | |
| parent | 9ab1b1bbe62aa0424214bb5bbcfd707cb8ac8199 (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.java | 41 |
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; |