LibreTube/app/src/main/java/com/github/libretube/util/LinkHandler.kt

56 lines
1.6 KiB
Kotlin
Raw Normal View History

2023-01-16 21:36:23 +05:30
package com.github.libretube.util
import android.text.Editable
import android.text.Spanned
import android.text.TextPaint
import android.text.style.ClickableSpan
import android.view.View
import org.xml.sax.Attributes
class LinkHandler(private val clickCallback: ((String) -> Unit)?) {
2023-01-16 21:36:23 +05:30
private var linkTagStartIndex = -1
private var link: String? = null
fun handleTag(
opening: Boolean,
tag: String?,
output: Editable?,
attributes: Attributes?
): Boolean {
// if the tag is not an anchor link, ignore for the default handler
if (output == null || "a" != tag) {
return false
}
if (opening) {
if (attributes != null) {
linkTagStartIndex = output.length
link = attributes.getValue("href")
2023-01-16 21:36:23 +05:30
}
} else {
val refTagEndIndex = output.length
setLinkSpans(output, linkTagStartIndex, refTagEndIndex, link)
2023-01-16 21:36:23 +05:30
}
return true
2023-01-16 21:36:23 +05:30
}
private fun setLinkSpans(output: Editable, start: Int, end: Int, link: String?) {
output.setSpan(
object : ClickableSpan() {
override fun onClick(widget: View) {
if (clickCallback != null && link != null) {
clickCallback.invoke(link)
}
2023-01-16 21:36:23 +05:30
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.isUnderlineText = false
}
},
start,
end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
2023-01-16 21:36:23 +05:30
}
}