package com.justwayward.reader.ui.fragment; import android.graphics.PorterDuff; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.SeekBar; import com.justwayward.reader.R; import com.justwayward.reader.base.BaseFragment; import com.justwayward.reader.component.AppComponent; import com.justwayward.reader.ui.activity.ReadEPubActivity; import com.justwayward.reader.view.epubview.ObservableWebView; import com.justwayward.reader.view.epubview.VerticalSeekbar; import butterknife.Bind; import nl.siegmann.epublib.domain.Book; /** * @author yuyh. * @date 2016/12/14. */ public class EPubReaderFragment extends BaseFragment { private static final String BUNDLE_POSITION = "position"; private static final String BUNDLE_BOOK = "book"; private static final String BUNDLE_EPUB_FILE_NAME = "filename"; private static final String BUNDLE_IS_SMIL_AVAILABLE = "smilavailable"; @Bind(R.id.scrollSeekbar) VerticalSeekbar mScrollSeekbar; @Bind(R.id.contentWebView) ObservableWebView mWebview; private int mPosition = -1; private Book mBook = null; private String mEpubFileName = null; private boolean mIsSmilAvailable; private int mScrollY; private ReadEPubActivity activity; private Animation mFadeInAnimation, mFadeOutAnimation; private Handler mHandler = new Handler(); public static Fragment newInstance(int position, Book book, String epubFileName, boolean isSmilAvailable) { EPubReaderFragment fragment = new EPubReaderFragment(); Bundle args = new Bundle(); args.putInt(BUNDLE_POSITION, position); args.putSerializable(BUNDLE_BOOK, book); args.putString(BUNDLE_EPUB_FILE_NAME, epubFileName); args.putSerializable(BUNDLE_IS_SMIL_AVAILABLE, isSmilAvailable); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { if ((state != null) && state.containsKey(BUNDLE_POSITION) && state.containsKey(BUNDLE_BOOK)) { mPosition = state.getInt(BUNDLE_POSITION); mBook = (Book) state.getSerializable(BUNDLE_BOOK); mEpubFileName = state.getString(BUNDLE_EPUB_FILE_NAME); mIsSmilAvailable = state.getBoolean(BUNDLE_IS_SMIL_AVAILABLE); } return super.onCreateView(inflater, container, state); } @Override public int getLayoutResId() { return R.layout.fragment_epub_reader; } @Override protected void setupActivityComponent(AppComponent appComponent) { } @Override public void attachView() { } @Override public void initDatas() { activity = (ReadEPubActivity) getActivity(); mPosition = getArguments().getInt(BUNDLE_POSITION); mBook = (Book) getArguments().getSerializable(BUNDLE_BOOK); mEpubFileName = getArguments().getString(BUNDLE_EPUB_FILE_NAME); mIsSmilAvailable = getArguments().getBoolean(BUNDLE_IS_SMIL_AVAILABLE); } @Override public void configViews() { initAnimations(); initSeekbar(); initWebView(); } private void initSeekbar() { mScrollSeekbar.setFragment(this); if (mScrollSeekbar.getProgressDrawable() != null) mScrollSeekbar.getProgressDrawable() .setColorFilter(ContextCompat.getColor(mContext, R.color.colorAccent), PorterDuff.Mode.SRC_IN); mScrollSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(final SeekBar seekBar, final int progress, boolean fromUser) { if (fromUser) { mWebview.postDelayed(new Runnable() { @Override public void run() { mWebview.setScrollY((int) (mWebview.getContentHeight() * mWebview.getScale() * progress / seekBar.getMax())); } }, 200); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } private void initWebView() { mWebview.setFragment(this); mWebview.getSettings().setJavaScriptEnabled(true); mWebview.setVerticalScrollBarEnabled(false); mWebview.getSettings().setAllowFileAccess(true); mWebview.setHorizontalScrollBarEnabled(false); mWebview.addJavascriptInterface(this, "Highlight"); mWebview.setScrollListener(new ObservableWebView.ScrollListener() { @Override public void onScrollChange(int percent) { if (mWebview.getScrollY() != 0) { mScrollY = mWebview.getScrollY(); } int height = (int) Math.floor(mWebview.getContentHeight() * mWebview.getScale()); int webViewHeight = mWebview.getMeasuredHeight(); mScrollSeekbar.setMax(height - webViewHeight); mScrollSeekbar.setProgress(percent); } }); mWebview.getSettings().setDefaultTextEncodingName("utf-8"); String herf = activity.getPageHref(mPosition); mWebview.loadUrl("file://" + herf); } private void initAnimations() { mFadeInAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.fadein); mFadeInAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { mScrollSeekbar.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } }); mFadeOutAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.fadeout); mFadeOutAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mScrollSeekbar.setVisibility(View.INVISIBLE); } @Override public void onAnimationRepeat(Animation animation) { } }); } private Runnable mHideSeekbarRunnable = new Runnable() { @Override public void run() { fadeoutSeekbarIfVisible(); } }; public void fadeInSeekbarIfInvisible() { if (mScrollSeekbar != null && !isVisible(mScrollSeekbar)) { mScrollSeekbar.startAnimation(mFadeInAnimation); } } public void fadeoutSeekbarIfVisible() { if (mScrollSeekbar != null && isVisible(mScrollSeekbar)) { mScrollSeekbar.startAnimation(mFadeOutAnimation); } } public void removeCallback() { mHandler.removeCallbacks(mHideSeekbarRunnable); } public void startCallback() { mHandler.postDelayed(mHideSeekbarRunnable, 3000); } @Override public void onDestroyView() { super.onDestroyView(); } }