diff options
| author | Gilles Debunne <debunne@google.com> | 2010-11-16 16:23:53 -0800 |
|---|---|---|
| committer | Gilles Debunne <debunne@google.com> | 2010-11-16 16:23:55 -0800 |
| commit | 162bf0f1b9fd5d78ffa801917994f6222c6efd85 (patch) | |
| tree | ce8da26c8c496273c699b1137022e8b06d9c7a4f /core | |
| parent | 3ee66f7b34b6216efb84ca6cb1cce63079561b99 (diff) | |
| download | frameworks_base-162bf0f1b9fd5d78ffa801917994f6222c6efd85.zip frameworks_base-162bf0f1b9fd5d78ffa801917994f6222c6efd85.tar.gz frameworks_base-162bf0f1b9fd5d78ffa801917994f6222c6efd85.tar.bz2 | |
Fix for IOOBoundsExc in SpannableStringBuilder
Bug 3182953
Change-Id: Idc7faa86b8250bf325e2547d7d4c094300a06686
Diffstat (limited to 'core')
| -rw-r--r-- | core/java/android/text/Layout.java | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java index dd25eaa..3fe4f4c 100644 --- a/core/java/android/text/Layout.java +++ b/core/java/android/text/Layout.java @@ -26,12 +26,11 @@ import android.graphics.Rect; import android.text.method.TextKeyListener; import android.text.style.AlignmentSpan; import android.text.style.LeadingMarginSpan; +import android.text.style.LeadingMarginSpan.LeadingMarginSpan2; import android.text.style.LineBackgroundSpan; import android.text.style.ParagraphStyle; import android.text.style.ReplacementSpan; import android.text.style.TabStopSpan; -import android.text.style.LeadingMarginSpan.LeadingMarginSpan2; -import android.view.KeyEvent; import java.util.Arrays; @@ -1056,23 +1055,30 @@ public abstract class Layout { int lineEnd = getLineEnd(line); int lineDir = getParagraphDirection(line); + boolean lineChanged = false; boolean advance = toLeft == (lineDir == DIR_RIGHT_TO_LEFT); - if (caret == (advance ? lineEnd : lineStart)) { - // walking off line, so look at the line we're headed to + // if walking off line, look at the line we're headed to + if (advance) { + if (caret == lineEnd) { + if (line < getLineCount() - 1) { + lineChanged = true; + ++line; + } else { + return caret; // at very end, don't move + } + } + } else { if (caret == lineStart) { if (line > 0) { + lineChanged = true; --line; } else { return caret; // at very start, don't move } - } else { - if (line < getLineCount() - 1) { - ++line; - } else { - return caret; // at very end, don't move - } } + } + if (lineChanged) { lineStart = getLineStart(line); lineEnd = getLineEnd(line); int newDir = getParagraphDirection(line); @@ -1672,6 +1678,7 @@ public abstract class Layout { return new String(s); } + @Override public String toString() { char[] s = new char[length()]; getChars(0, length(), s, 0); @@ -1709,6 +1716,7 @@ public abstract class Layout { return mSpanned.nextSpanTransition(start, limit, type); } + @Override public CharSequence subSequence(int start, int end) { char[] s = new char[end - start]; getChars(start, end, s, 0); |
