aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/ui/widget/ClickableMovementMethod.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/eu/siacs/conversations/ui/widget/ClickableMovementMethod.java')
-rw-r--r--src/main/java/eu/siacs/conversations/ui/widget/ClickableMovementMethod.java42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/main/java/eu/siacs/conversations/ui/widget/ClickableMovementMethod.java b/src/main/java/eu/siacs/conversations/ui/widget/ClickableMovementMethod.java
new file mode 100644
index 00000000..8659a192
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/ui/widget/ClickableMovementMethod.java
@@ -0,0 +1,42 @@
+package eu.siacs.conversations.ui.widget;
+
+import android.text.Layout;
+import android.text.Spannable;
+import android.text.method.ArrowKeyMovementMethod;
+import android.text.style.ClickableSpan;
+import android.view.MotionEvent;
+import android.widget.TextView;
+
+public class ClickableMovementMethod extends ArrowKeyMovementMethod {
+
+ @Override
+ public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
+ // Just copied from android.text.method.LinkMovementMethod
+ if (event.getAction() == MotionEvent.ACTION_UP) {
+ int x = (int) event.getX();
+ int y = (int) event.getY();
+ x -= widget.getTotalPaddingLeft();
+ y -= widget.getTotalPaddingTop();
+ x += widget.getScrollX();
+ y += widget.getScrollY();
+ Layout layout = widget.getLayout();
+ int line = layout.getLineForVertical(y);
+ int off = layout.getOffsetForHorizontal(line, x);
+ ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
+ if (link.length != 0) {
+ link[0].onClick(widget);
+ return true;
+ }
+ }
+ return super.onTouchEvent(widget, buffer, event);
+ }
+
+ public static ClickableMovementMethod getInstance() {
+ if (sInstance == null) {
+ sInstance = new ClickableMovementMethod();
+ }
+ return sInstance;
+ }
+
+ private static ClickableMovementMethod sInstance;
+} \ No newline at end of file