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

Commit fa4a02c1 authored by Siyamed Sinir's avatar Siyamed Sinir
Browse files

Revert "Don't copy NoCopySpans in SpannableStringInternal"

This reverts commit 5de4fb64.

Bug: 34712634
Fixes: 35363881

Change-Id: I7311e1201152bde052511869c60a0d0c1c5b3242
parent 5de4fb64
Loading
Loading
Loading
Loading
+17 −30
Original line number Diff line number Diff line
@@ -53,16 +53,12 @@ import java.lang.reflect.Array;
     * @param end End index in the source object.
     */
    private final void copySpans(Spanned src, int start, int end) {
        final Object[] spans = src.getSpans(start, end, Object.class);
        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]);
            final int fl = src.getSpanFlags(spans[i]);
            int fl = src.getSpanFlags(spans[i]);

            if (st < start)
                st = start;
@@ -82,42 +78,33 @@ 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;
        boolean includesNoCopySpan = false;
        final int[] srcData = src.mSpanData;
        final Object[] srcSpans = src.mSpans;
        final int limit = src.mSpanCount;

            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;
            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 {
            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)
                        || srcSpans[i] instanceof NoCopySpan) {
                    continue;
                }
                if (isOutOfCopyRange(start, end, spanStart, spanEnd)) continue;
                if (spanStart < start) spanStart = start;
                if (spanEnd > end) spanEnd = end;