mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-19 03:29:28 +01:00
Merge pull request #4729 from nextcloud/make_link_clickable
Make link clickable
This commit is contained in:
commit
17702bbe92
@ -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,6 +89,32 @@ 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
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -103,6 +140,7 @@ class SystemMessageViewHolder(itemView: View) : MessageHolders.IncomingTextMessa
|
|||||||
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")
|
||||||
private fun processExpandableParent(message: ChatMessage, messageString: Spannable) {
|
private fun processExpandableParent(message: ChatMessage, messageString: Spannable) {
|
||||||
@ -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
|
||||||
|
|
||||||
|
@ -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"]
|
||||||
|
Loading…
Reference in New Issue
Block a user