package org.wikipedia.page;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.Layout;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.view.MotionEvent;
import android.widget.TextView;
import org.wikipedia.util.UriUtil;
import static org.wikipedia.util.UriUtil.decodeURL;
/**
* Intercept web links and add special behavior for external links.
*/
public class LinkMovementMethodExt extends LinkMovementMethod {
private UrlHandler handler;
public LinkMovementMethodExt(UrlHandler handler) {
this.handler = handler;
}
@Override
public boolean onTouchEvent(@NonNull final TextView widget, @NonNull final Spannable buffer, @NonNull 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 URLSpan[] links = buffer.getSpans(off, off, URLSpan.class);
if (links.length != 0) {
String url = decodeURL(links[0].getURL());
handler.onUrlClick(url, UriUtil.getTitleFromUrl(url));
return true;
}
}
return super.onTouchEvent(widget, buffer, event);
}
public interface UrlHandler {
void onUrlClick(@NonNull String url, @Nullable String titleString);
}
}