mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-19 19:49:33 +01:00
edit message on clicking checkboxes
Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
parent
7fe6901fa2
commit
2b939f9a9a
@ -19,10 +19,12 @@ import androidx.core.text.toSpanned
|
|||||||
import androidx.emoji2.widget.EmojiTextView
|
import androidx.emoji2.widget.EmojiTextView
|
||||||
import autodagger.AutoInjector
|
import autodagger.AutoInjector
|
||||||
import coil.load
|
import coil.load
|
||||||
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.nextcloud.talk.R
|
import com.nextcloud.talk.R
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication
|
import com.nextcloud.talk.application.NextcloudTalkApplication
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
|
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
|
||||||
import com.nextcloud.talk.chat.ChatActivity
|
import com.nextcloud.talk.chat.ChatActivity
|
||||||
|
import com.nextcloud.talk.chat.data.ChatMessageRepository
|
||||||
import com.nextcloud.talk.chat.data.model.ChatMessage
|
import com.nextcloud.talk.chat.data.model.ChatMessage
|
||||||
import com.nextcloud.talk.data.user.model.User
|
import com.nextcloud.talk.data.user.model.User
|
||||||
import com.nextcloud.talk.databinding.ItemCustomIncomingTextMessageBinding
|
import com.nextcloud.talk.databinding.ItemCustomIncomingTextMessageBinding
|
||||||
@ -63,16 +65,15 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
|
|||||||
@Inject
|
@Inject
|
||||||
lateinit var dateUtils: DateUtils
|
lateinit var dateUtils: DateUtils
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var currentUserProvider: CurrentUserProviderNew
|
lateinit var currentUserProvider: CurrentUserProviderNew
|
||||||
|
|
||||||
lateinit var commonMessageInterface: CommonMessageInterface
|
lateinit var commonMessageInterface: CommonMessageInterface
|
||||||
|
|
||||||
override fun onBind(message: ChatMessage) {
|
@Inject
|
||||||
|
lateinit var chatRepository: ChatMessageRepository
|
||||||
|
|
||||||
val user = currentUserProvider.currentUser.blockingGet()
|
override fun onBind(message: ChatMessage) {
|
||||||
|
|
||||||
super.onBind(message)
|
super.onBind(message)
|
||||||
sharedApplication!!.componentApplication.inject(this)
|
sharedApplication!!.componentApplication.inject(this)
|
||||||
|
|
||||||
@ -80,6 +81,7 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
|
|||||||
colorizeMessageBubble(message)
|
colorizeMessageBubble(message)
|
||||||
|
|
||||||
itemView.isSelected = false
|
itemView.isSelected = false
|
||||||
|
val user = currentUserProvider.currentUser.blockingGet()
|
||||||
|
|
||||||
var textSize = context.resources!!.getDimension(R.dimen.chat_text_size)
|
var textSize = context.resources!!.getDimension(R.dimen.chat_text_size)
|
||||||
|
|
||||||
@ -98,8 +100,13 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
|
|||||||
itemView
|
itemView
|
||||||
)
|
)
|
||||||
|
|
||||||
val hasCheckboxes = processCheckboxes( binding.messageText, binding
|
val hasCheckboxes = processCheckboxes(
|
||||||
.checkboxContainer, message, user)
|
binding.messageText,
|
||||||
|
binding
|
||||||
|
.checkboxContainer,
|
||||||
|
message,
|
||||||
|
user
|
||||||
|
)
|
||||||
|
|
||||||
val messageParameters = message.messageParameters
|
val messageParameters = message.messageParameters
|
||||||
if (
|
if (
|
||||||
@ -145,11 +152,12 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun processCheckboxes(
|
||||||
private fun processCheckboxes(messageTextView: EmojiTextView, checkBoxContainer: LinearLayout,
|
messageTextView: EmojiTextView,
|
||||||
chatMessage: ChatMessage, user: User
|
checkBoxContainer: LinearLayout,
|
||||||
|
chatMessage: ChatMessage,
|
||||||
|
user: User
|
||||||
): Boolean {
|
): Boolean {
|
||||||
|
|
||||||
val message = chatMessage.message!!.toSpanned()
|
val message = chatMessage.message!!.toSpanned()
|
||||||
checkBoxContainer.removeAllViews()
|
checkBoxContainer.removeAllViews()
|
||||||
val regex = """(- \[(X| )])\s*(.+)""".toRegex(RegexOption.MULTILINE)
|
val regex = """(- \[(X| )])\s*(.+)""".toRegex(RegexOption.MULTILINE)
|
||||||
@ -165,33 +173,64 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
|
|||||||
matches.forEach { matchResult ->
|
matches.forEach { matchResult ->
|
||||||
val isChecked = matchResult.groupValues[2] == "X"
|
val isChecked = 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 { _, isChecked ->
|
||||||
//edit message
|
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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (chatMessage.lastEditTimestamp != 0L && !chatMessage.isDeleted) {
|
||||||
|
binding.messageEditIndicator.visibility = View.VISIBLE
|
||||||
|
binding.messageTime.text = dateUtils.getLocalTimeStringFromTimestamp(
|
||||||
|
chatMessage
|
||||||
|
.lastEditTimestamp!!
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
checkBoxContainer.addView(checkBox)
|
checkBoxContainer.addView(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 updateMessageWithCheckboxState(originalMessage: String, taskText: String, isChecked: Boolean): String {
|
||||||
val lines = originalMessage.split("\n")
|
val regex = """(- \[(X| )])\s*$taskText""".toRegex(RegexOption.MULTILINE)
|
||||||
val updatedLines = lines.map { line ->
|
return regex.replace(originalMessage) {
|
||||||
if (line.contains(taskText)) {
|
val checkboxState = if (isChecked) "X" else " "
|
||||||
val checkboxState = if (isChecked) "X" else " "
|
"- [$checkboxState] $taskText"
|
||||||
"- [$checkboxState] $taskText"
|
|
||||||
} else {
|
|
||||||
line
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return updatedLines.joinToString("\n")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun longClickOnReaction(chatMessage: ChatMessage) {
|
private fun longClickOnReaction(chatMessage: ChatMessage) {
|
||||||
@ -302,6 +341,4 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
|
|||||||
const val TEXT_SIZE_MULTIPLIER = 2.5
|
const val TEXT_SIZE_MULTIPLIER = 2.5
|
||||||
private val TAG = IncomingTextMessageViewHolder::class.java.simpleName
|
private val TAG = IncomingTextMessageViewHolder::class.java.simpleName
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user