Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5de4fb64 authored by Siyamed Sinir's avatar Siyamed Sinir
Browse files

Don't copy NoCopySpans in SpannableStringInternal

Bug: 34712634
Test: 
Added new tests to cts.SpannableStringTest and cts.SpannedStringTest
android.text.cts.SpannableStringTest
android.text.cts.SpannedStringTest
android.text.cts.SpannableStringBuilderTest
android.text.SpannableStringTest
android.text.SpannedTest

Change-Id: I34e4ef4798b8d26fa8770c0021acb52b4047095e
parent a09a31f9
Loading
Loading
Loading
Loading
+30 −17
Original line number Diff line number Diff line
@@ -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()) {
            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;
        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;

            Object[] srcSpans = src.mSpans;
        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 {
            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;