package com.justwayward.reader.view.epubview;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.WebView;
import com.justwayward.reader.ui.activity.ReadEPubActivity;
import com.justwayward.reader.ui.fragment.EPubReaderFragment;
/**
* @author yuyh.
* @date 2016/12/13.
*/
public class ObservableWebView extends WebView {
private ReaderCallback mActivityCallback;
private EPubReaderFragment fragment;
private float MOVE_THRESHOLD_DP;
private boolean mMoveOccured = false;
private float mDownPosX;
private float mDownPosY;
private ScrollListener mScrollListener;
private SizeChangedListener mSizeChangedListener;
public interface ScrollListener {
void onScrollChange(int percent);
}
public interface SizeChangedListener {
void onSizeChanged(int height);
}
public ObservableWebView(Context context) {
this(context, null);
}
public ObservableWebView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ObservableWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
MOVE_THRESHOLD_DP = 20 * getResources().getDisplayMetrics().density;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ObservableWebView(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void setScrollListener(ScrollListener listener) {
mScrollListener = listener;
}
public void setSizeChangedListener(SizeChangedListener listener) {
mSizeChangedListener = listener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
mActivityCallback = (ReadEPubActivity) getContext();
mActivityCallback.hideToolBarIfVisible();
if (mScrollListener != null)
mScrollListener.onScrollChange(t);
super.onScrollChanged(l, t, oldl, oldt);
}
@Override
protected void onSizeChanged(int w, int h, int ow, int oh) {
super.onSizeChanged(w, h, ow, oh);
if (mSizeChangedListener != null) {
mSizeChangedListener.onSizeChanged(h);
}
}
public int getContentHeightVal() {
int height = (int) Math.floor(this.getContentHeight() * this.getScale());
return height;
}
public int getWebviewHeight() {
return this.getMeasuredHeight();
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback, int type) {
return this.dummyActionMode();
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (mActivityCallback == null)
mActivityCallback = (ReadEPubActivity) getContext();
final int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mMoveOccured = false;
mDownPosX = event.getX();
mDownPosY = event.getY();
fragment.removeCallback();
break;
case MotionEvent.ACTION_UP:
if (!mMoveOccured) {
mActivityCallback.toggleToolBarVisible();
}
fragment.startCallback();
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(event.getX() - mDownPosX) > MOVE_THRESHOLD_DP
|| Math.abs(event.getY() - mDownPosY) > MOVE_THRESHOLD_DP) {
mMoveOccured = true;
fragment.fadeInSeekbarIfInvisible();
}
break;
}
return super.dispatchTouchEvent(event);
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
return this.dummyActionMode();
}
public ActionMode dummyActionMode() {
return new ActionMode() {
@Override
public void setTitle(CharSequence title) {
}
@Override
public void setTitle(int resId) {
}
@Override
public void setSubtitle(CharSequence subtitle) {
}
@Override
public void setSubtitle(int resId) {
}
@Override
public void setCustomView(View view) {
}
@Override
public void invalidate() {
}
@Override
public void finish() {
}
@Override
public Menu getMenu() {
return null;
}
@Override
public CharSequence getTitle() {
return null;
}
@Override
public CharSequence getSubtitle() {
return null;
}
@Override
public View getCustomView() {
return null;
}
@Override
public MenuInflater getMenuInflater() {
return null;
}
};
}
public void setFragment(EPubReaderFragment fragment) {
this.fragment = fragment;
}
}