Merge pull request #4729 from nextcloud/make_link_clickable

Make link clickable
This commit is contained in:
Marcel Hibbe 2025-02-18 09:08:18 +00:00 committed by GitHub
commit 17702bbe92
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 60 additions and 22 deletions

View File

@ -8,8 +8,13 @@ package com.nextcloud.talk.adapters.messages
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent
import android.net.Uri
import android.text.Spannable import android.text.Spannable
import android.text.SpannableString import android.text.SpannableString
import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -22,15 +27,20 @@ import com.nextcloud.talk.databinding.ItemSystemMessageBinding
import com.nextcloud.talk.chat.data.model.ChatMessage import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.utils.DateUtils import com.nextcloud.talk.utils.DateUtils
import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DisplayUtils
import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
import com.nextcloud.talk.utils.preferences.AppPreferences import com.nextcloud.talk.utils.preferences.AppPreferences
import com.stfalcon.chatkit.messages.MessageHolders import com.stfalcon.chatkit.messages.MessageHolders
import javax.inject.Inject import javax.inject.Inject
@AutoInjector(NextcloudTalkApplication::class) @AutoInjector(NextcloudTalkApplication::class)
class SystemMessageViewHolder(itemView: View) : MessageHolders.IncomingTextMessageViewHolder<ChatMessage>(itemView) { class SystemMessageViewHolder(itemView: View) : MessageHolders
.IncomingTextMessageViewHolder<ChatMessage>(itemView) {
private val binding: ItemSystemMessageBinding = ItemSystemMessageBinding.bind(itemView) private val binding: ItemSystemMessageBinding = ItemSystemMessageBinding.bind(itemView)
@Inject
lateinit var currentUserProvider: CurrentUserProviderNew
@JvmField @JvmField
@Inject @Inject
var appPreferences: AppPreferences? = null var appPreferences: AppPreferences? = null
@ -54,6 +64,7 @@ class SystemMessageViewHolder(itemView: View) : MessageHolders.IncomingTextMessa
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onBind(message: ChatMessage) { override fun onBind(message: ChatMessage) {
super.onBind(message) super.onBind(message)
val user = currentUserProvider.currentUser.blockingGet()
val resources = itemView.resources val resources = itemView.resources
val pressedColor: Int = resources.getColor(R.color.bg_message_list_incoming_bubble) val pressedColor: Int = resources.getColor(R.color.bg_message_list_incoming_bubble)
val mentionColor: Int = resources.getColor(R.color.textColorMaxContrast) val mentionColor: Int = resources.getColor(R.color.textColorMaxContrast)
@ -78,30 +89,57 @@ class SystemMessageViewHolder(itemView: View) : MessageHolders.IncomingTextMessa
individualMap["name"] individualMap["name"]
} }
messageString = DisplayUtils.searchAndColor(messageString, searchText!!, mentionColor) messageString = DisplayUtils.searchAndColor(messageString, searchText!!, mentionColor)
if (individualMap["link"] != null) {
val displayName = individualMap["name"] ?: ""
val link = (user.baseUrl + individualMap["link"])
val newStartIndex = messageString.indexOf(displayName)
if (newStartIndex != -1) {
val clickableSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(link))
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context?.startActivity(browserIntent)
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = mentionColor
ds.isUnderlineText = false
}
}
messageString.setSpan(
clickableSpan,
newStartIndex,
newStartIndex + displayName.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
}
} }
} }
}
binding.systemMessageLayout.visibility = View.VISIBLE binding.systemMessageLayout.visibility = View.VISIBLE
binding.similarMessagesHint.visibility = View.GONE binding.similarMessagesHint.visibility = View.GONE
if (message.expandableParent) { if (message.expandableParent) {
processExpandableParent(message, messageString) processExpandableParent(message, messageString)
} else if (message.hiddenByCollapse) { } else if (message.hiddenByCollapse) {
binding.systemMessageLayout.visibility = View.GONE binding.systemMessageLayout.visibility = View.GONE
} else { } else {
binding.expandCollapseIcon.visibility = View.GONE binding.expandCollapseIcon.visibility = View.GONE
binding.messageText.text = messageString binding.messageText.text = messageString
binding.expandCollapseIcon.setImageDrawable(null) binding.expandCollapseIcon.setImageDrawable(null)
binding.systemMessageLayout.setOnClickListener(null) binding.systemMessageLayout.setOnClickListener(null)
} }
if (!message.expandableParent && message.lastItemOfExpandableGroup != 0) { if (!message.expandableParent && message.lastItemOfExpandableGroup != 0) {
binding.systemMessageLayout.setOnClickListener { systemMessageInterface.collapseSystemMessages() } binding.systemMessageLayout.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
binding.messageText.setOnClickListener { systemMessageInterface.collapseSystemMessages() } binding.messageText.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
} }
binding.messageTime.text = dateUtils!!.getLocalTimeStringFromTimestamp(message.timestamp) binding.messageTime.text = dateUtils!!.getLocalTimeStringFromTimestamp(message.timestamp)
itemView.setTag(R.string.replyable_message_view_tag, message.replyable) itemView.setTag(R.string.replyable_message_view_tag, message.replyable)
}
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
@ -116,6 +154,7 @@ class SystemMessageViewHolder(itemView: View) : MessageHolders.IncomingTextMessa
) )
binding.messageText.text = messageString binding.messageText.text = messageString
binding.messageText.movementMethod = LinkMovementMethod.getInstance()
binding.similarMessagesHint.visibility = View.VISIBLE binding.similarMessagesHint.visibility = View.VISIBLE
binding.similarMessagesHint.text = similarMessages binding.similarMessagesHint.text = similarMessages

View File

@ -29,8 +29,7 @@ class ChatUtils {
if (individualHashMap != null) { if (individualHashMap != null) {
val type = individualHashMap["type"] val type = individualHashMap["type"]
resultMessage = if (type == "user" || type == "guest" || type == "call" || type == "email" resultMessage = if (type == "user" || type == "guest" || type == "call" || type == "email") {
) {
resultMessage?.replace("{$key}", "@" + individualHashMap["name"]) resultMessage?.replace("{$key}", "@" + individualHashMap["name"])
} else if (type == "geo-location") { } else if (type == "geo-location") {
individualHashMap["name"] individualHashMap["name"]