mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 03:59:35 +01:00
handle multiple checkboxes
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
parent
0e118dbfd1
commit
b7835fd462
@ -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)
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user