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

55 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 || tag != "a") {
return false
}
if (opening && attributes != null) {
linkTagStartIndex = output.length
link = attributes.getValue("href")
} else if (!opening && linkTagStartIndex >= 0 && link != null) {
setLinkSpans(output, linkTagStartIndex, output.length, link!!)
linkTagStartIndex = -1
link = null
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) {
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
}
}