From 6b558994d4ea8dfa1967f96e272496a7d2b8972a Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Wed, 3 Oct 2012 09:34:24 -0700 Subject: Fix for bug 6954231 text wraps on second line and is fused... When breaking a line, the paragraphs below the new line break were still being drawn in their old location. This only happened when the height was fill_parent, otherwise the height change would force a relayout, which in turn would do a full invalidation. This patch checks for changes to the layout height (not just the widget height, which won't change when it's fill_parent), and invalidates. Change-Id: I64adb9f5eae0479c1c9c8d37c10c2c27a6f582a8 --- core/java/android/widget/Editor.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index c67cae636f45..19b825c4fa0f 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -122,6 +122,7 @@ public class Editor { InputMethodState mInputMethodState; DisplayList[] mTextDisplayLists; + int mLastLayoutHeight; boolean mFrozenWithFocus; boolean mSelectionMoved; @@ -1258,6 +1259,16 @@ public class Editor { mTextDisplayLists = new DisplayList[ArrayUtils.idealObjectArraySize(0)]; } + // If the height of the layout changes (usually when inserting or deleting a line, + // but could be changes within a span), invalidate everything. We could optimize + // more aggressively (for example, adding offsets to blocks) but it would be more + // complex and we would only get the benefit in some cases. + int layoutHeight = layout.getHeight(); + if (mLastLayoutHeight != layoutHeight) { + invalidateTextDisplayList(); + mLastLayoutHeight = layoutHeight; + } + DynamicLayout dynamicLayout = (DynamicLayout) layout; int[] blockEndLines = dynamicLayout.getBlockEndLines(); int[] blockIndices = dynamicLayout.getBlockIndices(); -- cgit v1.2.3-59-g8ed1b