diff options
| author | 2017-01-31 19:54:34 +0000 | |
|---|---|---|
| committer | 2017-01-31 19:54:38 +0000 | |
| commit | db38a9ba71593541eb2d2432f497f43a662c7052 (patch) | |
| tree | 275fb2a7ad8e679f5cde7fae8bff8212d7d0d5ef | |
| parent | 45250aca6d55988a58fdcb4ba0e8a58d36b1f34b (diff) | |
| parent | 5de4fb641adbf4f139c08e3b2504fb0545342402 (diff) | |
Merge "Don't copy NoCopySpans in SpannableStringInternal"
| -rw-r--r-- | core/java/android/text/SpannableStringInternal.java | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/core/java/android/text/SpannableStringInternal.java b/core/java/android/text/SpannableStringInternal.java index 4b02df86c82e..60d8a0fc8894 100644 --- a/core/java/android/text/SpannableStringInternal.java +++ b/core/java/android/text/SpannableStringInternal.java @@ -53,12 +53,16 @@ import java.lang.reflect.Array; * @param end End index in the source object. */ private final void copySpans(Spanned src, int start, int end) { - Object[] spans = src.getSpans(start, end, Object.class); + final Object[] spans = src.getSpans(start, end, Object.class); for (int i = 0; i < spans.length; i++) { + if (spans[i] instanceof NoCopySpan) { + continue; + } + int st = src.getSpanStart(spans[i]); int en = src.getSpanEnd(spans[i]); - int fl = src.getSpanFlags(spans[i]); + final int fl = src.getSpanFlags(spans[i]); if (st < start) st = start; @@ -78,33 +82,42 @@ import java.lang.reflect.Array; * @param end End index in the source object. */ private final void copySpans(SpannableStringInternal src, int start, int end) { - if (start == 0 && end == src.length()) { + int count = 0; + boolean includesNoCopySpan = false; + final int[] srcData = src.mSpanData; + final Object[] srcSpans = src.mSpans; + final int limit = src.mSpanCount; + + for (int i = 0; i < limit; i++) { + int spanStart = srcData[i * COLUMNS + START]; + int spanEnd = srcData[i * COLUMNS + END]; + if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue; + if (srcSpans[i] instanceof NoCopySpan) { + includesNoCopySpan = true; + continue; + } + count++; + } + + if (count == 0) return; + + if (!includesNoCopySpan && start == 0 && end == src.length()) { mSpans = ArrayUtils.newUnpaddedObjectArray(src.mSpans.length); mSpanData = new int[src.mSpanData.length]; mSpanCount = src.mSpanCount; System.arraycopy(src.mSpans, 0, mSpans, 0, src.mSpans.length); System.arraycopy(src.mSpanData, 0, mSpanData, 0, mSpanData.length); } else { - int count = 0; - int[] srcData = src.mSpanData; - int limit = src.mSpanCount; - for (int i = 0; i < limit; i++) { - int spanStart = srcData[i * COLUMNS + START]; - int spanEnd = srcData[i * COLUMNS + END]; - if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue; - count++; - } - - if (count == 0) return; - - Object[] srcSpans = src.mSpans; mSpanCount = count; mSpans = ArrayUtils.newUnpaddedObjectArray(mSpanCount); mSpanData = new int[mSpans.length * COLUMNS]; for (int i = 0, j = 0; i < limit; i++) { int spanStart = srcData[i * COLUMNS + START]; int spanEnd = srcData[i * COLUMNS + END]; - if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue; + if (isOutOfCopyRange(start, end, spanStart, spanEnd) + || srcSpans[i] instanceof NoCopySpan) { + continue; + } if (spanStart < start) spanStart = start; if (spanEnd > end) spanEnd = end; |