diff --git a/android/src/main/java/com/swmansion/enriched/styles/InlineStyles.kt b/android/src/main/java/com/swmansion/enriched/styles/InlineStyles.kt index f5577b32c..96f74193d 100644 --- a/android/src/main/java/com/swmansion/enriched/styles/InlineStyles.kt +++ b/android/src/main/java/com/swmansion/enriched/styles/InlineStyles.kt @@ -17,6 +17,7 @@ import com.swmansion.enriched.spans.interfaces.EnrichedSpan import com.swmansion.enriched.utils.areInlineSpansTouchingOrOverlapping import com.swmansion.enriched.utils.getSafeSpanBoundaries import com.swmansion.enriched.utils.isTheSameInlineSpan +import com.swmansion.enriched.utils.removeSpans import com.swmansion.enriched.watchers.TextChangedEvent class InlineStyles( @@ -48,10 +49,7 @@ class InlineStyles( maximum = spanEnd.coerceAtLeast(maximum) } - val spans = editable.getSpans(minimum, maximum, type) - for (span in spans) { - editable.removeSpan(span) - } + editable.removeSpans(minimum, maximum, type) val span = createSpan(styleName) val (safeStart, safeEnd) = editable.getSafeSpanBoundaries(minimum, maximum) @@ -445,7 +443,7 @@ class InlineStyles( val spans = editable.getSpans(start, end, config.clazz) if (spans.isEmpty()) return false - spans.forEach { it -> editable.removeSpan(it) } + editable.removeSpans(spans) view.spanState.setStart(name, null) diff --git a/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt b/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt index 371f076d8..adf4a0bb1 100644 --- a/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +++ b/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt @@ -19,6 +19,7 @@ import com.swmansion.enriched.utils.ParagraphUtils.findPreviousAlignmentSpan import com.swmansion.enriched.utils.ParagraphUtils.getPreviousParagraphSpan import com.swmansion.enriched.utils.getParagraphBounds import com.swmansion.enriched.utils.getSafeSpanBoundaries +import com.swmansion.enriched.utils.removeSpans import com.swmansion.enriched.utils.removeZWS import com.swmansion.enriched.watchers.TextChangedEvent @@ -199,7 +200,7 @@ class ListStyles( val spans = editable.getSpans(start, end, EnrichedAlignmentSpan::class.java) if (spans.isEmpty()) return - spans.forEach { editable.removeSpan(it) } + editable.removeSpans(spans) editable.setSpan( spans.first().copy(), diff --git a/android/src/main/java/com/swmansion/enriched/styles/ParagraphStyles.kt b/android/src/main/java/com/swmansion/enriched/styles/ParagraphStyles.kt index a9e52b00b..36ab1ada2 100644 --- a/android/src/main/java/com/swmansion/enriched/styles/ParagraphStyles.kt +++ b/android/src/main/java/com/swmansion/enriched/styles/ParagraphStyles.kt @@ -32,6 +32,7 @@ import com.swmansion.enriched.utils.getListRange import com.swmansion.enriched.utils.getParagraphBounds import com.swmansion.enriched.utils.getParagraphsBounds import com.swmansion.enriched.utils.isTheSameParagraphInSelection +import com.swmansion.enriched.utils.removeSpans import com.swmansion.enriched.utils.removeZWS import com.swmansion.enriched.watchers.TextChangedEvent @@ -293,9 +294,7 @@ class ParagraphStyles( val (listStart, listEnd) = editable.getListRange(paragraphStart, paragraphEnd, listSpan) - editable - .getSpans(listStart, listEnd, EnrichedAlignmentSpan::class.java) - .forEach { editable.removeSpan(it) } + editable.removeSpans(listStart, listEnd, EnrichedAlignmentSpan::class.java) editable.setSpan( EnrichedAlignmentSpan(alignment), @@ -304,9 +303,7 @@ class ParagraphStyles( Spanned.SPAN_EXCLUSIVE_EXCLUSIVE, ) } else { - editable.getSpans(paragraphStart, paragraphEnd, EnrichedAlignmentSpan::class.java).forEach { - editable.removeSpan(it) - } + editable.removeSpans(paragraphStart, paragraphEnd, EnrichedAlignmentSpan::class.java) editable.setSpan(EnrichedAlignmentSpan(alignment), paragraphStart, paragraphEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) } } diff --git a/android/src/main/java/com/swmansion/enriched/styles/ParametrizedStyles.kt b/android/src/main/java/com/swmansion/enriched/styles/ParametrizedStyles.kt index ca4b8d04e..7dd37f2f8 100644 --- a/android/src/main/java/com/swmansion/enriched/styles/ParametrizedStyles.kt +++ b/android/src/main/java/com/swmansion/enriched/styles/ParametrizedStyles.kt @@ -13,6 +13,7 @@ import com.swmansion.enriched.spans.EnrichedSpans import com.swmansion.enriched.spans.TextStyle import com.swmansion.enriched.spans.interfaces.EnrichedSpan import com.swmansion.enriched.utils.getSafeSpanBoundaries +import com.swmansion.enriched.utils.removeSpans import com.swmansion.enriched.utils.removeZWS import com.swmansion.enriched.watchers.TextChangedEvent import kotlin.math.max @@ -25,20 +26,18 @@ class ParametrizedStyles( var mentionIndicators: Array = emptyArray() - fun removeSpansForRange( + fun removeSpansForRange( editable: Editable, start: Int, end: Int, - clazz: Class, + clazz: Class, ): Boolean { val spans = editable.getSpans(start, end, clazz) if (spans.isEmpty()) return false editable.removeZWS(start, end) - for (span in spans) { - editable.removeSpan(span) - } + editable.removeSpans(spans) return true } @@ -71,13 +70,7 @@ class ParametrizedStyles( fun removeLinkSpan( start: Int, end: Int, - ) { - val editable = view.editableText - val spans = editable.getSpans(start, end, EnrichedLinkSpan::class.java) - for (span in spans) { - editable.removeSpan(span) - } - } + ) = view.editableText.removeSpans(start, end, EnrichedLinkSpan::class.java) // After editing text we want to automatically detect links in the affected range // Affected range is range + previous word + next word @@ -107,15 +100,7 @@ class ParametrizedStyles( val text = editable.toString() // Remove existing link spans - val existingSpans = - editable.getSpans( - 0, - editable.length, - EnrichedLinkSpan::class.java, - ) - for (span in existingSpans) { - editable.removeSpan(span) - } + editable.removeSpans(0, editable.length, EnrichedLinkSpan::class.java) // Detect links using our URL_REGEX for (match in URL_REGEX.findAll(text)) { @@ -200,9 +185,7 @@ class ParametrizedStyles( ).filter { !it.isManual } - for (span in spans) { - editable.removeSpan(span) - } + editable.removeSpans(spans) // Split into words and detect links for (wordMatch in wordsRegex.findAll(contextText)) { @@ -252,10 +235,7 @@ class ParametrizedStyles( val mentionIndicatorRegex = Regex("^($indicatorsPattern)") val mentionRegex = Regex("^($indicatorsPattern)\\w*") - val spans = editable.getSpans(currentWord.start, currentWord.end, EnrichedMentionSpan::class.java) - for (span in spans) { - editable.removeSpan(span) - } + editable.removeSpans(currentWord.start, currentWord.end, EnrichedMentionSpan::class.java) var indicator: String var finalStart: Int @@ -334,10 +314,7 @@ class ParametrizedStyles( if (start == originalEnd) { editable.insert(start, "\uFFFC") } else { - val spans = editable.getSpans(start, originalEnd, EnrichedImageSpan::class.java) - for (s in spans) { - editable.removeSpan(s) - } + editable.removeSpans(start, originalEnd, EnrichedImageSpan::class.java) editable.replace(start, originalEnd, "\uFFFC") } @@ -367,9 +344,7 @@ class ParametrizedStyles( start: Int, end: Int, ) { - editable - .getSpans(start, end, EnrichedMentionSpan::class.java) - .forEach(editable::removeSpan) + editable.removeSpans(start, end, EnrichedMentionSpan::class.java) } private fun insertMentionAtSelection( diff --git a/android/src/main/java/com/swmansion/enriched/utils/ParagraphUtils.kt b/android/src/main/java/com/swmansion/enriched/utils/ParagraphUtils.kt index 6fd654246..eb97c1f19 100644 --- a/android/src/main/java/com/swmansion/enriched/utils/ParagraphUtils.kt +++ b/android/src/main/java/com/swmansion/enriched/utils/ParagraphUtils.kt @@ -23,10 +23,7 @@ object ParagraphUtils { if (hasMatchingSpan) return - spans.forEach { - spannable.removeSpan(it) - } - + spannable.removeSpans(spans) spannable.setSpan(span, pStart, pEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) } diff --git a/android/src/main/java/com/swmansion/enriched/utils/SpannableUtils.kt b/android/src/main/java/com/swmansion/enriched/utils/SpannableUtils.kt index 2fe2764f6..0515f3bf2 100644 --- a/android/src/main/java/com/swmansion/enriched/utils/SpannableUtils.kt +++ b/android/src/main/java/com/swmansion/enriched/utils/SpannableUtils.kt @@ -2,6 +2,7 @@ package com.swmansion.enriched.utils import android.text.Spannable import com.swmansion.enriched.spans.interfaces.EnrichedParagraphSpan +import com.swmansion.enriched.spans.interfaces.EnrichedSpan fun Spannable.getListRange( paragraphStart: Int, @@ -56,3 +57,13 @@ fun Spannable.isTheSameParagraphInSelection(selection: EnrichedSelection): Boole return startParagraphBounds.first == endParagraphBounds.first } + +fun Spannable.removeSpans( + start: Int, + end: Int, + clazz: Class, +) = removeSpans(getSpans(start, end, clazz)) + +fun Spannable.removeSpans(spans: Array) = spans.forEach(::removeSpan) + +fun Spannable.removeSpans(spans: List) = spans.forEach(::removeSpan) diff --git a/android/src/main/java/com/swmansion/enriched/utils/Utils.kt b/android/src/main/java/com/swmansion/enriched/utils/Utils.kt index 66a2efb58..ecaad3428 100644 --- a/android/src/main/java/com/swmansion/enriched/utils/Utils.kt +++ b/android/src/main/java/com/swmansion/enriched/utils/Utils.kt @@ -246,13 +246,8 @@ private fun cleanInsertedFromParagraphSpansIfNeeded( val (pStart, pEnd) = inserted.getParagraphBounds(0, 0) - inserted - .getSpans(pStart, pEnd, EnrichedParagraphSpan::class.java) - .forEach { inserted.removeSpan(it) } - - inserted - .getSpans(pStart, pEnd, EnrichedBlockSpan::class.java) - .forEach { inserted.removeSpan(it) } + inserted.removeSpans(pStart, pEnd, EnrichedParagraphSpan::class.java) + inserted.removeSpans(pStart, pEnd, EnrichedBlockSpan::class.java) } private fun SpannableStringBuilder.maybeInsertNewLine( @@ -293,8 +288,7 @@ private fun SpannableStringBuilder.applyParagraphSpans( ) { val (pStart, pEnd) = getParagraphBounds(at, at) - getSpans(pStart, pEnd, EnrichedParagraphSpan::class.java) - .forEach { removeSpan(it) } + removeSpans(pStart, pEnd, EnrichedParagraphSpan::class.java) spans.forEach { span -> setSpan(