package com.justwayward.reader.ui.activity; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Handler; import android.support.v7.widget.ListPopupWindow; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.animation.LinearInterpolator; import android.widget.AdapterView; import android.widget.PopupWindow; import android.widget.TextView; import com.justwayward.reader.R; import com.justwayward.reader.base.BaseActivity; import com.justwayward.reader.base.Constant; import com.justwayward.reader.bean.BookMixAToc; import com.justwayward.reader.component.AppComponent; import com.justwayward.reader.ui.adapter.EPubReaderAdapter; import com.justwayward.reader.ui.adapter.TocListAdapter; import com.justwayward.reader.utils.FileUtils; import com.justwayward.reader.view.epubview.DirectionalViewpager; import com.justwayward.reader.view.epubview.ReaderCallback; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import butterknife.OnClick; import nl.siegmann.epublib.domain.Book; import nl.siegmann.epublib.domain.Resource; import nl.siegmann.epublib.domain.SpineReference; import nl.siegmann.epublib.domain.TOCReference; import nl.siegmann.epublib.epub.EpubReader; public class ReadEPubActivity extends BaseActivity implements ReaderCallback { public static void start(Context context, String filePath) { Intent intent = new Intent(context, ReadEPubActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.fromFile(new File(filePath))); context.startActivity(intent); } @Bind(R.id.epubViewPager) DirectionalViewpager viewpager; @Bind(R.id.toolbar_menu) View ivMenu; @Bind(R.id.toolbar_title) TextView tvTitle; private EPubReaderAdapter mAdapter; private String mFileName; private String mFilePath; private Book mBook; private ArrayList<TOCReference> mTocReferences; private List<SpineReference> mSpineReferences; public boolean mIsSmilParsed = false; private List<BookMixAToc.mixToc.Chapters> mChapterList = new ArrayList<>(); private ListPopupWindow mTocListPopupWindow; private TocListAdapter mTocListAdapter; private boolean mIsActionBarVisible = true; private int currentChapter; @Override public int getLayoutId() { return R.layout.activity_read_epub; } @Override protected void setupActivityComponent(AppComponent appComponent) { } @Override public void initToolBar() { mCommonToolbar.getViewTreeObserver() .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { mCommonToolbar.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { mCommonToolbar.getViewTreeObserver().removeGlobalOnLayoutListener(this); } hideToolBarIfVisible(); } }); showDialog(); } @Override public void initDatas() { mFilePath = Uri.decode(getIntent().getDataString().replace("file://", "")); mFileName = mFilePath.substring(mFilePath.lastIndexOf("/") + 1, mFilePath.lastIndexOf(".")); } @Override public void configViews() { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { loadBook(); return null; } @Override protected void onPostExecute(Void aVoid) { initPager(); initTocList(); } }.execute(); } private void loadBook() { try { // 打开书籍 EpubReader reader = new EpubReader(); InputStream is = new FileInputStream(mFilePath); mBook = reader.readEpub(is); mTocReferences = (ArrayList<TOCReference>) mBook.getTableOfContents().getTocReferences(); mSpineReferences = mBook.getSpine().getSpineReferences(); setSpineReferenceTitle(); // 解压epub至缓存目录 FileUtils.unzipFile(mFilePath, Constant.PATH_EPUB + "/" + mFileName); } catch (IOException e) { e.printStackTrace(); } } private void initPager() { viewpager.setOnPageChangeListener(new DirectionalViewpager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mTocListAdapter.setCurrentChapter(position + 1); } @Override public void onPageScrollStateChanged(int state) { } }); if (mBook != null && mSpineReferences != null && mTocReferences != null) { mAdapter = new EPubReaderAdapter(getSupportFragmentManager(), mSpineReferences, mBook, mFileName, mIsSmilParsed); viewpager.setAdapter(mAdapter); } hideDialog(); } private void initTocList() { mTocListAdapter = new TocListAdapter(this, mChapterList, "", 1); mTocListAdapter.setEpub(true); mTocListPopupWindow = new ListPopupWindow(this); mTocListPopupWindow.setAdapter(mTocListAdapter); mTocListPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); mTocListPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mTocListPopupWindow.setAnchorView(mCommonToolbar); mTocListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mTocListPopupWindow.dismiss(); currentChapter = position + 1; mTocListAdapter.setCurrentChapter(currentChapter); viewpager.setCurrentItem(position); } }); mTocListPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { toolbarAnimateHide(); } }); } private void setSpineReferenceTitle() { int srSize = mSpineReferences.size(); int trSize = mTocReferences.size(); for (int j = 0; j < srSize; j++) { String href = mSpineReferences.get(j).getResource().getHref(); for (int i = 0; i < trSize; i++) { if (mTocReferences.get(i).getResource().getHref().equalsIgnoreCase(href)) { mSpineReferences.get(j).getResource().setTitle(mTocReferences.get(i).getTitle()); break; } else { mSpineReferences.get(j).getResource().setTitle(""); } } } for (int i = 0; i < trSize; i++) { Resource resource = mTocReferences.get(i).getResource(); if (resource != null) { mChapterList.add(new BookMixAToc.mixToc.Chapters(resource.getTitle(), resource.getHref())); } } } @Override public String getPageHref(int position) { String pageHref = mTocReferences.get(position).getResource().getHref(); String opfpath = FileUtils.getPathOPF(FileUtils.getEpubFolderPath(mFileName)); if (FileUtils.checkOPFInRootDirectory(FileUtils.getEpubFolderPath(mFileName))) { pageHref = FileUtils.getEpubFolderPath(mFileName) + "/" + pageHref; } else { pageHref = FileUtils.getEpubFolderPath(mFileName) + "/" + opfpath + "/" + pageHref; } return pageHref; } @Override public void toggleToolBarVisible() { if (mIsActionBarVisible) { toolbarAnimateHide(); } else { toolbarAnimateShow(1); } } @Override public void hideToolBarIfVisible() { if (mIsActionBarVisible) { toolbarAnimateHide(); } } private void toolbarAnimateShow(final int verticalOffset) { showStatusBar(); mCommonToolbar.animate() .translationY(0) .setInterpolator(new LinearInterpolator()) .setDuration(180) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { toolbarSetElevation(verticalOffset == 0 ? 0 : 1); } }); new Handler().postDelayed(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { if (mIsActionBarVisible) { toolbarAnimateHide(); } } }); } }, 10000); mIsActionBarVisible = true; } private void toolbarAnimateHide() { if (mIsActionBarVisible) { mCommonToolbar.animate() .translationY(-mCommonToolbar.getHeight()) .setInterpolator(new LinearInterpolator()) .setDuration(180) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { toolbarSetElevation(0); hideStatusBar(); if (mTocListPopupWindow != null && mTocListPopupWindow.isShowing()) { mTocListPopupWindow.dismiss(); } } }); mIsActionBarVisible = false; } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void toolbarSetElevation(float elevation) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mCommonToolbar.setElevation(elevation); } } @OnClick(R.id.toolbar_menu) public void showMenu() { if (!mTocListPopupWindow.isShowing()) { mTocListPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); mTocListPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); mTocListPopupWindow.show(); mTocListPopupWindow.setSelection(currentChapter - 1); mTocListPopupWindow.getListView().setFastScrollEnabled(true); } } @Override public void onBackPressed() { if (mTocListPopupWindow != null && mTocListPopupWindow.isShowing()) { mTocListPopupWindow.dismiss(); } else { super.onBackPressed(); } } }