Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 24 additions & 24 deletions app/src/main/java/com/nextcloud/talk/ui/chat/MarkdownText.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ import android.text.method.LinkMovementMethod
import android.text.style.BackgroundColorSpan
import android.text.style.ClickableSpan
import android.text.style.ReplacementSpan
import android.text.style.URLSpan
import android.text.util.Linkify
import android.util.Patterns
import android.util.TypedValue
import android.view.GestureDetector
import android.view.MotionEvent
Expand Down Expand Up @@ -64,9 +66,6 @@ private const val CHIP_END_PADDING_DP = 5f
private const val CHIP_VERTICAL_PADDING_DP = 2f
private const val CHIP_CORNER_RADIUS_DP = 16f

private const val MESSAGE_LINKIFY_MASK = Linkify.PHONE_NUMBERS or
Linkify.EMAIL_ADDRESSES

// GFM table separator row: starts with | followed by optional spaces/colons and at least 3 dashes
private val TABLE_SEPARATOR_REGEX = Regex("""^\|[ :]*-{3,}""", RegexOption.MULTILINE)

Expand Down Expand Up @@ -167,27 +166,28 @@ fun MarkdownText(
avatarGapPx = avatarGapPx
)

// Linkify.addLinks(mask) removes ALL existing URLSpan objects (including Markwon's
// LinkSpan which extends URLSpan) before adding its own. Save them first so we can
// restore them afterwards — otherwise markdown links like [text](url) become dead.
data class SavedLinkSpan(val span: LinkSpan, val start: Int, val end: Int, val flags: Int)
val savedMarkdownLinks = ssb.getSpans(0, ssb.length, LinkSpan::class.java)
.map { span ->
SavedLinkSpan(
span,
ssb.getSpanStart(span),
ssb.getSpanEnd(span),
ssb.getSpanFlags(span)
)
}

val hasOtherLinks = Linkify.addLinks(ssb, MESSAGE_LINKIFY_MASK)
val hasAutoDetectedLinks = Linkify.addLinks(ssb, validLinkRegex.toPattern(), null) || hasOtherLinks

// Restore Markwon link spans that Linkify removed.
savedMarkdownLinks.forEach { ssb.setSpan(it.span, it.start, it.end, it.flags) }
val hasMarkdownLinks = savedMarkdownLinks.isNotEmpty()
val hasLinks = hasAutoDetectedLinks || hasMarkdownLinks
val skipExistingLinks = Linkify.MatchFilter { s, start, end ->
s !is Spanned || s.getSpans(start, end, URLSpan::class.java).isEmpty()
}
val hasUrlLinks = Linkify.addLinks(ssb, validLinkRegex.toPattern(), null)
val hasPhoneLinks = Linkify.addLinks(
ssb,
Patterns.PHONE,
"tel:",
null,
skipExistingLinks,
null
)
val hasEmailLinks = Linkify.addLinks(
ssb,
Patterns.EMAIL_ADDRESS,
"mailto:",
null,
skipExistingLinks,
null
)
val hasMarkdownLinks = ssb.getSpans(0, ssb.length, LinkSpan::class.java).isNotEmpty()
val hasLinks = hasUrlLinks || hasPhoneLinks || hasEmailLinks || hasMarkdownLinks

resolveFileParams(ssb, message)
applySearchHighlight(ssb, highlightSearchTerm, searchHighlightColorArgb)
Expand Down
Loading