From 50173694ef6c17f5adaa3e6c27933e8564832bdb Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Thu, 5 Jun 2025 23:55:38 +0200 Subject: [PATCH 01/17] include mentions in edited message Signed-off-by: sowjanyakch --- .../main/java/com/nextcloud/talk/chat/MessageInputFragment.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 838a24bc7..9e1b34bab 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -64,6 +64,7 @@ import com.nextcloud.talk.chat.viewmodels.ChatViewModel import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.databinding.FragmentMessageInputBinding import com.nextcloud.talk.jobs.UploadAndShareFilesWorker +import com.nextcloud.talk.models.json.chat.ChatUtils import com.nextcloud.talk.models.json.mention.Mention import com.nextcloud.talk.models.json.signaling.NCSignalingMessage import com.nextcloud.talk.presenters.MentionAutocompletePresenter @@ -414,8 +415,9 @@ class MessageInputFragment : Fragment() { binding.fragmentMessageInputView.editMessageButton.setOnClickListener { val text = binding.fragmentMessageInputView.inputEditText.text.toString() val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage + val editedMessage = ChatUtils.getParsedMessage(text, message.messageParameters) if (message.message!!.trim() != text.trim()) { - editMessageAPI(message, text) + editMessageAPI(message, editedMessage!!) } clearEditUI() } From f14fa59de7e0649de89226e89af83c6f9e6dd1c9 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 10 Jun 2025 16:39:48 +0200 Subject: [PATCH 02/17] also get mentions from the input textfield Signed-off-by: sowjanyakch --- .../talk/chat/MessageInputFragment.kt | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 9e1b34bab..16f3841ea 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -413,10 +413,30 @@ class MessageInputFragment : Fragment() { } binding.fragmentMessageInputView.editMessageButton.setOnClickListener { - val text = binding.fragmentMessageInputView.inputEditText.text.toString() + val editable = binding.fragmentMessageInputView.inputEditText!!.editableText + val mentionSpans = editable.getSpans( + 0, + editable.length, + Spans.MentionChipSpan::class.java + ) + var mentionSpan: Spans.MentionChipSpan + for (i in mentionSpans.indices) { + mentionSpan = mentionSpans[i] + var mentionId = mentionSpan.id + val shouldQuote = mentionId.contains(" ") || + mentionId.contains("@") || + mentionId.startsWith("guest/") || + mentionId.startsWith("group/") || + mentionId.startsWith("email/") || + mentionId.startsWith("team/") + if (shouldQuote) { + mentionId = "\"" + mentionId + "\"" + } + editable.replace(editable.getSpanStart(mentionSpan), editable.getSpanEnd(mentionSpan), "@$mentionId") + } val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage - val editedMessage = ChatUtils.getParsedMessage(text, message.messageParameters) - if (message.message!!.trim() != text.trim()) { + val editedMessage = ChatUtils.getParsedMessage(editable!!.toString(), message.messageParameters) + if (message.message!!.trim() != editedMessage?.trim()) { editMessageAPI(message, editedMessage!!) } clearEditUI() From 895ad61d3d5600d579c357df9fdbb4ff31e867b1 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 23 Jun 2025 12:13:17 +0200 Subject: [PATCH 03/17] use mention name in edit text field Signed-off-by: sowjanyakch --- .../java/com/nextcloud/talk/chat/MessageInputFragment.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 16f3841ea..829f6b70a 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -78,6 +78,7 @@ import com.nextcloud.talk.utils.CharPolicy import com.nextcloud.talk.utils.ImageEmojiEditText import com.nextcloud.talk.utils.SpreedFeatures import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew +import com.nextcloud.talk.utils.message.MessageUtils import com.nextcloud.talk.utils.text.Spans import com.otaliastudios.autocomplete.Autocomplete import com.stfalcon.chatkit.commons.models.IMessage @@ -954,8 +955,9 @@ class MessageInputFragment : Fragment() { } private fun setEditUI(message: ChatMessage) { - binding.fragmentEditView.editMessage.text = message.message - binding.fragmentMessageInputView.inputEditText.setText(message.message) + val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) + binding.fragmentEditView.editMessage.text = editedMessage + binding.fragmentMessageInputView.inputEditText.setText(editedMessage) val end = binding.fragmentMessageInputView.inputEditText.text.length binding.fragmentMessageInputView.inputEditText.setSelection(end) binding.fragmentMessageInputView.messageSendButton.visibility = View.GONE From 09905e61fe953c17871726c1edec9b81f482d07e Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 23 Jun 2025 12:13:53 +0200 Subject: [PATCH 04/17] remove unused import Signed-off-by: sowjanyakch --- .../main/java/com/nextcloud/talk/chat/MessageInputFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 829f6b70a..f838f7bbb 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -78,7 +78,6 @@ import com.nextcloud.talk.utils.CharPolicy import com.nextcloud.talk.utils.ImageEmojiEditText import com.nextcloud.talk.utils.SpreedFeatures import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew -import com.nextcloud.talk.utils.message.MessageUtils import com.nextcloud.talk.utils.text.Spans import com.otaliastudios.autocomplete.Autocomplete import com.stfalcon.chatkit.commons.models.IMessage From 15f3240f984ca0906dd291ec201e75e61b252550 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 23 Jun 2025 17:04:42 +0200 Subject: [PATCH 05/17] move edit button on click listener to setEditUI Signed-off-by: sowjanyakch --- .../talk/chat/MessageInputFragment.kt | 77 ++++++++++--------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index f838f7bbb..ecb77cce3 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -40,6 +40,8 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.view.ContextThemeWrapper import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.toDrawable +import androidx.core.text.toSpannable +import androidx.core.text.toSpanned import androidx.core.view.isVisible import androidx.core.widget.doAfterTextChanged import androidx.emoji2.widget.EmojiTextView @@ -78,6 +80,7 @@ import com.nextcloud.talk.utils.CharPolicy import com.nextcloud.talk.utils.ImageEmojiEditText import com.nextcloud.talk.utils.SpreedFeatures import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew +import com.nextcloud.talk.utils.message.MessageUtils import com.nextcloud.talk.utils.text.Spans import com.otaliastudios.autocomplete.Autocomplete import com.stfalcon.chatkit.commons.models.IMessage @@ -125,6 +128,9 @@ class MessageInputFragment : Fragment() { @Inject lateinit var networkMonitor: NetworkMonitor + @Inject + lateinit var messageUtils: MessageUtils + lateinit var binding: FragmentMessageInputBinding private lateinit var conversationInternalId: String private var typedWhileTypingTimerIsRunning: Boolean = false @@ -357,7 +363,7 @@ class MessageInputFragment : Fragment() { binding.fragmentMessageInputView.inputEditText?.error = null } - val editable = binding.fragmentMessageInputView.inputEditText?.editableText + val editable = binding.fragmentMessageInputView.inputEditText?.editableText if (editable != null && binding.fragmentMessageInputView.inputEditText != null) { val mentionSpans = editable.getSpans( @@ -412,39 +418,6 @@ class MessageInputFragment : Fragment() { submitMessage(false) } - binding.fragmentMessageInputView.editMessageButton.setOnClickListener { - val editable = binding.fragmentMessageInputView.inputEditText!!.editableText - val mentionSpans = editable.getSpans( - 0, - editable.length, - Spans.MentionChipSpan::class.java - ) - var mentionSpan: Spans.MentionChipSpan - for (i in mentionSpans.indices) { - mentionSpan = mentionSpans[i] - var mentionId = mentionSpan.id - val shouldQuote = mentionId.contains(" ") || - mentionId.contains("@") || - mentionId.startsWith("guest/") || - mentionId.startsWith("group/") || - mentionId.startsWith("email/") || - mentionId.startsWith("team/") - if (shouldQuote) { - mentionId = "\"" + mentionId + "\"" - } - editable.replace(editable.getSpanStart(mentionSpan), editable.getSpanEnd(mentionSpan), "@$mentionId") - } - val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage - val editedMessage = ChatUtils.getParsedMessage(editable!!.toString(), message.messageParameters) - if (message.message!!.trim() != editedMessage?.trim()) { - editMessageAPI(message, editedMessage!!) - } - clearEditUI() - } - binding.fragmentEditView.clearEdit.setOnClickListener { - clearEditUI() - } - if (CapabilitiesUtil.hasSpreedFeatureCapability(chatActivity.spreedCapabilities, SpreedFeatures.SILENT_SEND)) { binding.fragmentMessageInputView.button?.setOnLongClickListener { showSendButtonMenu() @@ -953,8 +926,8 @@ class MessageInputFragment : Fragment() { } } - private fun setEditUI(message: ChatMessage) { - val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) + private fun setEditUI(message: ChatMessage) { + val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) binding.fragmentEditView.editMessage.text = editedMessage binding.fragmentMessageInputView.inputEditText.setText(editedMessage) val end = binding.fragmentMessageInputView.inputEditText.text.length @@ -964,6 +937,38 @@ class MessageInputFragment : Fragment() { binding.fragmentMessageInputView.editMessageButton.visibility = View.VISIBLE binding.fragmentEditView.editMessageView.visibility = View.VISIBLE binding.fragmentMessageInputView.attachmentButton.visibility = View.GONE + + binding.fragmentMessageInputView.editMessageButton.setOnClickListener { + val editable = binding.fragmentMessageInputView.inputEditText!!.editableText + val mentionSpans = editable.getSpans( + 0, + editable.length, + Spans.MentionChipSpan::class.java + ) + var mentionSpan: Spans.MentionChipSpan + for (i in mentionSpans.indices) { + mentionSpan = mentionSpans[i] + var mentionId = mentionSpan.id + val shouldQuote = mentionId.contains(" ") || + mentionId.contains("@") || + mentionId.startsWith("guest/") || + mentionId.startsWith("group/") || + mentionId.startsWith("email/") || + mentionId.startsWith("team/") + if (shouldQuote) { + mentionId = "\"" + mentionId + "\"" + } + editable.replace(editable.getSpanStart(mentionSpan), editable.getSpanEnd(mentionSpan), "@$mentionId") + } + val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage + if (message.message!!.trim() != editable?.trim()) { + editMessageAPI(message, editable!!.toString()) + } + clearEditUI() + } + binding.fragmentEditView.clearEdit.setOnClickListener { + clearEditUI() + } } private fun clearEditUI() { From e33e7fd0fbf7ee76ab04a8716a94dd7c25259a8f Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 23 Jun 2025 19:04:19 +0200 Subject: [PATCH 06/17] editing mentions work Signed-off-by: sowjanyakch --- .../talk/chat/MessageInputFragment.kt | 50 +++++++------------ .../talk/utils/message/MessageUtils.kt | 35 +++++++++++++ 2 files changed, 52 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index ecb77cce3..43a2d31e3 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -926,8 +926,9 @@ class MessageInputFragment : Fragment() { } } - private fun setEditUI(message: ChatMessage) { - val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) + + private fun setEditUI(message: ChatMessage) { + val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) binding.fragmentEditView.editMessage.text = editedMessage binding.fragmentMessageInputView.inputEditText.setText(editedMessage) val end = binding.fragmentMessageInputView.inputEditText.text.length @@ -937,40 +938,23 @@ class MessageInputFragment : Fragment() { binding.fragmentMessageInputView.editMessageButton.visibility = View.VISIBLE binding.fragmentEditView.editMessageView.visibility = View.VISIBLE binding.fragmentMessageInputView.attachmentButton.visibility = View.GONE + binding.fragmentMessageInputView.editMessageButton.setOnClickListener { - binding.fragmentMessageInputView.editMessageButton.setOnClickListener { - val editable = binding.fragmentMessageInputView.inputEditText!!.editableText - val mentionSpans = editable.getSpans( - 0, - editable.length, - Spans.MentionChipSpan::class.java - ) - var mentionSpan: Spans.MentionChipSpan - for (i in mentionSpans.indices) { - mentionSpan = mentionSpans[i] - var mentionId = mentionSpan.id - val shouldQuote = mentionId.contains(" ") || - mentionId.contains("@") || - mentionId.startsWith("guest/") || - mentionId.startsWith("group/") || - mentionId.startsWith("email/") || - mentionId.startsWith("team/") - if (shouldQuote) { - mentionId = "\"" + mentionId + "\"" - } - editable.replace(editable.getSpanStart(mentionSpan), editable.getSpanEnd(mentionSpan), "@$mentionId") - } - val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage - if (message.message!!.trim() != editable?.trim()) { - editMessageAPI(message, editable!!.toString()) - } - clearEditUI() - } - binding.fragmentEditView.clearEdit.setOnClickListener { - clearEditUI() - } + val inputEditText = binding.fragmentMessageInputView.inputEditText!!.text.toString() + val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage + if (message.message!!.trim() != inputEditText.trim()) { + val editedMessage = messageUtils.processEditMessageParameters(message.messageParameters!!, message, + inputEditText) + editMessageAPI(message, editedMessage.toString()) + } + clearEditUI() + } + binding.fragmentEditView.clearEdit.setOnClickListener { + clearEditUI() + } } + private fun clearEditUI() { binding.fragmentMessageInputView.editMessageButton.visibility = View.GONE binding.fragmentMessageInputView.inputEditText.setText("") diff --git a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt index 985a0aa1e..828099149 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt @@ -159,6 +159,41 @@ class MessageUtils(val context: Context) { return messageStringInternal } + + fun processEditMessageParameters( + messageParameters: HashMap>?, + message: ChatMessage?, + inputEditText:String + ): Spanned { + + var result = inputEditText.toString() + for ((key, valueMap) in messageParameters!!) { + if (key != null) { + val mentionId = valueMap["mention-id"] + val type = valueMap["type"] + val name = valueMap["name"] + val user = message?.activeUser + if (user != null && mentionId != null && type != null) { + val placeholder = "@$name" + when (type) { + "user", "guest", "email" -> { + result = result.replace(placeholder, "@$mentionId", ignoreCase = false) + } + "user-group", "circle" ->{ + val mentionId = "\"" + mentionId + "\"" + result = result.replace(placeholder, "@$mentionId", ignoreCase = false) + } + "call" -> { + result = result.replace(placeholder,"@all", ignoreCase = false ) + } + } + } + } + } + return SpannableString(result) + } + + private fun defaultMessageParameters( messageString: Spanned, individualHashMap: HashMap, From c4b3555d7fe23300295cbe65465158f4a4cd67b3 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 23 Jun 2025 19:04:52 +0200 Subject: [PATCH 07/17] remove unused imports Signed-off-by: sowjanyakch --- .../main/java/com/nextcloud/talk/chat/MessageInputFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 43a2d31e3..e1048c788 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -40,8 +40,6 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.view.ContextThemeWrapper import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.toDrawable -import androidx.core.text.toSpannable -import androidx.core.text.toSpanned import androidx.core.view.isVisible import androidx.core.widget.doAfterTextChanged import androidx.emoji2.widget.EmojiTextView From 85d996622dbc06617eb342a1a50efa5fef0bfb25 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 23 Jun 2025 19:14:15 +0200 Subject: [PATCH 08/17] use mention chips in edit text Signed-off-by: sowjanyakch --- .../talk/chat/MessageInputFragment.kt | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index e1048c788..a7a798a63 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -938,11 +938,34 @@ class MessageInputFragment : Fragment() { binding.fragmentMessageInputView.attachmentButton.visibility = View.GONE binding.fragmentMessageInputView.editMessageButton.setOnClickListener { - val inputEditText = binding.fragmentMessageInputView.inputEditText!!.text.toString() + val inputEditText = binding.fragmentMessageInputView.inputEditText!!.editableText + + val mentionSpans = inputEditText.getSpans( + 0, + inputEditText.length, + Spans.MentionChipSpan::class.java + ) + var mentionSpan: Spans.MentionChipSpan + for (i in mentionSpans.indices) { + mentionSpan = mentionSpans[i] + var mentionId = mentionSpan.id + val shouldQuote = mentionId.contains(" ") || + mentionId.contains("@") || + mentionId.startsWith("guest/") || + mentionId.startsWith("group/") || + mentionId.startsWith("email/") || + mentionId.startsWith("team/") + if (shouldQuote) { + mentionId = "\"" + mentionId + "\"" + } + inputEditText.replace(inputEditText.getSpanStart(mentionSpan), inputEditText.getSpanEnd(mentionSpan), + "@$mentionId") + } + val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage if (message.message!!.trim() != inputEditText.trim()) { val editedMessage = messageUtils.processEditMessageParameters(message.messageParameters!!, message, - inputEditText) + inputEditText.toString()) editMessageAPI(message, editedMessage.toString()) } clearEditUI() From 62458fa887159d48b5ee33aba0dde4697286947b Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 23 Jun 2025 19:19:40 +0200 Subject: [PATCH 09/17] format code Signed-off-by: sowjanyakch --- .../talk/chat/MessageInputFragment.kt | 19 +++++++++++-------- .../talk/utils/message/MessageUtils.kt | 13 +++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index a7a798a63..bdcfbe531 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -361,7 +361,7 @@ class MessageInputFragment : Fragment() { binding.fragmentMessageInputView.inputEditText?.error = null } - val editable = binding.fragmentMessageInputView.inputEditText?.editableText + val editable = binding.fragmentMessageInputView.inputEditText?.editableText if (editable != null && binding.fragmentMessageInputView.inputEditText != null) { val mentionSpans = editable.getSpans( @@ -924,7 +924,6 @@ class MessageInputFragment : Fragment() { } } - private fun setEditUI(message: ChatMessage) { val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) binding.fragmentEditView.editMessage.text = editedMessage @@ -937,7 +936,6 @@ class MessageInputFragment : Fragment() { binding.fragmentEditView.editMessageView.visibility = View.VISIBLE binding.fragmentMessageInputView.attachmentButton.visibility = View.GONE binding.fragmentMessageInputView.editMessageButton.setOnClickListener { - val inputEditText = binding.fragmentMessageInputView.inputEditText!!.editableText val mentionSpans = inputEditText.getSpans( @@ -958,14 +956,20 @@ class MessageInputFragment : Fragment() { if (shouldQuote) { mentionId = "\"" + mentionId + "\"" } - inputEditText.replace(inputEditText.getSpanStart(mentionSpan), inputEditText.getSpanEnd(mentionSpan), - "@$mentionId") + inputEditText.replace( + inputEditText.getSpanStart(mentionSpan), + inputEditText.getSpanEnd(mentionSpan), + "@$mentionId" + ) } val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage if (message.message!!.trim() != inputEditText.trim()) { - val editedMessage = messageUtils.processEditMessageParameters(message.messageParameters!!, message, - inputEditText.toString()) + val editedMessage = messageUtils.processEditMessageParameters( + message.messageParameters!!, + message, + inputEditText.toString() + ) editMessageAPI(message, editedMessage.toString()) } clearEditUI() @@ -975,7 +979,6 @@ class MessageInputFragment : Fragment() { } } - private fun clearEditUI() { binding.fragmentMessageInputView.editMessageButton.visibility = View.GONE binding.fragmentMessageInputView.inputEditText.setText("") diff --git a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt index 828099149..a81a02719 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt @@ -159,14 +159,12 @@ class MessageUtils(val context: Context) { return messageStringInternal } - - fun processEditMessageParameters( + fun processEditMessageParameters( messageParameters: HashMap>?, message: ChatMessage?, - inputEditText:String + inputEditText: String ): Spanned { - - var result = inputEditText.toString() + var result = inputEditText.toString() for ((key, valueMap) in messageParameters!!) { if (key != null) { val mentionId = valueMap["mention-id"] @@ -179,12 +177,12 @@ class MessageUtils(val context: Context) { "user", "guest", "email" -> { result = result.replace(placeholder, "@$mentionId", ignoreCase = false) } - "user-group", "circle" ->{ + "user-group", "circle" -> { val mentionId = "\"" + mentionId + "\"" result = result.replace(placeholder, "@$mentionId", ignoreCase = false) } "call" -> { - result = result.replace(placeholder,"@all", ignoreCase = false ) + result = result.replace(placeholder, "@all", ignoreCase = false) } } } @@ -193,7 +191,6 @@ class MessageUtils(val context: Context) { return SpannableString(result) } - private fun defaultMessageParameters( messageString: Spanned, individualHashMap: HashMap, From bbd921a031265fa0409b05cecd0659331171ba86 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 23 Jun 2025 19:36:23 +0200 Subject: [PATCH 10/17] suppress nested block depth warning Signed-off-by: sowjanyakch --- .../main/java/com/nextcloud/talk/utils/message/MessageUtils.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt index a81a02719..2fe44a76b 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt @@ -159,6 +159,7 @@ class MessageUtils(val context: Context) { return messageStringInternal } + @Suppress("NestedBlockDepth") fun processEditMessageParameters( messageParameters: HashMap>?, message: ChatMessage?, From 3e747b34fc0133c359d93b63fb2c30b0998b649a Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 24 Jun 2025 10:29:06 +0200 Subject: [PATCH 11/17] remove nested block depth warning Signed-off-by: sowjanyakch --- .../talk/utils/message/MessageUtils.kt | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt index 2fe44a76b..3782abb75 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt @@ -159,7 +159,6 @@ class MessageUtils(val context: Context) { return messageStringInternal } - @Suppress("NestedBlockDepth") fun processEditMessageParameters( messageParameters: HashMap>?, message: ChatMessage?, @@ -174,17 +173,11 @@ class MessageUtils(val context: Context) { val user = message?.activeUser if (user != null && mentionId != null && type != null) { val placeholder = "@$name" - when (type) { - "user", "guest", "email" -> { - result = result.replace(placeholder, "@$mentionId", ignoreCase = false) - } - "user-group", "circle" -> { - val mentionId = "\"" + mentionId + "\"" - result = result.replace(placeholder, "@$mentionId", ignoreCase = false) - } - "call" -> { - result = result.replace(placeholder, "@all", ignoreCase = false) - } + result = when (type) { + "user", "guest", "email" -> result.replace(placeholder, "@$mentionId", ignoreCase = false) + "user-group", "circle" -> result.replace(placeholder, "@\"$mentionId\"", ignoreCase = false) + "call" -> result.replace(placeholder, "@all", ignoreCase = false) + else -> result } } } From 1488a33e9a9f227ba906e4e0454128f5e7b66e76 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 25 Jun 2025 16:03:20 +0200 Subject: [PATCH 12/17] check if message is null Signed-off-by: sowjanyakch --- .../talk/chat/MessageInputFragment.kt | 97 ++++++++++--------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index bdcfbe531..8059f2b85 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -925,57 +925,58 @@ class MessageInputFragment : Fragment() { } private fun setEditUI(message: ChatMessage) { - val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) - binding.fragmentEditView.editMessage.text = editedMessage - binding.fragmentMessageInputView.inputEditText.setText(editedMessage) - val end = binding.fragmentMessageInputView.inputEditText.text.length - binding.fragmentMessageInputView.inputEditText.setSelection(end) - binding.fragmentMessageInputView.messageSendButton.visibility = View.GONE - binding.fragmentMessageInputView.recordAudioButton.visibility = View.GONE - binding.fragmentMessageInputView.editMessageButton.visibility = View.VISIBLE - binding.fragmentEditView.editMessageView.visibility = View.VISIBLE - binding.fragmentMessageInputView.attachmentButton.visibility = View.GONE - binding.fragmentMessageInputView.editMessageButton.setOnClickListener { - val inputEditText = binding.fragmentMessageInputView.inputEditText!!.editableText - - val mentionSpans = inputEditText.getSpans( - 0, - inputEditText.length, - Spans.MentionChipSpan::class.java - ) - var mentionSpan: Spans.MentionChipSpan - for (i in mentionSpans.indices) { - mentionSpan = mentionSpans[i] - var mentionId = mentionSpan.id - val shouldQuote = mentionId.contains(" ") || - mentionId.contains("@") || - mentionId.startsWith("guest/") || - mentionId.startsWith("group/") || - mentionId.startsWith("email/") || - mentionId.startsWith("team/") - if (shouldQuote) { - mentionId = "\"" + mentionId + "\"" + if(message.message != null){ + val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) + binding.fragmentEditView.editMessage.text = editedMessage + binding.fragmentMessageInputView.inputEditText.setText(editedMessage) + val end = binding.fragmentMessageInputView.inputEditText.text.length + binding.fragmentMessageInputView.inputEditText.setSelection(end) + binding.fragmentMessageInputView.messageSendButton.visibility = View.GONE + binding.fragmentMessageInputView.recordAudioButton.visibility = View.GONE + binding.fragmentMessageInputView.editMessageButton.visibility = View.VISIBLE + binding.fragmentEditView.editMessageView.visibility = View.VISIBLE + binding.fragmentMessageInputView.attachmentButton.visibility = View.GONE + binding.fragmentMessageInputView.editMessageButton.setOnClickListener { + val inputEditText = binding.fragmentMessageInputView.inputEditText!!.editableText + val mentionSpans = inputEditText.getSpans( + 0, + inputEditText.length, + Spans.MentionChipSpan::class.java + ) + var mentionSpan: Spans.MentionChipSpan + for (i in mentionSpans.indices) { + mentionSpan = mentionSpans[i] + var mentionId = mentionSpan.id + val shouldQuote = mentionId.contains(" ") || + mentionId.contains("@") || + mentionId.startsWith("guest/") || + mentionId.startsWith("group/") || + mentionId.startsWith("email/") || + mentionId.startsWith("team/") + if (shouldQuote) { + mentionId = "\"" + mentionId + "\"" + } + inputEditText.replace( + inputEditText.getSpanStart(mentionSpan), + inputEditText.getSpanEnd(mentionSpan), + "@$mentionId" + ) } - inputEditText.replace( - inputEditText.getSpanStart(mentionSpan), - inputEditText.getSpanEnd(mentionSpan), - "@$mentionId" - ) - } - val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage - if (message.message!!.trim() != inputEditText.trim()) { - val editedMessage = messageUtils.processEditMessageParameters( - message.messageParameters!!, - message, - inputEditText.toString() - ) - editMessageAPI(message, editedMessage.toString()) + val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage + if (message.message!!.trim() != inputEditText.trim()) { + val editedMessage = messageUtils.processEditMessageParameters( + message.messageParameters!!, + message, + inputEditText.toString() + ) + editMessageAPI(message, editedMessage.toString()) + } + clearEditUI() + } + binding.fragmentEditView.clearEdit.setOnClickListener { + clearEditUI() } - clearEditUI() - } - binding.fragmentEditView.clearEdit.setOnClickListener { - clearEditUI() } } From 022077be622fe2fff509dde9c54e2b1d968b5593 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 1 Jul 2025 10:37:58 +0200 Subject: [PATCH 13/17] refactor Signed-off-by: sowjanyakch --- .../talk/chat/MessageInputFragment.kt | 83 ++++++++++--------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 8059f2b85..8c0943585 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -416,6 +416,48 @@ class MessageInputFragment : Fragment() { submitMessage(false) } + binding.fragmentMessageInputView.editMessageButton.setOnClickListener { + val inputEditText = binding.fragmentMessageInputView.inputEditText!!.editableText + val mentionSpans = inputEditText.getSpans( + 0, + inputEditText.length, + Spans.MentionChipSpan::class.java + ) + var mentionSpan: Spans.MentionChipSpan + for (i in mentionSpans.indices) { + mentionSpan = mentionSpans[i] + var mentionId = mentionSpan.id + val shouldQuote = mentionId.contains(" ") || + mentionId.contains("@") || + mentionId.startsWith("guest/") || + mentionId.startsWith("group/") || + mentionId.startsWith("email/") || + mentionId.startsWith("team/") + if (shouldQuote) { + mentionId = "\"" + mentionId + "\"" + } + inputEditText.replace( + inputEditText.getSpanStart(mentionSpan), + inputEditText.getSpanEnd(mentionSpan), + "@$mentionId" + ) + } + + val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage + if (message.message!!.trim() != inputEditText.trim()) { + val editedMessage = messageUtils.processEditMessageParameters( + message.messageParameters!!, + message, + inputEditText.toString() + ) + editMessageAPI(message, editedMessage.toString()) + } + clearEditUI() + } + binding.fragmentEditView.clearEdit.setOnClickListener { + clearEditUI() + } + if (CapabilitiesUtil.hasSpreedFeatureCapability(chatActivity.spreedCapabilities, SpreedFeatures.SILENT_SEND)) { binding.fragmentMessageInputView.button?.setOnLongClickListener { showSendButtonMenu() @@ -936,47 +978,6 @@ class MessageInputFragment : Fragment() { binding.fragmentMessageInputView.editMessageButton.visibility = View.VISIBLE binding.fragmentEditView.editMessageView.visibility = View.VISIBLE binding.fragmentMessageInputView.attachmentButton.visibility = View.GONE - binding.fragmentMessageInputView.editMessageButton.setOnClickListener { - val inputEditText = binding.fragmentMessageInputView.inputEditText!!.editableText - val mentionSpans = inputEditText.getSpans( - 0, - inputEditText.length, - Spans.MentionChipSpan::class.java - ) - var mentionSpan: Spans.MentionChipSpan - for (i in mentionSpans.indices) { - mentionSpan = mentionSpans[i] - var mentionId = mentionSpan.id - val shouldQuote = mentionId.contains(" ") || - mentionId.contains("@") || - mentionId.startsWith("guest/") || - mentionId.startsWith("group/") || - mentionId.startsWith("email/") || - mentionId.startsWith("team/") - if (shouldQuote) { - mentionId = "\"" + mentionId + "\"" - } - inputEditText.replace( - inputEditText.getSpanStart(mentionSpan), - inputEditText.getSpanEnd(mentionSpan), - "@$mentionId" - ) - } - - val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage - if (message.message!!.trim() != inputEditText.trim()) { - val editedMessage = messageUtils.processEditMessageParameters( - message.messageParameters!!, - message, - inputEditText.toString() - ) - editMessageAPI(message, editedMessage.toString()) - } - clearEditUI() - } - binding.fragmentEditView.clearEdit.setOnClickListener { - clearEditUI() - } } } From 00ce1281ecedf3224165d45d0abee48a17e8bded Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 1 Jul 2025 11:50:58 +0200 Subject: [PATCH 14/17] ktlint Signed-off-by: sowjanyakch --- .../main/java/com/nextcloud/talk/chat/MessageInputFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 8c0943585..811690b5a 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -967,7 +967,7 @@ class MessageInputFragment : Fragment() { } private fun setEditUI(message: ChatMessage) { - if(message.message != null){ + if (message.message != null) { val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) binding.fragmentEditView.editMessage.text = editedMessage binding.fragmentMessageInputView.inputEditText.setText(editedMessage) From 8b02b7797cb5a0ff5ad343f9dbdb929313b13886 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 1 Jul 2025 12:09:51 +0200 Subject: [PATCH 15/17] hide mentionAutocomplete in edit mode Signed-off-by: sowjanyakch --- .../main/java/com/nextcloud/talk/chat/MessageInputFragment.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 811690b5a..0d68d17db 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -971,6 +971,9 @@ class MessageInputFragment : Fragment() { val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) binding.fragmentEditView.editMessage.text = editedMessage binding.fragmentMessageInputView.inputEditText.setText(editedMessage) + if (mentionAutocomplete != null && mentionAutocomplete!!.isPopupShowing) { + mentionAutocomplete?.dismissPopup() + } val end = binding.fragmentMessageInputView.inputEditText.text.length binding.fragmentMessageInputView.inputEditText.setSelection(end) binding.fragmentMessageInputView.messageSendButton.visibility = View.GONE From 317984919f83c5feef2f41b5eab83027d2081295 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 1 Jul 2025 13:34:31 +0200 Subject: [PATCH 16/17] avoid crash if messageParameters is null Signed-off-by: sowjanyakch --- .../talk/chat/MessageInputFragment.kt | 42 ++++++++++--------- .../talk/utils/message/MessageUtils.kt | 30 +++++++------ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 0d68d17db..8dd9d568f 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -445,12 +445,16 @@ class MessageInputFragment : Fragment() { val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage if (message.message!!.trim() != inputEditText.trim()) { - val editedMessage = messageUtils.processEditMessageParameters( - message.messageParameters!!, - message, - inputEditText.toString() - ) - editMessageAPI(message, editedMessage.toString()) + if (message.messageParameters != null) { + val editedMessage = messageUtils.processEditMessageParameters( + message.messageParameters!!, + message, + inputEditText.toString() + ) + editMessageAPI(message, editedMessage.toString()) + } else { + editMessageAPI(message, inputEditText.toString()) + } } clearEditUI() } @@ -967,21 +971,19 @@ class MessageInputFragment : Fragment() { } private fun setEditUI(message: ChatMessage) { - if (message.message != null) { - val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) - binding.fragmentEditView.editMessage.text = editedMessage - binding.fragmentMessageInputView.inputEditText.setText(editedMessage) - if (mentionAutocomplete != null && mentionAutocomplete!!.isPopupShowing) { - mentionAutocomplete?.dismissPopup() - } - val end = binding.fragmentMessageInputView.inputEditText.text.length - binding.fragmentMessageInputView.inputEditText.setSelection(end) - binding.fragmentMessageInputView.messageSendButton.visibility = View.GONE - binding.fragmentMessageInputView.recordAudioButton.visibility = View.GONE - binding.fragmentMessageInputView.editMessageButton.visibility = View.VISIBLE - binding.fragmentEditView.editMessageView.visibility = View.VISIBLE - binding.fragmentMessageInputView.attachmentButton.visibility = View.GONE + val editedMessage = ChatUtils.getParsedMessage(message.message, message.messageParameters) + binding.fragmentEditView.editMessage.text = editedMessage + binding.fragmentMessageInputView.inputEditText.setText(editedMessage) + if (mentionAutocomplete != null && mentionAutocomplete!!.isPopupShowing) { + mentionAutocomplete?.dismissPopup() } + val end = binding.fragmentMessageInputView.inputEditText.text.length + binding.fragmentMessageInputView.inputEditText.setSelection(end) + binding.fragmentMessageInputView.messageSendButton.visibility = View.GONE + binding.fragmentMessageInputView.recordAudioButton.visibility = View.GONE + binding.fragmentMessageInputView.editMessageButton.visibility = View.VISIBLE + binding.fragmentEditView.editMessageView.visibility = View.VISIBLE + binding.fragmentMessageInputView.attachmentButton.visibility = View.GONE } private fun clearEditUI() { diff --git a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt index 3782abb75..acfb8d91a 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt @@ -160,25 +160,23 @@ class MessageUtils(val context: Context) { } fun processEditMessageParameters( - messageParameters: HashMap>?, + messageParameters: HashMap>, message: ChatMessage?, inputEditText: String ): Spanned { - var result = inputEditText.toString() - for ((key, valueMap) in messageParameters!!) { - if (key != null) { - val mentionId = valueMap["mention-id"] - val type = valueMap["type"] - val name = valueMap["name"] - val user = message?.activeUser - if (user != null && mentionId != null && type != null) { - val placeholder = "@$name" - result = when (type) { - "user", "guest", "email" -> result.replace(placeholder, "@$mentionId", ignoreCase = false) - "user-group", "circle" -> result.replace(placeholder, "@\"$mentionId\"", ignoreCase = false) - "call" -> result.replace(placeholder, "@all", ignoreCase = false) - else -> result - } + var result = inputEditText + for (key in messageParameters.keys) { + val individualHashMap = message?.messageParameters?.get(key) + if (individualHashMap != null) { + val mentionId = individualHashMap["mention-id"] + val type = individualHashMap["type"] + val name = individualHashMap["name"] + val placeholder = "@$name" + result = when (type) { + "user", "guest", "email" -> result.replace(placeholder, "@$mentionId", ignoreCase = false) + "user-group", "circle" -> result.replace(placeholder, "@\"$mentionId\"", ignoreCase = false) + "call" -> result.replace(placeholder, "@all", ignoreCase = false) + else -> result } } } From 26a383e4ded0191ebca3244fc42400a9be638ebf Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 7 Jul 2025 13:00:11 +0200 Subject: [PATCH 17/17] add replaceMentionChipSpans function Signed-off-by: sowjanyakch --- .../talk/chat/MessageInputFragment.kt | 77 ++++++++----------- 1 file changed, 30 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 8dd9d568f..627369649 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -417,31 +417,9 @@ class MessageInputFragment : Fragment() { } binding.fragmentMessageInputView.editMessageButton.setOnClickListener { - val inputEditText = binding.fragmentMessageInputView.inputEditText!!.editableText - val mentionSpans = inputEditText.getSpans( - 0, - inputEditText.length, - Spans.MentionChipSpan::class.java - ) - var mentionSpan: Spans.MentionChipSpan - for (i in mentionSpans.indices) { - mentionSpan = mentionSpans[i] - var mentionId = mentionSpan.id - val shouldQuote = mentionId.contains(" ") || - mentionId.contains("@") || - mentionId.startsWith("guest/") || - mentionId.startsWith("group/") || - mentionId.startsWith("email/") || - mentionId.startsWith("team/") - if (shouldQuote) { - mentionId = "\"" + mentionId + "\"" - } - inputEditText.replace( - inputEditText.getSpanStart(mentionSpan), - inputEditText.getSpanEnd(mentionSpan), - "@$mentionId" - ) - } + val editable = binding.fragmentMessageInputView.inputEditText!!.editableText + replaceMentionChipSpans(editable) + val inputEditText = editable.toString() val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage if (message.message!!.trim() != inputEditText.trim()) { @@ -449,7 +427,7 @@ class MessageInputFragment : Fragment() { val editedMessage = messageUtils.processEditMessageParameters( message.messageParameters!!, message, - inputEditText.toString() + inputEditText ) editMessageAPI(message, editedMessage.toString()) } else { @@ -876,27 +854,7 @@ class MessageInputFragment : Fragment() { private fun submitMessage(sendWithoutNotification: Boolean) { if (binding.fragmentMessageInputView.inputEditText != null) { val editable = binding.fragmentMessageInputView.inputEditText!!.editableText - val mentionSpans = editable.getSpans( - 0, - editable.length, - Spans.MentionChipSpan::class.java - ) - var mentionSpan: Spans.MentionChipSpan - for (i in mentionSpans.indices) { - mentionSpan = mentionSpans[i] - var mentionId = mentionSpan.id - val shouldQuote = mentionId.contains(" ") || - mentionId.contains("@") || - mentionId.startsWith("guest/") || - mentionId.startsWith("group/") || - mentionId.startsWith("email/") || - mentionId.startsWith("team/") - if (shouldQuote) { - mentionId = "\"" + mentionId + "\"" - } - editable.replace(editable.getSpanStart(mentionSpan), editable.getSpanEnd(mentionSpan), "@$mentionId") - } - + replaceMentionChipSpans(editable) binding.fragmentMessageInputView.inputEditText?.setText("") sendStopTypingMessage() val replyMessageId = binding.fragmentMessageInputView @@ -926,6 +884,31 @@ class MessageInputFragment : Fragment() { ) } + private fun replaceMentionChipSpans(editable: Editable) { + val mentionSpans = editable.getSpans( + 0, + editable.length, + Spans.MentionChipSpan::class.java + ) + for (mentionSpan in mentionSpans) { + var mentionId = mentionSpan.id + val shouldQuote = mentionId.contains(" ") || + mentionId.contains("@") || + mentionId.startsWith("guest/") || + mentionId.startsWith("group/") || + mentionId.startsWith("email/") || + mentionId.startsWith("team/") + if (shouldQuote) { + mentionId = "\"$mentionId\"" + } + editable.replace( + editable.getSpanStart(mentionSpan), + editable.getSpanEnd(mentionSpan), + "@$mentionId" + ) + } + } + private fun showSendButtonMenu() { val popupMenu = PopupMenu( ContextThemeWrapper(requireContext(), R.style.ChatSendButtonMenu),