summaryrefslogtreecommitdiff
path: root/android/text/SpannableStringInternal.java
diff options
context:
space:
mode:
authorJustin Klaassen <justinklaassen@google.com>2018-04-03 23:21:57 -0400
committerJustin Klaassen <justinklaassen@google.com>2018-04-03 23:21:57 -0400
commit4d01eeaffaa720e4458a118baa137a11614f00f7 (patch)
tree66751893566986236788e3c796a7cc5e90d05f52 /android/text/SpannableStringInternal.java
parenta192cc2a132cb0ee8588e2df755563ec7008c179 (diff)
downloadandroid-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.java81
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;