@@ -15,7 +15,7 @@ import android.util.TypedValue
1515import android.view.View
1616import android.widget.CheckBox
1717import androidx.core.content.ContextCompat
18- import androidx.core.text.toSpanned
18+ import androidx.emoji2.widget.EmojiTextView
1919import autodagger.AutoInjector
2020import coil.load
2121import com.google.android.flexbox.FlexboxLayout
@@ -150,8 +150,8 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
150150 // binding.messageText.text =
151151 // SpannableStringBuilder(processedMessageText).append(" (" + message.jsonMessageId + ")")
152152 } else {
153- binding.messageText.visibility = View .GONE
154153 binding.checkboxContainer.visibility = View .VISIBLE
154+ binding.messageText.visibility = View .GONE
155155 }
156156
157157 if (message.lastEditTimestamp != 0L && ! message.isDeleted) {
@@ -202,10 +202,10 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
202202 )
203203 }
204204
205+ @Suppress(" LongMethod" )
205206 private fun processCheckboxes (chatMessage : ChatMessage , user : User ): Boolean {
206207 val chatActivity = commonMessageInterface as ChatActivity
207- val message = chatMessage.message!! .toSpanned()
208- val messageTextView = binding.messageText
208+ val message = chatMessage.message ? : return false
209209 val checkBoxContainer = binding.checkboxContainer
210210 val isOlderThanTwentyFourHours = chatMessage
211211 .createdAt
@@ -218,46 +218,68 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
218218 ! isOlderThanTwentyFourHours
219219
220220 checkBoxContainer.removeAllViews()
221- val regex = """ (- \[(X|x| )])\s*(.+)""" .toRegex(RegexOption .MULTILINE )
222- val matches = regex.findAll(message)
223-
224- if (matches.none()) return false
225-
226- val firstPart = message.toString().substringBefore(" \n - [" )
227- messageTextView.text = messageUtils.enrichChatMessageText(
228- binding.messageText.context,
229- firstPart,
230- true ,
231- viewThemeUtils
232- )
221+ val checkboxRegex = """ - \[(X|x| )]\s*(.+)""" .toRegex()
222+ val lines = message.lines()
233223
234224 val checkboxList = mutableListOf<CheckBox >()
235-
236- matches.forEach { matchResult ->
237- val isChecked = matchResult.groupValues[CHECKED_GROUP_INDEX ] == " X" ||
238- matchResult.groupValues[CHECKED_GROUP_INDEX ] == " x"
239- val taskText = matchResult.groupValues[TASK_TEXT_GROUP_INDEX ].trim()
240-
241- val checkBox = CheckBox (checkBoxContainer.context).apply {
242- text = taskText
243- this .isChecked = isChecked
244- this .isEnabled = (
245- chatMessage.actorType == " bots" ||
246- chatActivity.userAllowedByPrivilages(chatMessage)
247- ) &&
248- messageIsEditable
249-
250- setTextColor(ContextCompat .getColor(context, R .color.no_emphasis_text))
251-
252- setOnCheckedChangeListener { _, _ ->
253- updateCheckboxStates(chatMessage, user, checkboxList)
225+ var hasCheckbox = false
226+
227+ lines.forEach { line ->
228+ val match = checkboxRegex.matchEntire(line.trim())
229+ if (match != null ) {
230+ hasCheckbox = true
231+ val isChecked = match.groupValues[1 ].equals(" X" , true )
232+ val taskText = match.groupValues[2 ].trim()
233+ val checkBox = CheckBox (checkBoxContainer.context).apply {
234+ val messageText = messageUtils.enrichChatMessageText(
235+ context,
236+ taskText,
237+ true ,
238+ viewThemeUtils
239+ )
240+ text = messageUtils.processMessageParameters(
241+ context,
242+ viewThemeUtils,
243+ messageText,
244+ chatMessage,
245+ null
246+ )
247+ this .isChecked = isChecked
248+ this .isEnabled = (
249+ chatMessage.actorType == " bots" ||
250+ chatActivity.userAllowedByPrivilages(chatMessage)
251+ ) &&
252+ messageIsEditable
253+ setTextColor(ContextCompat .getColor(context, R .color.no_emphasis_text))
254+ setOnCheckedChangeListener { _, _ ->
255+ updateCheckboxStates(chatMessage, user, checkboxList)
256+ }
254257 }
258+ checkBoxContainer.addView(checkBox)
259+ checkboxList.add(checkBox)
260+ viewThemeUtils.platform.themeCheckbox(checkBox)
261+ } else if (line.isNotBlank()) {
262+ val textView = EmojiTextView (checkBoxContainer.context).apply {
263+ val messageText = messageUtils.enrichChatMessageText(
264+ context,
265+ line,
266+ true ,
267+ viewThemeUtils
268+ )
269+ text = messageUtils.processMessageParameters(
270+ context,
271+ viewThemeUtils,
272+ messageText,
273+ chatMessage,
274+ null
275+ )
276+ viewThemeUtils.platform.colorTextView(this , ColorRole .ON_SURFACE_VARIANT )
277+ }
278+ checkBoxContainer.addView(textView)
255279 }
256- checkBoxContainer.addView(checkBox)
257- checkboxList.add(checkBox)
258- viewThemeUtils.platform.themeCheckbox(checkBox)
259280 }
260- return true
281+
282+ return hasCheckbox
261283 }
262284
263285 private fun updateCheckboxStates (chatMessage : ChatMessage , user : User , checkboxes : List <CheckBox >) {
@@ -292,17 +314,18 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
292314 }
293315
294316 private fun updateMessageWithCheckboxStates (originalMessage : String , checkboxes : List <CheckBox >): String {
295- var updatedMessage = originalMessage
296- val regex = """ (- \[(X|x| )])\s*(.+)""" .toRegex(RegexOption .MULTILINE )
297-
298- checkboxes.forEach { _ ->
299- updatedMessage = regex.replace(updatedMessage) { matchResult ->
300- val taskText = matchResult.groupValues[TASK_TEXT_GROUP_INDEX ].trim()
301- val checkboxState = if (checkboxes.find { it.text == taskText }?.isChecked == true ) " X" else " "
302- " - [$checkboxState ] $taskText "
317+ val checkboxRegex = """ - \[(X|x| )]\s*(.+)""" .toRegex()
318+ var index = 0
319+ return originalMessage.lines().joinToString(" \n " ) { line ->
320+ val match = checkboxRegex.matchEntire(line.trim())
321+ if (match != null ) {
322+ val taskText = match.groupValues[2 ].trim()
323+ val state = if (checkboxes.getOrNull(index++ )?.isChecked == true ) " X" else " "
324+ " - [$state ] $taskText "
325+ } else {
326+ line
303327 }
304328 }
305- return updatedMessage
306329 }
307330
308331 private fun longClickOnReaction (chatMessage : ChatMessage ) {
@@ -421,8 +444,6 @@ class IncomingTextMessageViewHolder(itemView: View, payload: Any) :
421444 companion object {
422445 const val TEXT_SIZE_MULTIPLIER = 2.5
423446 private val TAG = IncomingTextMessageViewHolder ::class .java.simpleName
424- private const val CHECKED_GROUP_INDEX = 2
425- private const val TASK_TEXT_GROUP_INDEX = 3
426447 private const val AGE_THRESHOLD_FOR_EDIT_MESSAGE : Long = 86400000
427448 }
428449}
0 commit comments