Skip to content

Commit 4667fef

Browse files
authored
Merge pull request #5072 from nextcloud/edit_messages
Edit mentions
2 parents 36c8f42 + 26a383e commit 4667fef

2 files changed

Lines changed: 76 additions & 26 deletions

File tree

app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import com.nextcloud.talk.chat.viewmodels.ChatViewModel
6464
import com.nextcloud.talk.data.network.NetworkMonitor
6565
import com.nextcloud.talk.databinding.FragmentMessageInputBinding
6666
import com.nextcloud.talk.jobs.UploadAndShareFilesWorker
67+
import com.nextcloud.talk.models.json.chat.ChatUtils
6768
import com.nextcloud.talk.models.json.mention.Mention
6869
import com.nextcloud.talk.models.json.signaling.NCSignalingMessage
6970
import com.nextcloud.talk.presenters.MentionAutocompletePresenter
@@ -77,6 +78,7 @@ import com.nextcloud.talk.utils.CharPolicy
7778
import com.nextcloud.talk.utils.ImageEmojiEditText
7879
import com.nextcloud.talk.utils.SpreedFeatures
7980
import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
81+
import com.nextcloud.talk.utils.message.MessageUtils
8082
import com.nextcloud.talk.utils.text.Spans
8183
import com.otaliastudios.autocomplete.Autocomplete
8284
import 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

app/src/main/java/com/nextcloud/talk/utils/message/MessageUtils.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,30 @@ class MessageUtils(val context: Context) {
159159
return messageStringInternal
160160
}
161161

162+
fun processEditMessageParameters(
163+
messageParameters: HashMap<String?, HashMap<String?, String?>>,
164+
message: ChatMessage?,
165+
inputEditText: String
166+
): Spanned {
167+
var result = inputEditText
168+
for (key in messageParameters.keys) {
169+
val individualHashMap = message?.messageParameters?.get(key)
170+
if (individualHashMap != null) {
171+
val mentionId = individualHashMap["mention-id"]
172+
val type = individualHashMap["type"]
173+
val name = individualHashMap["name"]
174+
val placeholder = "@$name"
175+
result = when (type) {
176+
"user", "guest", "email" -> result.replace(placeholder, "@$mentionId", ignoreCase = false)
177+
"user-group", "circle" -> result.replace(placeholder, "@\"$mentionId\"", ignoreCase = false)
178+
"call" -> result.replace(placeholder, "@all", ignoreCase = false)
179+
else -> result
180+
}
181+
}
182+
}
183+
return SpannableString(result)
184+
}
185+
162186
private fun defaultMessageParameters(
163187
messageString: Spanned,
164188
individualHashMap: HashMap<String?, String?>,

0 commit comments

Comments
 (0)