handle markdown links

Signed-off-by: sowjanyakch <sowjanya.kch@gmail.com>
This commit is contained in:
sowjanyakch 2025-07-21 14:41:38 +02:00
parent 465d779401
commit 5fb1ae4560
No known key found for this signature in database
GPG Key ID: F7AA2A8B65B50220
2 changed files with 38 additions and 4 deletions

View File

@ -7,17 +7,22 @@
package com.nextcloud.talk.utils package com.nextcloud.talk.utils
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.util.Log import android.content.Intent
import android.text.method.ScrollingMovementMethod
import android.view.View import android.view.View
import androidx.core.net.toUri
import com.nextcloud.talk.R import com.nextcloud.talk.R
import io.noties.markwon.AbstractMarkwonPlugin import io.noties.markwon.AbstractMarkwonPlugin
import io.noties.markwon.LinkResolverDef
import io.noties.markwon.Markwon import io.noties.markwon.Markwon
import io.noties.markwon.MarkwonConfiguration import io.noties.markwon.MarkwonConfiguration
import io.noties.markwon.core.MarkwonTheme import io.noties.markwon.core.MarkwonTheme
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin import io.noties.markwon.ext.strikethrough.StrikethroughPlugin
import io.noties.markwon.ext.tasklist.TaskListDrawable import io.noties.markwon.ext.tasklist.TaskListDrawable
import io.noties.markwon.ext.tasklist.TaskListPlugin import io.noties.markwon.ext.tasklist.TaskListPlugin
import io.noties.markwon.movement.MovementMethodPlugin
object MarkwonUtils { object MarkwonUtils {
private const val TAG = "MarkwonUtils" private const val TAG = "MarkwonUtils"
@ -31,13 +36,28 @@ object MarkwonUtils {
} }
override fun configureConfiguration(builder: MarkwonConfiguration.Builder) { override fun configureConfiguration(builder: MarkwonConfiguration.Builder) {
builder.linkResolver { view: View?, link: String? -> builder.linkResolver(object : LinkResolverDef() {
Log.i(TAG, "Link action not implemented $view / $link") @SuppressLint("SuspiciousIndentation")
} override fun resolve(view: View, link: String) {
var linkToOpen = link
if (!(linkToOpen.contains("http://") || linkToOpen.contains("https://"))) {
linkToOpen = "https://$link"
} else {
linkToOpen = link
}
val browserIntent = Intent(
Intent.ACTION_VIEW,
linkToOpen.toUri()
)
context.startActivity(browserIntent)
}
})
} }
}) })
.usePlugin(TaskListPlugin.create(drawable)) .usePlugin(TaskListPlugin.create(drawable))
.usePlugin(StrikethroughPlugin.create()) .usePlugin(StrikethroughPlugin.create())
.usePlugin(MovementMethodPlugin.create(ScrollingMovementMethod.getInstance()))
.build() .build()
} }
} }

View File

@ -16,6 +16,7 @@ import android.text.Spanned
import android.text.style.StyleSpan import android.text.style.StyleSpan
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.widget.TextView
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.chat.data.model.ChatMessage import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.ui.theme.ViewThemeUtils
@ -208,6 +209,19 @@ class MessageUtils(val context: Context) {
return markwon.toMarkdown(markdown) return markwon.toMarkdown(markdown)
} }
fun isMarkdownInlineLink(text: String): Boolean {
val markdownLinkRegex = Regex("""\[([^\]]+?)]\((.*?)(?:\s+"[^"]*")?\)""")
return markdownLinkRegex.containsMatchIn(text)
}
fun hyperLinks(view: TextView, text: String) {
val isMarkdownLink = isMarkdownInlineLink(text)
if (isMarkdownLink) {
view.autoLinkMask = 0
} else {
view.autoLinkMask = 15
}
}
companion object { companion object {
private const val TAG = "MessageUtils" private const val TAG = "MessageUtils"
const val MAX_REPLY_LENGTH = 250 const val MAX_REPLY_LENGTH = 250