package com.kenny.openimgur.classes; import android.text.Layout; import android.text.Spannable; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.text.style.URLSpan; import android.view.MotionEvent; import android.widget.TextView; import java.util.HashSet; import java.util.Set; /** * Class that handles clicking of links in a text View */ public class CustomLinkMovement extends LinkMovementMethod { private static CustomLinkMovement sInstance; private Set<ImgurListener> mListeners = new HashSet<>(); public static CustomLinkMovement getInstance(ImgurListener listener) { if (sInstance == null) { sInstance = new CustomLinkMovement(); } sInstance.mListeners.add(listener); return sInstance; } public static CustomLinkMovement getInstance() { if (sInstance == null) { sInstance = new CustomLinkMovement(); } return sInstance; } public void addListener(ImgurListener listener) { mListeners.add(listener); } @Override public boolean onTouchEvent(final TextView widget, final Spannable buffer, final MotionEvent event) { final int action = event.getAction(); if (action == MotionEvent.ACTION_UP) { final int x = (int) event.getX() - widget.getTotalPaddingLeft() + widget.getScrollX(); final int y = (int) event.getY() - widget.getTotalPaddingTop() + widget.getScrollY(); final Layout layout = widget.getLayout(); final int line = layout.getLineForVertical(y); final int off = layout.getOffsetForHorizontal(line, x); final ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); if (link.length != 0 && link[0] instanceof URLSpan) { for (ImgurListener l : mListeners) { if (l != null) { l.onLinkTap(widget, ((URLSpan) link[0]).getURL()); } } return true; } for (ImgurListener l : mListeners) { if (l != null) { l.onLinkTap(widget, null); } } } return super.onTouchEvent(widget, buffer, event); } /** * Removes the ImgurListener from the set * * @param listener */ public void removeListener(ImgurListener listener) { mListeners.remove(listener); } }