11package org.wordpress.aztec.watchers
22
33import android.text.Editable
4+ import android.text.Spanned
45import android.text.TextWatcher
56import org.wordpress.aztec.AztecText
67import org.wordpress.aztec.Constants
78import org.wordpress.aztec.spans.AztecFullWidthImageSpan
9+ import org.wordpress.aztec.spans.FullWidthImageProcessingMarker
10+ import java.lang.ref.WeakReference
811
9- class FullWidthImageElementWatcher (val aztecText : AztecText ) : TextWatcher {
12+ class FullWidthImageElementWatcher (aztecText : AztecText ) : TextWatcher {
13+
14+ private val aztecTextRef: WeakReference <AztecText ?> = WeakReference (aztecText)
1015
1116 private var deletedNewline: Boolean = false
1217 private var changeCount: Int = 0
@@ -26,11 +31,14 @@ class FullWidthImageElementWatcher(val aztecText: AztecText) : TextWatcher {
2631 }
2732
2833 private fun insertVisualNewline (position : Int ) {
29- aztecText. text.insert(position, Constants .NEWLINE_STRING )
34+ aztecTextRef.get()?. text? .insert(position, Constants .NEWLINE_STRING )
3035 }
3136
3237 private fun normalizeEditingAroundImageSpans (count : Int , start : Int ) {
33- if (! aztecText.isTextChangedListenerDisabled()) {
38+ val aztecText = aztecTextRef.get()
39+ if (aztecText != null && ! aztecText.isTextChangedListenerDisabled() &&
40+ aztecText.text.getSpans(0 , 0 , FullWidthImageProcessingMarker ::class .java).isEmpty()) {
41+
3442 val end = start + count
3543 var lines = aztecText.text.getSpans(start, start, AztecFullWidthImageSpan ::class .java)
3644 lines + = aztecText.text.getSpans(end, end, AztecFullWidthImageSpan ::class .java)
@@ -41,7 +49,8 @@ class FullWidthImageElementWatcher(val aztecText: AztecText) : TextWatcher {
4149 val changedLineEnd = aztecText.text.getSpanEnd(it) == start && start < aztecText.length() &&
4250 aztecText.text[start] != Constants .NEWLINE
4351
44- aztecText.disableTextChangedListener()
52+ val marker = FullWidthImageProcessingMarker ()
53+ aztecText.text.setSpan(marker, 0 , 0 , Spanned .SPAN_MARK_MARK )
4554
4655 if (changedLineBeginning) {
4756 // if characters added, insert a newline before the line
@@ -70,7 +79,7 @@ class FullWidthImageElementWatcher(val aztecText: AztecText) : TextWatcher {
7079 }
7180 }
7281
73- aztecText.enableTextChangedListener( )
82+ aztecText.text.removeSpan(marker )
7483 }
7584 }
7685 }
0 commit comments