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,
@ -115,8 +114,8 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
binding.messageAuthor.visibility = View.GONE binding.messageAuthor.visibility = View.GONE
} }
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
binding.messageText.text = processedMessageText binding.messageText.text = processedMessageText
if (message.lastEditTimestamp != 0L && !message.isDeleted) { if (message.lastEditTimestamp != 0L && !message.isDeleted) {
binding.messageEditIndicator.visibility = View.VISIBLE binding.messageEditIndicator.visibility = View.VISIBLE
@ -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,70 +155,81 @@ 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 { _, _ ->
CoroutineScope(Dispatchers.Main).launch { updateCheckboxStates(chatMessage, user, checkboxList)
withContext(Dispatchers.IO) {
val apiVersion: Int = ApiUtils.getChatApiVersion(
user.capabilities?.spreedCapability!!,
intArrayOf(1)
)
updatedMessage =
updateMessageWithCheckboxState(chatMessage.message!!, taskText, isChecked)
chatRepository.editChatMessage(
user.getCredentials(),
ApiUtils.getUrlForChatMessage(
apiVersion,
user.baseUrl!!,
chatMessage.token!!,
chatMessage.id
),
updatedMessage
).collect { result ->
if (result.isSuccess) {
val editedMessage = result.getOrNull()?.ocs?.data?.parentMessage?.message ?: return@collect
chatMessage.message = editedMessage
} else {
Snackbar.make(
binding.root,
R.string.nc_common_error_sorry,
Snackbar.LENGTH_LONG
).show()
}
}
}
}
} }
} }
checkBoxContainer.addView(checkBox) checkBoxContainer.addView(checkBox)
checkboxList.add(checkBox)
} }
checkBoxContainer.visibility = View.VISIBLE checkBoxContainer.visibility = View.VISIBLE
return true return true
} }
private fun updateMessageWithCheckboxState(originalMessage: String, taskText: String, isChecked: Boolean): String { private fun updateCheckboxStates(chatMessage: ChatMessage, user: User, checkboxes: List<CheckBox>) {
val regex = """(- \[(X| )])\s*$taskText""".toRegex(RegexOption.MULTILINE) CoroutineScope(Dispatchers.Main).launch {
return regex.replace(originalMessage) { withContext(Dispatchers.IO) {
val checkboxState = if (isChecked) "X" else " " val apiVersion: Int = ApiUtils.getChatApiVersion(
"- [$checkboxState] $taskText" user.capabilities?.spreedCapability!!,
intArrayOf(1)
)
val updatedMessage = updateMessageWithCheckboxStates(chatMessage.message!!, checkboxes)
chatRepository.editChatMessage(
user.getCredentials(),
ApiUtils.getUrlForChatMessage(apiVersion, user.baseUrl!!, chatMessage.token!!, chatMessage.id),
updatedMessage
).collect { result ->
withContext(Dispatchers.Main) {
if (result.isSuccess) {
val editedMessage = result.getOrNull()?.ocs?.data!!.parentMessage!!
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 {
Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
}
}
}
}
} }
} }
private fun updateMessageWithCheckboxStates(originalMessage: String, checkboxes: List<CheckBox>): String {
var updatedMessage = originalMessage
val regex = """(- \[(X|x| )])\s*(.+)""".toRegex(RegexOption.MULTILINE)
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"
}
}
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>