handle multiple checkboxes

Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
sowjanyakch 2025-02-21 10:06:59 +01:00 committed by Marcel Hibbe
parent 0e118dbfd1
commit b7835fd462
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
2 changed files with 59 additions and 53 deletions

View File

@ -9,7 +9,6 @@
*/ */
package com.nextcloud.talk.adapters.messages package com.nextcloud.talk.adapters.messages
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import android.util.TypedValue import android.util.TypedValue
@ -89,7 +88,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
user user
) )
if(!hasCheckboxes){ if (!hasCheckboxes) {
var processedMessageText = messageUtils.enrichChatMessageText( var processedMessageText = messageUtils.enrichChatMessageText(
binding.messageText.context, binding.messageText.context,
message, message,
@ -148,11 +147,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
} }
} }
@SuppressLint("StringFormatMatches") private fun processCheckboxes(chatMessage: ChatMessage, user: User): Boolean {
private fun processCheckboxes(
chatMessage: ChatMessage,
user: User
): Boolean {
val message = chatMessage.message!!.toSpanned() val message = chatMessage.message!!.toSpanned()
val messageTextView = binding.messageText val messageTextView = binding.messageText
val checkBoxContainer = binding.checkboxContainer val checkBoxContainer = binding.checkboxContainer
@ -160,69 +155,80 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
checkBoxContainer.removeAllViews() checkBoxContainer.removeAllViews()
val regex = """(- \[(X|x| )])\s*(.+)""".toRegex(RegexOption.MULTILINE) val regex = """(- \[(X|x| )])\s*(.+)""".toRegex(RegexOption.MULTILINE)
val matches = regex.findAll(message) val matches = regex.findAll(message)
if (matches.none()) return false if (matches.none()) return false
val firstPart = message.toString().substringBefore("\n- [") val firstPart = message.toString().substringBefore("\n- [")
messageTextView.text = messageUtils.enrichChatMessageText( messageTextView.text = messageUtils.enrichChatMessageText(
binding.messageText.context, binding.messageText.context, firstPart, true, viewThemeUtils
firstPart,
true,
viewThemeUtils
) )
val checkboxList = mutableListOf<CheckBox>()
matches.forEach { matchResult -> matches.forEach { matchResult ->
val isChecked = matchResult.groupValues[2] == "X" || matchResult.groupValues[2] == "x" val isChecked = matchResult.groupValues[2] == "X" || matchResult.groupValues[2] == "x"
val taskText = matchResult.groupValues[3].trim() val taskText = matchResult.groupValues[3].trim()
lateinit var updatedMessage: String
val checkBox = CheckBox(checkBoxContainer.context).apply { val checkBox = CheckBox(checkBoxContainer.context).apply {
text = taskText text = taskText
this.isChecked = isChecked this.isChecked = isChecked
setOnCheckedChangeListener { _, isChecked -> setOnCheckedChangeListener { _, _ ->
updateCheckboxStates(chatMessage, user, checkboxList)
}
}
checkBoxContainer.addView(checkBox)
checkboxList.add(checkBox)
}
checkBoxContainer.visibility = View.VISIBLE
return true
}
private fun updateCheckboxStates(chatMessage: ChatMessage, user: User, checkboxes: List<CheckBox>) {
CoroutineScope(Dispatchers.Main).launch { CoroutineScope(Dispatchers.Main).launch {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val apiVersion: Int = ApiUtils.getChatApiVersion( val apiVersion: Int = ApiUtils.getChatApiVersion(
user.capabilities?.spreedCapability!!, user.capabilities?.spreedCapability!!,
intArrayOf(1) intArrayOf(1)
) )
updatedMessage =
updateMessageWithCheckboxState(chatMessage.message!!, taskText, isChecked) val updatedMessage = updateMessageWithCheckboxStates(chatMessage.message!!, checkboxes)
chatRepository.editChatMessage( chatRepository.editChatMessage(
user.getCredentials(), user.getCredentials(),
ApiUtils.getUrlForChatMessage( ApiUtils.getUrlForChatMessage(apiVersion, user.baseUrl!!, chatMessage.token!!, chatMessage.id),
apiVersion,
user.baseUrl!!,
chatMessage.token!!,
chatMessage.id
),
updatedMessage updatedMessage
).collect { result -> ).collect { result ->
withContext(Dispatchers.Main) {
if (result.isSuccess) { if (result.isSuccess) {
val editedMessage = result.getOrNull()?.ocs?.data?.parentMessage?.message ?: return@collect val editedMessage = result.getOrNull()?.ocs?.data!!.parentMessage!!
chatMessage.message = editedMessage binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(editedMessage.lastEditTimestamp!!)
binding.messageEditIndicator.apply {
visibility = View.VISIBLE
text = String.format(context.getString(R.string.edited_by), editedMessage.lastEditActorType)
}
} else { } else {
Snackbar.make( Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
binding.root,
R.string.nc_common_error_sorry,
Snackbar.LENGTH_LONG
).show()
} }
} }
} }
} }
} }
} }
checkBoxContainer.addView(checkBox)
}
checkBoxContainer.visibility = View.VISIBLE
return true
}
private fun updateMessageWithCheckboxState(originalMessage: String, taskText: String, isChecked: Boolean): String { private fun updateMessageWithCheckboxStates(originalMessage: String, checkboxes: List<CheckBox>): String {
val regex = """(- \[(X| )])\s*$taskText""".toRegex(RegexOption.MULTILINE) var updatedMessage = originalMessage
return regex.replace(originalMessage) { val regex = """(- \[(X|x| )])\s*(.+)""".toRegex(RegexOption.MULTILINE)
val checkboxState = if (isChecked) "X" else " "
checkboxes.forEach { checkBox ->
updatedMessage = regex.replace(updatedMessage) { matchResult ->
val taskText = matchResult.groupValues[3].trim()
val checkboxState = if (checkboxes.find { it.text == taskText }?.isChecked == true) "X" else " "
"- [$checkboxState] $taskText" "- [$checkboxState] $taskText"
} }
} }
return updatedMessage
}
private fun longClickOnReaction(chatMessage: ChatMessage) { private fun longClickOnReaction(chatMessage: ChatMessage) {
commonMessageInterface.onLongClickReactions(chatMessage) commonMessageInterface.onLongClickReactions(chatMessage)

View File

@ -588,7 +588,7 @@ How to translate with transifex:
<string name="nc_phone_book_integration_chat_via">Chat via %s</string> <string name="nc_phone_book_integration_chat_via">Chat via %s</string>
<string name="nc_phone_book_integration_account_not_found">Account not found</string> <string name="nc_phone_book_integration_account_not_found">Account not found</string>
<string name= "nc_edit">Edit</string> <string name= "nc_edit">Edit</string>
<string name="edited_by">(edited by %1$s)</string>
<!-- save feature --> <!-- save feature -->
<string name="nc_save_message">Save</string> <string name="nc_save_message">Save</string>
<string name="nc_dialog_save_to_storage_title">Save to storage?</string> <string name="nc_dialog_save_to_storage_title">Save to storage?</string>