@@ -64,6 +64,7 @@ import com.nextcloud.talk.chat.viewmodels.ChatViewModel
6464import com.nextcloud.talk.data.network.NetworkMonitor
6565import com.nextcloud.talk.databinding.FragmentMessageInputBinding
6666import com.nextcloud.talk.jobs.UploadAndShareFilesWorker
67+ import com.nextcloud.talk.models.json.chat.ChatUtils
6768import com.nextcloud.talk.models.json.mention.Mention
6869import com.nextcloud.talk.models.json.signaling.NCSignalingMessage
6970import com.nextcloud.talk.presenters.MentionAutocompletePresenter
@@ -77,6 +78,7 @@ import com.nextcloud.talk.utils.CharPolicy
7778import com.nextcloud.talk.utils.ImageEmojiEditText
7879import com.nextcloud.talk.utils.SpreedFeatures
7980import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
81+ import com.nextcloud.talk.utils.message.MessageUtils
8082import com.nextcloud.talk.utils.text.Spans
8183import com.otaliastudios.autocomplete.Autocomplete
8284import com.stfalcon.chatkit.commons.models.IMessage
@@ -124,6 +126,9 @@ class MessageInputFragment : Fragment() {
124126 @Inject
125127 lateinit var networkMonitor: NetworkMonitor
126128
129+ @Inject
130+ lateinit var messageUtils: MessageUtils
131+
127132 lateinit var binding: FragmentMessageInputBinding
128133 private lateinit var conversationInternalId: String
129134 private var typedWhileTypingTimerIsRunning: Boolean = false
@@ -412,10 +417,22 @@ class MessageInputFragment : Fragment() {
412417 }
413418
414419 binding.fragmentMessageInputView.editMessageButton.setOnClickListener {
415- val text = binding.fragmentMessageInputView.inputEditText.text.toString()
420+ val editable = binding.fragmentMessageInputView.inputEditText!! .editableText
421+ replaceMentionChipSpans(editable)
422+ val inputEditText = editable.toString()
423+
416424 val message = chatActivity.messageInputViewModel.getEditChatMessage.value as ChatMessage
417- if (message.message!! .trim() != text.trim()) {
418- editMessageAPI(message, text)
425+ if (message.message!! .trim() != inputEditText.trim()) {
426+ if (message.messageParameters != null ) {
427+ val editedMessage = messageUtils.processEditMessageParameters(
428+ message.messageParameters!! ,
429+ message,
430+ inputEditText
431+ )
432+ editMessageAPI(message, editedMessage.toString())
433+ } else {
434+ editMessageAPI(message, inputEditText.toString())
435+ }
419436 }
420437 clearEditUI()
421438 }
@@ -837,27 +854,7 @@ class MessageInputFragment : Fragment() {
837854 private fun submitMessage (sendWithoutNotification : Boolean ) {
838855 if (binding.fragmentMessageInputView.inputEditText != null ) {
839856 val editable = binding.fragmentMessageInputView.inputEditText!! .editableText
840- val mentionSpans = editable.getSpans(
841- 0 ,
842- editable.length,
843- Spans .MentionChipSpan ::class .java
844- )
845- var mentionSpan: Spans .MentionChipSpan
846- for (i in mentionSpans.indices) {
847- mentionSpan = mentionSpans[i]
848- var mentionId = mentionSpan.id
849- val shouldQuote = mentionId.contains(" " ) ||
850- mentionId.contains(" @" ) ||
851- mentionId.startsWith(" guest/" ) ||
852- mentionId.startsWith(" group/" ) ||
853- mentionId.startsWith(" email/" ) ||
854- mentionId.startsWith(" team/" )
855- if (shouldQuote) {
856- mentionId = " \" " + mentionId + " \" "
857- }
858- editable.replace(editable.getSpanStart(mentionSpan), editable.getSpanEnd(mentionSpan), " @$mentionId " )
859- }
860-
857+ replaceMentionChipSpans(editable)
861858 binding.fragmentMessageInputView.inputEditText?.setText(" " )
862859 sendStopTypingMessage()
863860 val replyMessageId = binding.fragmentMessageInputView
@@ -887,6 +884,31 @@ class MessageInputFragment : Fragment() {
887884 )
888885 }
889886
887+ private fun replaceMentionChipSpans (editable : Editable ) {
888+ val mentionSpans = editable.getSpans(
889+ 0 ,
890+ editable.length,
891+ Spans .MentionChipSpan ::class .java
892+ )
893+ for (mentionSpan in mentionSpans) {
894+ var mentionId = mentionSpan.id
895+ val shouldQuote = mentionId.contains(" " ) ||
896+ mentionId.contains(" @" ) ||
897+ mentionId.startsWith(" guest/" ) ||
898+ mentionId.startsWith(" group/" ) ||
899+ mentionId.startsWith(" email/" ) ||
900+ mentionId.startsWith(" team/" )
901+ if (shouldQuote) {
902+ mentionId = " \" $mentionId \" "
903+ }
904+ editable.replace(
905+ editable.getSpanStart(mentionSpan),
906+ editable.getSpanEnd(mentionSpan),
907+ " @$mentionId "
908+ )
909+ }
910+ }
911+
890912 private fun showSendButtonMenu () {
891913 val popupMenu = PopupMenu (
892914 ContextThemeWrapper (requireContext(), R .style.ChatSendButtonMenu ),
@@ -932,8 +954,12 @@ class MessageInputFragment : Fragment() {
932954 }
933955
934956 private fun setEditUI (message : ChatMessage ) {
935- binding.fragmentEditView.editMessage.text = message.message
936- binding.fragmentMessageInputView.inputEditText.setText(message.message)
957+ val editedMessage = ChatUtils .getParsedMessage(message.message, message.messageParameters)
958+ binding.fragmentEditView.editMessage.text = editedMessage
959+ binding.fragmentMessageInputView.inputEditText.setText(editedMessage)
960+ if (mentionAutocomplete != null && mentionAutocomplete!! .isPopupShowing) {
961+ mentionAutocomplete?.dismissPopup()
962+ }
937963 val end = binding.fragmentMessageInputView.inputEditText.text.length
938964 binding.fragmentMessageInputView.inputEditText.setSelection(end)
939965 binding.fragmentMessageInputView.messageSendButton.visibility = View .GONE
0 commit comments