summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorGilles Debunne <debunne@google.com>2010-11-16 16:23:53 -0800
committerGilles Debunne <debunne@google.com>2010-11-16 16:23:55 -0800
commit162bf0f1b9fd5d78ffa801917994f6222c6efd85 (patch)
treece8da26c8c496273c699b1137022e8b06d9c7a4f /core
parent3ee66f7b34b6216efb84ca6cb1cce63079561b99 (diff)
downloadframeworks_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.java28
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);