diff options
author | Maurice Lam <yukl@google.com> | 2016-08-30 13:08:14 -0700 |
---|---|---|
committer | Maurice Lam <yukl@google.com> | 2016-08-30 22:30:57 +0000 |
commit | 04eecdd42f0bc9751825f9f21131a59852256278 (patch) | |
tree | 4d7bdbf4423a71445dd9adbcfa6a1f3f93c9cb0a | |
parent | d22c08482372118a58133947f5c8511b49242d0d (diff) | |
download | setupwizard-04eecdd42f0bc9751825f9f21131a59852256278.tar.gz |
[SuwLib] Fix RTL LinkAccessibilityHelper
Adjust the bounds returned by LinkAccessibilityHelper for RTL.
Test: ./gradlew connectedAndroidTest
Bug: 31161044
Bug: 31077012
Change-Id: I63c896c89c0215b9d13b6128bbd06238ed0bf48e
2 files changed, 46 insertions, 3 deletions
diff --git a/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java b/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java index 3e4b7e2..e6fa497 100644 --- a/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java +++ b/library/eclair-mr1/src/com/android/setupwizardlib/util/LinkAccessibilityHelper.java @@ -179,10 +179,22 @@ public class LinkAccessibilityHelper extends ExploreByTouchHelper { final int lineStart = layout.getLineForOffset(spanStart); final int lineEnd = layout.getLineForOffset(spanEnd); layout.getLineBounds(lineStart, outRect); - outRect.left = (int) xStart; if (lineEnd == lineStart) { - outRect.right = (int) xEnd; - } // otherwise just leave it at the end of the start line + // If the span is on a single line, adjust both the left and right bounds + // so outrect is exactly bounding the span. + outRect.left = (int) Math.min(xStart, xEnd); + outRect.right = (int) Math.max(xStart, xEnd); + } else { + // If the span wraps across multiple lines, only use the first line (as returned + // by layout.getLineBounds above), and adjust the "start" of outrect to where + // the span starts, leaving the "end" of outrect at the end of the line. + // ("start" being left for LTR, and right for RTL) + if (layout.getParagraphDirection(lineStart) == Layout.DIR_RIGHT_TO_LEFT) { + outRect.right = (int) xStart; + } else { + outRect.left = (int) xStart; + } + } // Offset for padding outRect.offset(mView.getTotalPaddingLeft(), mView.getTotalPaddingTop()); diff --git a/library/eclair-mr1/test/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java b/library/eclair-mr1/test/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java index a129f65..76885b9 100644 --- a/library/eclair-mr1/test/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java +++ b/library/eclair-mr1/test/src/com/android/setupwizardlib/test/LinkAccessibilityHelperTest.java @@ -137,6 +137,37 @@ public class LinkAccessibilityHelperTest extends AndroidTestCase { info.recycle(); } + @SmallTest + public void testRtlLayout() { + // Redo setUp with a Hebrew (RTL) string. + mSpan = new LinkSpan("foobar"); + SpannableStringBuilder ssb = new SpannableStringBuilder("מכונה בתרגום"); + ssb.setSpan(mSpan, 1, 2, 0 /* flags */); + + mTextView = new TextView(getContext()); + mTextView.setText(ssb); + mTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + mHelper = new TestLinkAccessibilityHelper(mTextView); + + mTextView.measure(dp2Px(500), dp2Px(500)); + mTextView.layout(dp2Px(0), dp2Px(0), dp2Px(500), dp2Px(500)); + // End redo setup + + AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain(); + mHelper.onPopulateNodeForVirtualView(1, info); + + assertEquals("LinkSpan description should be \"כ\"", + "כ", info.getContentDescription().toString()); + assertTrue("LinkSpan should be focusable", info.isFocusable()); + assertTrue("LinkSpan should be clickable", info.isClickable()); + Rect bounds = new Rect(); + info.getBoundsInParent(bounds); + assertEquals("LinkSpan bounds should be (70.5dp, 0dp, 78.5dp, 20.5dp)", + new Rect(dp2Px(70.5f), dp2Px(0f), dp2Px(78.5f), dp2Px(20.5f)), bounds); + + info.recycle(); + } + private int dp2Px(float dp) { if (mDisplayMetrics == null) { mDisplayMetrics = getContext().getResources().getDisplayMetrics(); |