| package org.wordpress.android.ui.reader.utils; |
| |
| import android.content.ActivityNotFoundException; |
| import android.support.annotation.NonNull; |
| import android.text.Layout; |
| import android.text.Spannable; |
| import android.text.method.LinkMovementMethod; |
| import android.text.style.ImageSpan; |
| import android.view.MotionEvent; |
| import android.widget.TextView; |
| |
| import org.wordpress.android.ui.reader.ReaderActivityLauncher; |
| import org.wordpress.android.ui.reader.ReaderActivityLauncher.PhotoViewerOption; |
| import org.wordpress.android.util.AppLog; |
| import org.wordpress.android.util.StringUtils; |
| |
| import java.util.EnumSet; |
| |
| /* |
| * custom LinkMovementMethod which shows photo viewer when an image span is tapped |
| */ |
| public class ReaderLinkMovementMethod extends LinkMovementMethod { |
| private static ReaderLinkMovementMethod mMovementMethod; |
| private static ReaderLinkMovementMethod mMovementMethodPrivate; |
| |
| private final boolean mIsPrivate; |
| |
| /* |
| * note that separate instances are returned depending on whether we're showing |
| * content from a private blog |
| */ |
| public static ReaderLinkMovementMethod getInstance(boolean isPrivate) { |
| if (isPrivate) { |
| if (mMovementMethodPrivate == null) { |
| mMovementMethodPrivate = new ReaderLinkMovementMethod(true); |
| } |
| return mMovementMethodPrivate; |
| } else { |
| if (mMovementMethod == null) { |
| mMovementMethod = new ReaderLinkMovementMethod(false); |
| } |
| return mMovementMethod; |
| } |
| } |
| |
| /* |
| * override MovementMethod.getInstance() to ensure our getInstance(false) is used |
| */ |
| @SuppressWarnings("unused") |
| public static ReaderLinkMovementMethod getInstance() { |
| return getInstance(false); |
| } |
| |
| private ReaderLinkMovementMethod(boolean isPrivate) { |
| super(); |
| mIsPrivate = isPrivate; |
| } |
| |
| @Override |
| public boolean onTouchEvent(@NonNull TextView textView, |
| @NonNull Spannable buffer, |
| @NonNull MotionEvent event) { |
| if (event.getAction() == MotionEvent.ACTION_UP) { |
| int x = (int) event.getX(); |
| int y = (int) event.getY(); |
| |
| x -= textView.getTotalPaddingLeft(); |
| y -= textView.getTotalPaddingTop(); |
| |
| x += textView.getScrollX(); |
| y += textView.getScrollY(); |
| |
| Layout layout = textView.getLayout(); |
| int line = layout.getLineForVertical(y); |
| int off = layout.getOffsetForHorizontal(line, x); |
| |
| ImageSpan[] images = buffer.getSpans(off, off, ImageSpan.class); |
| if (images != null && images.length > 0) { |
| EnumSet<PhotoViewerOption> options = EnumSet.noneOf(PhotoViewerOption.class); |
| if (mIsPrivate) { |
| options.add(ReaderActivityLauncher.PhotoViewerOption.IS_PRIVATE_IMAGE); |
| } |
| String imageUrl = StringUtils.notNullStr(images[0].getSource()); |
| ReaderActivityLauncher.showReaderPhotoViewer( |
| textView.getContext(), |
| imageUrl, |
| null, |
| textView, |
| options, |
| (int) event.getX(), |
| (int) event.getY()); |
| return true; |
| } |
| } |
| |
| try { |
| return super.onTouchEvent(textView, buffer, event); |
| } catch (ActivityNotFoundException e) { |
| AppLog.e(AppLog.T.UTILS, e); |
| return false; |
| } |
| } |
| } |