diff options
author | Justin Klaassen <justinklaassen@google.com> | 2018-04-03 23:21:57 -0400 |
---|---|---|
committer | Justin Klaassen <justinklaassen@google.com> | 2018-04-03 23:21:57 -0400 |
commit | 4d01eeaffaa720e4458a118baa137a11614f00f7 (patch) | |
tree | 66751893566986236788e3c796a7cc5e90d05f52 /android/text/SpannableStringInternal.java | |
parent | a192cc2a132cb0ee8588e2df755563ec7008c179 (diff) | |
download | android-28-4d01eeaffaa720e4458a118baa137a11614f00f7.tar.gz |
Import Android SDK Platform P [4697573]
/google/data/ro/projects/android/fetch_artifact \
--bid 4697573 \
--target sdk_phone_armv7-win_sdk \
sdk-repo-linux-sources-4697573.zip
AndroidVersion.ApiLevel has been modified to appear as 28
Change-Id: If80578c3c657366cc9cf75f8db13d46e2dd4e077
Diffstat (limited to 'android/text/SpannableStringInternal.java')
-rw-r--r-- | android/text/SpannableStringInternal.java | 81 |
1 files changed, 61 insertions, 20 deletions
diff --git a/android/text/SpannableStringInternal.java b/android/text/SpannableStringInternal.java index 366ec145..5dd1a52b 100644 --- a/android/text/SpannableStringInternal.java +++ b/android/text/SpannableStringInternal.java @@ -26,7 +26,7 @@ import java.lang.reflect.Array; /* package */ abstract class SpannableStringInternal { /* package */ SpannableStringInternal(CharSequence source, - int start, int end) { + int start, int end, boolean ignoreNoCopySpan) { if (start == 0 && end == source.length()) mText = source.toString(); else @@ -38,24 +38,37 @@ import java.lang.reflect.Array; if (source instanceof Spanned) { if (source instanceof SpannableStringInternal) { - copySpans((SpannableStringInternal) source, start, end); + copySpans((SpannableStringInternal) source, start, end, ignoreNoCopySpan); } else { - copySpans((Spanned) source, start, end); + copySpans((Spanned) source, start, end, ignoreNoCopySpan); } } } /** + * This unused method is left since this is listed in hidden api list. + * + * Due to backward compatibility reasons, we copy even NoCopySpan by default + */ + /* package */ SpannableStringInternal(CharSequence source, int start, int end) { + this(source, start, end, false /* ignoreNoCopySpan */); + } + + /** * Copies another {@link Spanned} object's spans between [start, end] into this object. * * @param src Source object to copy from. * @param start Start index in the source object. * @param end End index in the source object. + * @param ignoreNoCopySpan whether to copy NoCopySpans in the {@code source} */ - private final void copySpans(Spanned src, int start, int end) { + private void copySpans(Spanned src, int start, int end, boolean ignoreNoCopySpan) { Object[] spans = src.getSpans(start, end, Object.class); for (int i = 0; i < spans.length; i++) { + if (ignoreNoCopySpan && spans[i] instanceof NoCopySpan) { + continue; + } int st = src.getSpanStart(spans[i]); int en = src.getSpanEnd(spans[i]); int fl = src.getSpanFlags(spans[i]); @@ -76,35 +89,48 @@ import java.lang.reflect.Array; * @param src Source object to copy from. * @param start Start index in the source object. * @param end End index in the source object. + * @param ignoreNoCopySpan copy NoCopySpan for backward compatible reasons. */ - private final void copySpans(SpannableStringInternal src, int start, int end) { - if (start == 0 && end == src.length()) { + private void copySpans(SpannableStringInternal src, int start, int end, + boolean ignoreNoCopySpan) { + int count = 0; + final int[] srcData = src.mSpanData; + final Object[] srcSpans = src.mSpans; + final int limit = src.mSpanCount; + boolean hasNoCopySpan = false; + + 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) { + hasNoCopySpan = true; + if (ignoreNoCopySpan) { + continue; + } + } + count++; + } + + if (count == 0) return; + + if (!hasNoCopySpan && 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) + || (ignoreNoCopySpan && srcSpans[i] instanceof NoCopySpan)) { + continue; + } if (spanStart < start) spanStart = start; if (spanEnd > end) spanEnd = end; @@ -494,6 +520,21 @@ import java.lang.reflect.Array; return hash; } + /** + * Following two unused methods are left since these are listed in hidden api list. + * + * Due to backward compatibility reasons, we copy even NoCopySpan by default + */ + private void copySpans(Spanned src, int start, int end) { + copySpans(src, start, end, false); + } + + private void copySpans(SpannableStringInternal src, int start, int end) { + copySpans(src, start, end, false); + } + + + private String mText; private Object[] mSpans; private int[] mSpanData; |