Loading core/java/android/text/Layout.java +3 −1 Original line number Original line Diff line number Diff line Loading @@ -1004,7 +1004,9 @@ public abstract class Layout { return TextUtils.packRangeInLong(0, getLineEnd(line)); return TextUtils.packRangeInLong(0, getLineEnd(line)); } } private boolean primaryIsTrailingPrevious(int offset) { /** @hide */ @VisibleForTesting public boolean primaryIsTrailingPrevious(int offset) { int line = getLineForOffset(offset); int line = getLineForOffset(offset); int lineStart = getLineStart(line); int lineStart = getLineStart(line); int lineEnd = getLineEnd(line); int lineEnd = getLineEnd(line); Loading core/tests/coretests/src/android/text/LayoutTest.java +55 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.text; package android.text; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull; Loading Loading @@ -688,5 +689,59 @@ public class LayoutTest { return mDrawCommands; return mDrawCommands; } } } } private static final String LTR = "a"; private static final String RTL = "\u05D0"; // HEBREW LETTER ALEF private static final String LTR_SP = "\uD801\uDCB0"; // OSAGE CAPITAL LETTER A private static final String RTL_SP = "\uD83A\uDD00"; // ADLAM CAPITAL LETTER ALIF private static final String LRI = "\u2066"; // LEFT-TO-RIGHT ISOLATE private static final String RLI = "\u2067"; // RIGHT-TO-LEFT ISOLATE private static final String PDI = "\u2069"; // POP DIRECTIONAL ISOLATE private static void assertPrimaryIsTrailingPrevious(String input, boolean[] expected) { assertEquals(input.length() + 1, expected.length); boolean[] actual = new boolean[expected.length]; TextPaint paint = new TextPaint(); paint.setTextSize(16.0f); Layout layout = StaticLayout.Builder.obtain( input, 0, input.length(), paint, Integer.MAX_VALUE).build(); for (int i = 0; i <= input.length(); ++i) { actual[i] = layout.primaryIsTrailingPrevious(i); } assertArrayEquals(expected, actual); } @Test public void testPrimaryIsTrailingPrevious() { assertPrimaryIsTrailingPrevious( LTR + " " + LTR + LTR + " " + LTR + LTR + LTR, new boolean[]{false, false, false, false, false, false, false, false, false}); assertPrimaryIsTrailingPrevious( RTL + " " + RTL + RTL + " " + RTL + RTL + RTL, new boolean[]{false, false, false, false, false, false, false, false, false}); assertPrimaryIsTrailingPrevious( LTR + RTL + LTR + RTL + LTR, new boolean[]{false, true, false, true, false, false}); assertPrimaryIsTrailingPrevious( RTL + LTR + RTL + LTR + RTL, new boolean[]{false, true, false, true, false, false}); assertPrimaryIsTrailingPrevious( RTL_SP + LTR_SP + RTL_SP + LTR_SP + RTL_SP, new boolean[]{ false, false, true, false, false, false, true, false, false, false, false}); assertPrimaryIsTrailingPrevious( LTR_SP + RTL_SP + LTR_SP + RTL_SP + LTR_SP, new boolean[]{ false, false, true, false, false, false, true, false, false, false, false}); assertPrimaryIsTrailingPrevious( LTR + RLI + LTR + RTL + PDI + LTR, new boolean[]{false, false, true, false, false, false, false}); assertPrimaryIsTrailingPrevious( RTL + LRI + RTL + LTR + PDI + RTL, new boolean[]{false, false, true, false, false, false, false}); } } } Loading
core/java/android/text/Layout.java +3 −1 Original line number Original line Diff line number Diff line Loading @@ -1004,7 +1004,9 @@ public abstract class Layout { return TextUtils.packRangeInLong(0, getLineEnd(line)); return TextUtils.packRangeInLong(0, getLineEnd(line)); } } private boolean primaryIsTrailingPrevious(int offset) { /** @hide */ @VisibleForTesting public boolean primaryIsTrailingPrevious(int offset) { int line = getLineForOffset(offset); int line = getLineForOffset(offset); int lineStart = getLineStart(line); int lineStart = getLineStart(line); int lineEnd = getLineEnd(line); int lineEnd = getLineEnd(line); Loading
core/tests/coretests/src/android/text/LayoutTest.java +55 −0 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.text; package android.text; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertNull; Loading Loading @@ -688,5 +689,59 @@ public class LayoutTest { return mDrawCommands; return mDrawCommands; } } } } private static final String LTR = "a"; private static final String RTL = "\u05D0"; // HEBREW LETTER ALEF private static final String LTR_SP = "\uD801\uDCB0"; // OSAGE CAPITAL LETTER A private static final String RTL_SP = "\uD83A\uDD00"; // ADLAM CAPITAL LETTER ALIF private static final String LRI = "\u2066"; // LEFT-TO-RIGHT ISOLATE private static final String RLI = "\u2067"; // RIGHT-TO-LEFT ISOLATE private static final String PDI = "\u2069"; // POP DIRECTIONAL ISOLATE private static void assertPrimaryIsTrailingPrevious(String input, boolean[] expected) { assertEquals(input.length() + 1, expected.length); boolean[] actual = new boolean[expected.length]; TextPaint paint = new TextPaint(); paint.setTextSize(16.0f); Layout layout = StaticLayout.Builder.obtain( input, 0, input.length(), paint, Integer.MAX_VALUE).build(); for (int i = 0; i <= input.length(); ++i) { actual[i] = layout.primaryIsTrailingPrevious(i); } assertArrayEquals(expected, actual); } @Test public void testPrimaryIsTrailingPrevious() { assertPrimaryIsTrailingPrevious( LTR + " " + LTR + LTR + " " + LTR + LTR + LTR, new boolean[]{false, false, false, false, false, false, false, false, false}); assertPrimaryIsTrailingPrevious( RTL + " " + RTL + RTL + " " + RTL + RTL + RTL, new boolean[]{false, false, false, false, false, false, false, false, false}); assertPrimaryIsTrailingPrevious( LTR + RTL + LTR + RTL + LTR, new boolean[]{false, true, false, true, false, false}); assertPrimaryIsTrailingPrevious( RTL + LTR + RTL + LTR + RTL, new boolean[]{false, true, false, true, false, false}); assertPrimaryIsTrailingPrevious( RTL_SP + LTR_SP + RTL_SP + LTR_SP + RTL_SP, new boolean[]{ false, false, true, false, false, false, true, false, false, false, false}); assertPrimaryIsTrailingPrevious( LTR_SP + RTL_SP + LTR_SP + RTL_SP + LTR_SP, new boolean[]{ false, false, true, false, false, false, true, false, false, false, false}); assertPrimaryIsTrailingPrevious( LTR + RLI + LTR + RTL + PDI + LTR, new boolean[]{false, false, true, false, false, false, false}); assertPrimaryIsTrailingPrevious( RTL + LRI + RTL + LTR + PDI + RTL, new boolean[]{false, false, true, false, false, false, false}); } } }