blob: f6dd7659c739b516119fd79c08f416d6062ed33f [file] [log] [blame]
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;
}
}
}