1package eu.siacs.conversations.ui.widget;
2
3import android.text.Layout;
4import android.text.Spannable;
5import android.text.method.ArrowKeyMovementMethod;
6import android.text.style.ClickableSpan;
7import android.view.MotionEvent;
8import android.widget.TextView;
9
10public class ClickableMovementMethod extends ArrowKeyMovementMethod {
11
12 @Override
13 public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
14 // Just copied from android.text.method.LinkMovementMethod
15 if (event.getAction() == MotionEvent.ACTION_UP) {
16 int x = (int) event.getX();
17 int y = (int) event.getY();
18 x -= widget.getTotalPaddingLeft();
19 y -= widget.getTotalPaddingTop();
20 x += widget.getScrollX();
21 y += widget.getScrollY();
22 Layout layout = widget.getLayout();
23 int line = layout.getLineForVertical(y);
24 int off = layout.getOffsetForHorizontal(line, x);
25 ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
26 if (link.length != 0) {
27 link[0].onClick(widget);
28 return true;
29 }
30 }
31 return super.onTouchEvent(widget, buffer, event);
32 }
33
34 public static ClickableMovementMethod getInstance() {
35 if (sInstance == null) {
36 sInstance = new ClickableMovementMethod();
37 }
38 return sInstance;
39 }
40
41 private static ClickableMovementMethod sInstance;
42}