Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,6 @@ class EnrichedTextInputView : AppCompatEditText {
val paragraphStyles: ParagraphStyles? = ParagraphStyles(this)
val listStyles: ListStyles? = ListStyles(this)
val parametrizedStyles: ParametrizedStyles? = ParametrizedStyles(this)
// Sometimes setting up style triggers many changes in sequence
// Eg. removing conflicting styles -> changing text -> applying spans
// In such scenario we want to prevent from handling side effects (eg. onTextChanged)
var isDuringTransaction: Boolean = false
var isRemovingMany: Boolean = false

Expand Down Expand Up @@ -241,18 +238,17 @@ class EnrichedTextInputView : AppCompatEditText {

fun setValue(value: CharSequence?) {
if (value == null) return
isDuringTransaction = true

val newText = parseText(value)
setText(newText)

// Assign SpanWatcher one more time as our previous spannable has been replaced
addSpanWatcher(EnrichedSpanWatcher(this))
runAsATransaction {
val newText = parseText(value)
setText(newText)

// Scroll to the last line of text
setSelection(text?.length ?: 0)
// Assign SpanWatcher one more time as our previous spannable has been replaced
addSpanWatcher(EnrichedSpanWatcher(this))

isDuringTransaction = false
// Scroll to the last line of text
setSelection(text?.length ?: 0)
}
}

fun setAutoFocus(autoFocus: Boolean) {
Expand Down Expand Up @@ -460,13 +456,13 @@ class EnrichedTextInputView : AppCompatEditText {
val end = selection?.end ?: 0
val lengthBefore = text?.length ?: 0

isDuringTransaction = true
val targetRange = getTargetRange(name)
val removed = removeStyle(style, targetRange.first, targetRange.second)
if (removed) {
spanState?.setStart(style, null)
runAsATransaction {
val targetRange = getTargetRange(name)
val removed = removeStyle(style, targetRange.first, targetRange.second)
if (removed) {
spanState?.setStart(style, null)
}
}
isDuringTransaction = false

val lengthAfter = text?.length ?: 0
val charactersRemoved = lengthBefore - lengthAfter
Expand Down Expand Up @@ -524,6 +520,18 @@ class EnrichedTextInputView : AppCompatEditText {
parametrizedStyles?.setMentionSpan(text, indicator, attributes)
}

// Sometimes setting up style triggers many changes in sequence
// Eg. removing conflicting styles -> changing text -> applying spans
// In such scenario we want to prevent from handling side effects (eg. onTextChanged)
fun runAsATransaction(block: () -> Unit) {
try {
isDuringTransaction = true
block()
} finally {
isDuringTransaction = false
}
}

override fun onAttachedToWindow() {
super.onAttachedToWindow()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,20 +201,21 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
}

val start = mentionStart ?: return
view.isDuringTransaction = true
spannable.replace(start, selectionEnd, text)

val span = EnrichedMentionSpan(text, indicator, attributes, view.htmlStyle)
val spanEnd = start + text.length
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
view.runAsATransaction {
spannable.replace(start, selectionEnd, text)

val hasSpaceAtTheEnd = spannable.length > safeEnd && spannable[safeEnd] == ' '
if (!hasSpaceAtTheEnd) {
spannable.insert(safeEnd, " ")
val span = EnrichedMentionSpan(text, indicator, attributes, view.htmlStyle)
val spanEnd = start + text.length
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

val hasSpaceAtTheEnd = spannable.length > safeEnd && spannable[safeEnd] == ' '
if (!hasSpaceAtTheEnd) {
spannable.insert(safeEnd, " ")
}
}

view.isDuringTransaction = false
view.mentionHandler?.reset()
view.selection.validateStyles()
}
Expand Down
Loading