From ed6a3111cb8c750fcfc989194dfa5d5811aead4c Mon Sep 17 00:00:00 2001 From: Ahaan Ugale Date: Sun, 31 Jan 2021 21:24:37 -0800 Subject: [PATCH] Fix DynamicLayout init to use transformed text length. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It already uses the transformed text characters, but uses the length of the base text. This does not account for TransformationMethod2, which can change length, including AllCapsTransformationMethod ("ß" becomes "SS") and TranslationTransformationMethod (arbitrary length changes). This change does not fix updates that happens through DynamicLayout.ChangeWatcher; those will be fixed in separate change(s). Bug: 178650596 Test: atest DynamicLayoutBlocksTest DynamicLayoutTest TextLayoutTest \ TextViewTest Test: manually on a sample app with AllCaps Test: manually with Translate on a real app Change-Id: Iec4699c8d9967cb4622fe59ba91849642d72b52e --- core/java/android/text/DynamicLayout.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java index 16b45c30b69f5..7f45b384ca5f2 100644 --- a/core/java/android/text/DynamicLayout.java +++ b/core/java/android/text/DynamicLayout.java @@ -475,9 +475,8 @@ public class DynamicLayout extends Layout { mObjects.insertAt(0, dirs); - final int baseLength = mBase.length(); - // Update from 0 characters to whatever the real text is - reflow(mBase, 0, 0, baseLength); + // Update from 0 characters to whatever the displayed text is + reflow(mBase, 0, 0, mDisplay.length()); if (mBase instanceof Spannable) { if (mWatcher == null) @@ -485,6 +484,7 @@ public class DynamicLayout extends Layout { // Strip out any watchers for other DynamicLayouts. final Spannable sp = (Spannable) mBase; + final int baseLength = mBase.length(); final ChangeWatcher[] spans = sp.getSpans(0, baseLength, ChangeWatcher.class); for (int i = 0; i < spans.length; i++) { sp.removeSpan(spans[i]);