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)? ) { 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 } return true } private fun setLinkSpans(output: Editable, start: Int, end: Int, link: String) { output.setSpan( object : ClickableSpan() { override fun onClick(widget: View) { clickCallback?.invoke(link) } override fun updateDrawState(ds: TextPaint) { super.updateDrawState(ds) ds.isUnderlineText = false } }, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) } }