Skip to content
Snippets Groups Projects
Commit db4d149c authored by Taras's avatar Taras
Browse files

Add open link confirmation

parent da31871d
No related branches found
No related tags found
No related merge requests found
package org.futo.circles.feature.timeline
import android.text.Spannable
import android.text.method.LinkMovementMethod
import android.text.style.URLSpan
import android.util.Patterns
import android.view.MotionEvent
import android.widget.TextView
import org.futo.circles.feature.timeline.list.OnLinkClickedListener
import org.matrix.android.sdk.api.extensions.tryOrNull
class InternalLinkMovementMethod(private val onLinkClickedListener: OnLinkClickedListener) :
LinkMovementMethod() {
override fun onTouchEvent(widget: TextView, buffer: Spannable, event: MotionEvent): Boolean {
val action = event.action
if (action == MotionEvent.ACTION_UP) {
var x = event.x.toInt()
var y = event.y.toInt()
x -= widget.totalPaddingLeft
y -= widget.totalPaddingTop
x += widget.scrollX
y += widget.scrollY
val layout = widget.layout
val line = layout.getLineForVertical(y)
val off = layout.getOffsetForHorizontal(line, x.toFloat())
val link = buffer.getSpans(off, off, URLSpan::class.java)
link.getOrNull(0)?.let { span ->
val spanStart = buffer.getSpanStart(span)
val spanEnd = buffer.getSpanEnd(span)
val message = tryOrNull { buffer.subSequence(spanStart, spanEnd).toString() }
val url = span.url
return if (message != url && !url.startsWith("tel")) {
onLinkClickedListener.onLinkClicked(url)
true
} else {
super.onTouchEvent(widget, buffer, event)
}
}
}
return super.onTouchEvent(widget, buffer, event)
}
}
package org.futo.circles.feature.timeline.list
interface OnLinkClickedListener {
fun onLinkClicked(url: String)
}
\ No newline at end of file
package org.futo.circles.feature.timeline.list
import android.annotation.SuppressLint
import android.text.method.LinkMovementMethod
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.futo.circles.R
import org.futo.circles.core.base.list.ViewBindingHolder
import org.futo.circles.core.extensions.gone
import org.futo.circles.core.extensions.loadEncryptedThumbOrFullIntoWithAspect
......@@ -20,9 +24,11 @@ import org.futo.circles.core.model.Post
import org.futo.circles.core.model.TextContent
import org.futo.circles.databinding.ViewPollPostBinding
import org.futo.circles.databinding.ViewTextMediaPostBinding
import org.futo.circles.model.*
import org.futo.circles.feature.timeline.InternalLinkMovementMethod
import org.futo.circles.model.PostItemPayload
import org.futo.circles.view.PostLayout
import org.futo.circles.view.PostOptionsListener
import org.matrix.android.sdk.api.extensions.tryOrNull
sealed class PostViewHolder(view: View, private val isThread: Boolean) :
......@@ -60,7 +66,11 @@ class TextMediaPostViewHolder(
@SuppressLint("ClickableViewAccessibility")
private fun handleTextClick() {
binding.tvTextContent.apply {
movementMethod = LinkMovementMethod.getInstance()
movementMethod = InternalLinkMovementMethod(object : OnLinkClickedListener {
override fun onLinkClicked(url: String) {
showLinkConfirmation(context, url)
}
})
setOnTouchListener { v, event ->
if (event.action == MotionEvent.ACTION_DOWN) v.requestFocus()
false
......@@ -68,6 +78,22 @@ class TextMediaPostViewHolder(
}
}
private fun showLinkConfirmation(context: Context, url: String) {
MaterialAlertDialogBuilder(context)
.setTitle(R.string.do_you_want_to_open_this_url)
.setMessage(url)
.setPositiveButton(android.R.string.ok) { dialogInterface, _ ->
tryOrNull {
context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
}
dialogInterface.dismiss()
}
.setNegativeButton(android.R.string.cancel) { dialogInterface, _ ->
dialogInterface.dismiss()
}
.show()
}
override fun bind(post: Post, userPowerLevel: Int) {
super.bind(post, userPowerLevel)
binding.vLoadingView.gone()
......
......@@ -60,6 +60,7 @@
<string name="request_to_follow">Request to follow</string>
<string name="select_circles_in_which_you_want_to_follow_this_timeline">Select circles in which you want to follow this timeline</string>
<string name="accept_invite">Accept invite</string>
<string name="do_you_want_to_open_this_url">Do you want to open this url?</string>
<string name="save_to_device">Save to device</string>
<string name="save_to_gallery">Save to gallery</string>
<string name="notifications">Notifications</string>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment