Got the replacement logic down, not perfect fix but a workaround.

This commit is contained in:
rapterjet2004 2025-02-13 11:18:04 -06:00
parent b72c829cd2
commit cc8e51a8f4
No known key found for this signature in database
GPG Key ID: A6A69CFF84968EA1

View File

@ -7,7 +7,6 @@
package com.nextcloud.talk.chat package com.nextcloud.talk.chat
import android.content.res.Resources
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
@ -16,6 +15,7 @@ import android.os.CountDownTimer
import android.os.SystemClock import android.os.SystemClock
import android.text.Editable import android.text.Editable
import android.text.InputFilter import android.text.InputFilter
import android.text.Spanned
import android.text.TextUtils import android.text.TextUtils
import android.text.TextWatcher import android.text.TextWatcher
import android.util.Log import android.util.Log
@ -85,7 +85,7 @@ import kotlinx.coroutines.launch
import java.util.Objects import java.util.Objects
import javax.inject.Inject import javax.inject.Inject
@Suppress("LongParameterList", "TooManyFunctions") @Suppress("LongParameterList", "TooManyFunctions", "LargeClass")
@AutoInjector(NextcloudTalkApplication::class) @AutoInjector(NextcloudTalkApplication::class)
class MessageInputFragment : Fragment() { class MessageInputFragment : Fragment() {
@ -108,6 +108,19 @@ class MessageInputFragment : Fragment() {
private const val CONNECTION_ESTABLISHED_ANIM_DURATION: Long = 3000 private const val CONNECTION_ESTABLISHED_ANIM_DURATION: Long = 3000
private const val FULLY_OPAQUE: Float = 1.0f private const val FULLY_OPAQUE: Float = 1.0f
private const val FULLY_TRANSPARENT: Float = 0.0f private const val FULLY_TRANSPARENT: Float = 0.0f
/**
* Note: Start index guaranteed >= 0 if correct, -1 if error
* @return `Pair(start index + 1, end index)
*/
private fun String.getStartAndEndIndexOf(substring: String): Pair<Int, Int> {
val index = this.indexOf(substring)
if (index < 0) return Pair(-1, -1)
val start = kotlin.math.max(0, index + 1)
val end = start + substring.length
return Pair(start, end)
}
} }
@Inject @Inject
@ -344,7 +357,7 @@ class MessageInputFragment : Fragment() {
if (s.length >= lengthFilter) { if (s.length >= lengthFilter) {
binding.fragmentMessageInputView.inputEditText?.error = String.format( binding.fragmentMessageInputView.inputEditText?.error = String.format(
Objects.requireNonNull<Resources>(resources).getString(R.string.nc_limit_hit), Objects.requireNonNull(resources).getString(R.string.nc_limit_hit),
lengthFilter.toString() lengthFilter.toString()
) )
} else { } else {
@ -352,9 +365,9 @@ class MessageInputFragment : Fragment() {
} }
val editable = binding.fragmentMessageInputView.inputEditText?.editableText val editable = binding.fragmentMessageInputView.inputEditText?.editableText
if (editable != null && binding.fragmentMessageInputView.inputEditText != null) return if (editable == null || binding.fragmentMessageInputView.inputEditText == null) return
val mentionSpans = editable!!.getSpans( val mentionSpans = editable.getSpans(
0, 0,
binding.fragmentMessageInputView.inputEditText!!.length(), binding.fragmentMessageInputView.inputEditText!!.length(),
Spans.MentionChipSpan::class.java Spans.MentionChipSpan::class.java
@ -365,19 +378,25 @@ class MessageInputFragment : Fragment() {
val spStart = editable.getSpanStart(mentionSpan) val spStart = editable.getSpanStart(mentionSpan)
val spEnd = editable.getSpanEnd(mentionSpan) val spEnd = editable.getSpanEnd(mentionSpan)
val spanRangeStr = editable.subSequence(spStart, spEnd).toString().trim { it <= ' ' }
val error = spanRangeStr.length > mentionSpan.label.length
val what = editable.subSequence(spStart, spEnd).toString().trim { it <= ' ' } if (start in spStart..<spEnd && spanRangeStr != mentionSpan.label) {
val error = what.length > mentionSpan.label.length
if (start in spStart..< spEnd && what != mentionSpan.label) {
editable.removeSpan(mentionSpan) editable.removeSpan(mentionSpan)
} }
// workaround, not a proper fix for issue #4642
if (error) { if (error) {
Log.d("Julius", "Error: Fix mention") val pair = spanRangeStr.getStartAndEndIndexOf(mentionSpan.label.toString())
if (pair.first < 0) {
Log.e(TAG, "Mention Span not found in editable: Not reinserted")
return
}
editable.setSpan(mentionSpan, pair.first, pair.second, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
Log.e(TAG, "Reinserted Span in editable at Start: ${pair.first} End: ${pair.second}")
} }
} }
} }
override fun afterTextChanged(s: Editable) { override fun afterTextChanged(s: Editable) {