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
import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.util.TypedValue
@ -89,7 +88,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
user
)
if(!hasCheckboxes){
if (!hasCheckboxes) {
var processedMessageText = messageUtils.enrichChatMessageText(
binding.messageText.context,
message,
@ -115,8 +114,8 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
binding.messageAuthor.visibility = View.GONE
}
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
binding.messageText.text = processedMessageText
binding.messageText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
binding.messageText.text = processedMessageText
if (message.lastEditTimestamp != 0L && !message.isDeleted) {
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 messageTextView = binding.messageText
val checkBoxContainer = binding.checkboxContainer
@ -160,70 +155,81 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
checkBoxContainer.removeAllViews()
val regex = """(- \[(X|x| )])\s*(.+)""".toRegex(RegexOption.MULTILINE)
val matches = regex.findAll(message)
if (matches.none()) return false
val firstPart = message.toString().substringBefore("\n- [")
messageTextView.text = messageUtils.enrichChatMessageText(
binding.messageText.context,
firstPart,
true,
viewThemeUtils
binding.messageText.context, firstPart, true, viewThemeUtils
)
val checkboxList = mutableListOf<CheckBox>()
matches.forEach { matchResult ->
val isChecked = matchResult.groupValues[2] == "X" || matchResult.groupValues[2] == "x"
val taskText = matchResult.groupValues[3].trim()
lateinit var updatedMessage: String
val checkBox = CheckBox(checkBoxContainer.context).apply {
text = taskText
this.isChecked = isChecked
setOnCheckedChangeListener { _, isChecked ->
CoroutineScope(Dispatchers.Main).launch {
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()
}
}
}
}
setOnCheckedChangeListener { _, _ ->
updateCheckboxStates(chatMessage, user, checkboxList)
}
}
checkBoxContainer.addView(checkBox)
checkboxList.add(checkBox)
}
checkBoxContainer.visibility = View.VISIBLE
return true
}
private fun updateMessageWithCheckboxState(originalMessage: String, taskText: String, isChecked: Boolean): String {
val regex = """(- \[(X| )])\s*$taskText""".toRegex(RegexOption.MULTILINE)
return regex.replace(originalMessage) {
val checkboxState = if (isChecked) "X" else " "
"- [$checkboxState] $taskText"
private fun updateCheckboxStates(chatMessage: ChatMessage, user: User, checkboxes: List<CheckBox>) {
CoroutineScope(Dispatchers.Main).launch {
withContext(Dispatchers.IO) {
val apiVersion: Int = ApiUtils.getChatApiVersion(
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) {
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_account_not_found">Account not found</string>
<string name= "nc_edit">Edit</string>
<string name="edited_by">(edited by %1$s)</string>
<!-- save feature -->
<string name="nc_save_message">Save</string>
<string name="nc_dialog_save_to_storage_title">Save to storage?</string>