Java tutorial
/** * Copyright 2016 JustWayward Team * <p/> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.justwayward.reader.ui.activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.graphics.drawable.Drawable; import android.net.Uri; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatDelegate; import android.support.v7.widget.ListPopupWindow; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.FrameLayout; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.SeekBar; 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.BookSource; import com.justwayward.reader.bean.BookMixAToc; import com.justwayward.reader.bean.ChapterRead; import com.justwayward.reader.bean.Recommend; import com.justwayward.reader.bean.support.BookMark; import com.justwayward.reader.bean.support.DownloadMessage; import com.justwayward.reader.bean.support.DownloadProgress; import com.justwayward.reader.bean.support.DownloadQueue; import com.justwayward.reader.bean.support.ReadTheme; import com.justwayward.reader.component.AppComponent; import com.justwayward.reader.component.DaggerBookComponent; import com.justwayward.reader.manager.CacheManager; import com.justwayward.reader.manager.CollectionsManager; import com.justwayward.reader.manager.EventManager; import com.justwayward.reader.manager.SettingManager; import com.justwayward.reader.manager.ThemeManager; import com.justwayward.reader.service.DownloadBookService; import com.justwayward.reader.ui.adapter.BookMarkAdapter; import com.justwayward.reader.ui.adapter.TocListAdapter; import com.justwayward.reader.ui.contract.BookReadContract; import com.justwayward.reader.ui.easyadapter.ReadThemeAdapter; import com.justwayward.reader.ui.presenter.BookReadPresenter; import com.justwayward.reader.utils.FileUtils; import com.justwayward.reader.utils.FormatUtils; import com.justwayward.reader.utils.LogUtils; import com.justwayward.reader.utils.ScreenUtils; import com.justwayward.reader.utils.SharedPreferencesUtil; import com.justwayward.reader.utils.TTSPlayerUtils; import com.justwayward.reader.utils.ToastUtils; import com.justwayward.reader.view.readview.BaseReadView; import com.justwayward.reader.view.readview.OnReadStateChangeListener; import com.justwayward.reader.view.readview.OverlappedWidget; import com.justwayward.reader.view.readview.PageWidget; import com.sinovoice.hcicloudsdk.android.tts.player.TTSPlayer; import com.sinovoice.hcicloudsdk.common.tts.TtsConfig; import com.sinovoice.hcicloudsdk.player.TTSCommonPlayer; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import butterknife.Bind; import butterknife.OnClick; import rx.Observable; import rx.functions.Action1; /** * Created by lfh on 2016/9/18. */ public class ReadActivity extends BaseActivity implements BookReadContract.View { @Bind(R.id.ivBack) ImageView mIvBack; @Bind(R.id.tvBookReadReading) TextView mTvBookReadReading; @Bind(R.id.tvBookReadCommunity) TextView mTvBookReadCommunity; @Bind(R.id.tvBookReadIntroduce) TextView mTvBookReadChangeSource; @Bind(R.id.tvBookReadSource) TextView mTvBookReadSource; @Bind(R.id.flReadWidget) FrameLayout flReadWidget; @Bind(R.id.llBookReadTop) LinearLayout mLlBookReadTop; @Bind(R.id.tvBookReadTocTitle) TextView mTvBookReadTocTitle; @Bind(R.id.tvBookReadMode) TextView mTvBookReadMode; @Bind(R.id.tvBookReadSettings) TextView mTvBookReadSettings; @Bind(R.id.tvBookReadDownload) TextView mTvBookReadDownload; @Bind(R.id.tvBookReadToc) TextView mTvBookReadToc; @Bind(R.id.llBookReadBottom) LinearLayout mLlBookReadBottom; @Bind(R.id.rlBookReadRoot) RelativeLayout mRlBookReadRoot; @Bind(R.id.tvDownloadProgress) TextView mTvDownloadProgress; @Bind(R.id.rlReadAaSet) LinearLayout rlReadAaSet; @Bind(R.id.ivBrightnessMinus) ImageView ivBrightnessMinus; @Bind(R.id.seekbarLightness) SeekBar seekbarLightness; @Bind(R.id.ivBrightnessPlus) ImageView ivBrightnessPlus; @Bind(R.id.tvFontsizeMinus) TextView tvFontsizeMinus; @Bind(R.id.seekbarFontSize) SeekBar seekbarFontSize; @Bind(R.id.tvFontsizePlus) TextView tvFontsizePlus; @Bind(R.id.rlReadMark) LinearLayout rlReadMark; @Bind(R.id.tvAddMark) TextView tvAddMark; @Bind(R.id.lvMark) ListView lvMark; @Bind(R.id.cbVolume) CheckBox cbVolume; @Bind(R.id.cbAutoBrightness) CheckBox cbAutoBrightness; @Bind(R.id.gvTheme) GridView gvTheme; private View decodeView; @Inject BookReadPresenter mPresenter; private List<BookMixAToc.mixToc.Chapters> mChapterList = new ArrayList<>(); private ListPopupWindow mTocListPopupWindow; private TocListAdapter mTocListAdapter; private List<BookMark> mMarkList; private BookMarkAdapter mMarkAdapter; private int currentChapter = 1; /** * ? **/ private boolean startRead = false; /** * */ private TTSPlayer mTtsPlayer; private TtsConfig ttsConfig; private BaseReadView mPageWidget; private int curTheme = -1; private List<ReadTheme> themes; private ReadThemeAdapter gvAdapter; private Receiver receiver = new Receiver(); private IntentFilter intentFilter = new IntentFilter(); private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); public static final String INTENT_BEAN = "recommendBooksBean"; public static final String INTENT_SD = "isFromSD"; private Recommend.RecommendBooks recommendBooks; private String bookId; private boolean isAutoLightness = false; // ?? private boolean isFromSD = false; //?? public static void startActivity(Context context, Recommend.RecommendBooks recommendBooks) { startActivity(context, recommendBooks, false); } public static void startActivity(Context context, Recommend.RecommendBooks recommendBooks, boolean isFromSD) { context.startActivity(new Intent(context, ReadActivity.class).putExtra(INTENT_BEAN, recommendBooks) .putExtra(INTENT_SD, isFromSD)); } @Override public int getLayoutId() { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); statusBarColor = ContextCompat.getColor(this, R.color.reader_menu_bg_color); return R.layout.activity_read; } @Override protected void setupActivityComponent(AppComponent appComponent) { DaggerBookComponent.builder().appComponent(appComponent).build().inject(this); } @Override public void initToolBar() { } @Override public void initDatas() { recommendBooks = (Recommend.RecommendBooks) getIntent().getSerializableExtra(INTENT_BEAN); bookId = recommendBooks._id; isFromSD = getIntent().getBooleanExtra(INTENT_SD, false); if (Intent.ACTION_VIEW.equals(getIntent().getAction())) { String filePath = Uri.decode(getIntent().getDataString().replace("file://", "")); String fileName; if (filePath.lastIndexOf(".") > filePath.lastIndexOf("/")) { fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.lastIndexOf(".")); } else { fileName = filePath.substring(filePath.lastIndexOf("/") + 1); } CollectionsManager.getInstance().remove(fileName); // File desc = FileUtils.createWifiTranfesFile(fileName); FileUtils.fileChannelCopy(new File(filePath), desc); // recommendBooks = new Recommend.RecommendBooks(); recommendBooks.isFromSD = true; recommendBooks._id = fileName; recommendBooks.title = fileName; isFromSD = true; } EventBus.getDefault().register(this); showDialog(); mTvBookReadTocTitle.setText(recommendBooks.title); mTtsPlayer = TTSPlayerUtils.getTTSPlayer(); ttsConfig = TTSPlayerUtils.getTtsConfig(); intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); intentFilter.addAction(Intent.ACTION_TIME_TICK); CollectionsManager.getInstance().setRecentReadingTime(bookId); Observable.timer(1000, TimeUnit.MILLISECONDS).subscribe(new Action1<Long>() { @Override public void call(Long aLong) { //1 EventManager.refreshCollectionList(); } }); } @Override public void configViews() { hideStatusBar(); decodeView = getWindow().getDecorView(); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mLlBookReadTop.getLayoutParams(); params.topMargin = ScreenUtils.getStatusBarHeight(this) - 2; mLlBookReadTop.setLayoutParams(params); initTocList(); initAASet(); initPagerWidget(); mPresenter.attachView(this); // ? if (isFromSD) { BookMixAToc.mixToc.Chapters chapters = new BookMixAToc.mixToc.Chapters(); chapters.title = recommendBooks.title; mChapterList.add(chapters); showChapterRead(null, currentChapter); //????? gone(mTvBookReadCommunity, mTvBookReadChangeSource, mTvBookReadDownload); return; } mPresenter.getBookMixAToc(bookId, "chapters"); } private void initTocList() { mTocListAdapter = new TocListAdapter(this, mChapterList, bookId, currentChapter); mTocListPopupWindow = new ListPopupWindow(this); mTocListPopupWindow.setAdapter(mTocListAdapter); mTocListPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); mTocListPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mTocListPopupWindow.setAnchorView(mLlBookReadTop); 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); startRead = false; showDialog(); readCurrentChapter(); hideReadBar(); } }); mTocListPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { gone(mTvBookReadTocTitle); visible(mTvBookReadReading, mTvBookReadCommunity, mTvBookReadChangeSource); } }); } private void initAASet() { curTheme = SettingManager.getInstance().getReadTheme(); ThemeManager.setReaderTheme(curTheme, mRlBookReadRoot); seekbarFontSize.setMax(10); //int fontSizePx = SettingManager.getInstance().getReadFontSize(bookId); int fontSizePx = SettingManager.getInstance().getReadFontSize(); int progress = (int) ((ScreenUtils.pxToDpInt(fontSizePx) - 12) / 1.7f); seekbarFontSize.setProgress(progress); seekbarFontSize.setOnSeekBarChangeListener(new SeekBarChangeListener()); seekbarLightness.setMax(100); seekbarLightness.setOnSeekBarChangeListener(new SeekBarChangeListener()); seekbarLightness.setProgress(SettingManager.getInstance().getReadBrightness()); isAutoLightness = ScreenUtils.isAutoBrightness(this); if (SettingManager.getInstance().isAutoBrightness()) { startAutoLightness(); } else { stopAutoLightness(); } cbVolume.setChecked(SettingManager.getInstance().isVolumeFlipEnable()); cbVolume.setOnCheckedChangeListener(new ChechBoxChangeListener()); cbAutoBrightness.setChecked(SettingManager.getInstance().isAutoBrightness()); cbAutoBrightness.setOnCheckedChangeListener(new ChechBoxChangeListener()); gvAdapter = new ReadThemeAdapter(this, (themes = ThemeManager.getReaderThemeData(curTheme)), curTheme); gvTheme.setAdapter(gvAdapter); gvTheme.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (position < themes.size() - 1) { changedMode(false, position); } else { changedMode(true, position); } } }); } private void initPagerWidget() { if (SharedPreferencesUtil.getInstance().getInt(Constant.FLIP_STYLE, 0) == 0) { mPageWidget = new PageWidget(this, bookId, mChapterList, new ReadListener()); } else { mPageWidget = new OverlappedWidget(this, bookId, mChapterList, new ReadListener()); } registerReceiver(receiver, intentFilter); if (SharedPreferencesUtil.getInstance().getBoolean(Constant.ISNIGHT, false)) { mPageWidget.setTextColor(ContextCompat.getColor(this, R.color.chapter_content_night), ContextCompat.getColor(this, R.color.chapter_title_night)); } flReadWidget.removeAllViews(); flReadWidget.addView(mPageWidget); } /** * * * @param list */ @Override public void showBookToc(List<BookMixAToc.mixToc.Chapters> list) { mChapterList.clear(); mChapterList.addAll(list); readCurrentChapter(); } /** * ??? */ public void readCurrentChapter() { if (CacheManager.getInstance().getChapterFile(bookId, currentChapter) != null) { showChapterRead(null, currentChapter); } else { mPresenter.getChapterRead(mChapterList.get(currentChapter - 1).link, currentChapter); } } @Override public synchronized void showChapterRead(ChapterRead.Chapter data, int chapter) { // if (data != null) { CacheManager.getInstance().saveChapterFile(bookId, chapter, data); } if (!startRead) { startRead = true; currentChapter = chapter; if (!mPageWidget.isPrepared) { mPageWidget.init(curTheme); } else { mPageWidget.jumpToChapter(currentChapter); } hideDialog(); } } @Override public void netError(int chapter) { hideDialog();//dialog? if (Math.abs(chapter - currentChapter) <= 1) { ToastUtils.showToast(R.string.net_error); } } @Override public void showError() { hideDialog(); } @Override public void complete() { hideDialog(); } private synchronized void hideReadBar() { gone(mTvDownloadProgress, mLlBookReadBottom, mLlBookReadTop, rlReadAaSet, rlReadMark); hideStatusBar(); decodeView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); } private synchronized void showReadBar() { // ? visible(mLlBookReadBottom, mLlBookReadTop); showStatusBar(); decodeView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } private synchronized void toggleReadBar() { // ?? ??/ ? if (isVisible(mLlBookReadTop)) { hideReadBar(); } else { showReadBar(); } } /***************Title Bar*****************/ @OnClick(R.id.ivBack) public void onClickBack() { if (mTocListPopupWindow.isShowing()) { mTocListPopupWindow.dismiss(); } else { finish(); } } @OnClick(R.id.tvBookReadReading) public void readBook() { gone(rlReadAaSet, rlReadMark); ToastUtils.showToast("?..."); } @OnClick(R.id.tvBookReadCommunity) public void onClickCommunity() { gone(rlReadAaSet, rlReadMark); BookDetailCommunityActivity.startActivity(this, bookId, mTvBookReadTocTitle.getText().toString(), 0); } @OnClick(R.id.tvBookReadIntroduce) public void onClickIntroduce() { gone(rlReadAaSet, rlReadMark); BookDetailActivity.startActivity(mContext, bookId); } @OnClick(R.id.tvBookReadSource) public void onClickSource() { BookSourceActivity.start(this, bookId, 1); } /***************Bottom Bar*****************/ @OnClick(R.id.tvBookReadMode) public void onClickChangeMode() { // /?? gone(rlReadAaSet, rlReadMark); boolean isNight = !SharedPreferencesUtil.getInstance().getBoolean(Constant.ISNIGHT, false); changedMode(isNight, -1); } private void changedMode(boolean isNight, int position) { SharedPreferencesUtil.getInstance().putBoolean(Constant.ISNIGHT, isNight); AppCompatDelegate .setDefaultNightMode(isNight ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO); if (position >= 0) { curTheme = position; } else { curTheme = SettingManager.getInstance().getReadTheme(); } gvAdapter.select(curTheme); mPageWidget.setTheme(isNight ? ThemeManager.NIGHT : curTheme); mPageWidget.setTextColor( ContextCompat.getColor(mContext, isNight ? R.color.chapter_content_night : R.color.chapter_content_day), ContextCompat.getColor(mContext, isNight ? R.color.chapter_title_night : R.color.chapter_title_day)); mTvBookReadMode.setText(getString(isNight ? R.string.book_read_mode_day_manual_setting : R.string.book_read_mode_night_manual_setting)); Drawable drawable = ContextCompat.getDrawable(this, isNight ? R.drawable.ic_menu_mode_day_manual : R.drawable.ic_menu_mode_night_manual); drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); mTvBookReadMode.setCompoundDrawables(null, drawable, null, null); ThemeManager.setReaderTheme(curTheme, mRlBookReadRoot); } @OnClick(R.id.tvBookReadSettings) public void setting() { if (isVisible(mLlBookReadBottom)) { if (isVisible(rlReadAaSet)) { gone(rlReadAaSet); } else { visible(rlReadAaSet); gone(rlReadMark); } } } @OnClick(R.id.tvBookReadDownload) public void downloadBook() { gone(rlReadAaSet); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("").setItems( new String[] { "????", "??", "" }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: DownloadBookService.post(new DownloadQueue(bookId, mChapterList, currentChapter + 1, currentChapter + 50)); break; case 1: DownloadBookService.post(new DownloadQueue(bookId, mChapterList, currentChapter + 1, mChapterList.size())); break; case 2: DownloadBookService .post(new DownloadQueue(bookId, mChapterList, 1, mChapterList.size())); break; default: break; } } }); builder.show(); } @OnClick(R.id.tvBookMark) public void onClickMark() { if (isVisible(mLlBookReadBottom)) { if (isVisible(rlReadMark)) { gone(rlReadMark); } else { gone(rlReadAaSet); updateMark(); visible(rlReadMark); } } } @OnClick(R.id.tvBookReadToc) public void onClickToc() { gone(rlReadAaSet, rlReadMark); if (!mTocListPopupWindow.isShowing()) { visible(mTvBookReadTocTitle); gone(mTvBookReadReading, mTvBookReadCommunity, mTvBookReadChangeSource); mTocListPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); mTocListPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); mTocListPopupWindow.show(); mTocListPopupWindow.setSelection(currentChapter - 1); mTocListPopupWindow.getListView().setFastScrollEnabled(true); } } /***************Setting Menu*****************/ @OnClick(R.id.ivBrightnessMinus) public void brightnessMinus() { int curBrightness = SettingManager.getInstance().getReadBrightness(); if (curBrightness > 2 && !SettingManager.getInstance().isAutoBrightness()) { seekbarLightness.setProgress((curBrightness = curBrightness - 2)); ScreenUtils.setScreenBrightness(curBrightness, ReadActivity.this); SettingManager.getInstance().saveReadBrightness(curBrightness); } } @OnClick(R.id.ivBrightnessPlus) public void brightnessPlus() { int curBrightness = SettingManager.getInstance().getReadBrightness(); if (curBrightness < 99 && !SettingManager.getInstance().isAutoBrightness()) { seekbarLightness.setProgress((curBrightness = curBrightness + 2)); ScreenUtils.setScreenBrightness(curBrightness, ReadActivity.this); SettingManager.getInstance().saveReadBrightness(curBrightness); } } @OnClick(R.id.tvFontsizeMinus) public void fontsizeMinus() { calcFontSize(seekbarFontSize.getProgress() - 1); } @OnClick(R.id.tvFontsizePlus) public void fontsizePlus() { calcFontSize(seekbarFontSize.getProgress() + 1); } @OnClick(R.id.tvClear) public void clearBookMark() { SettingManager.getInstance().clearBookMarks(bookId); updateMark(); } /***************Book Mark*****************/ @OnClick(R.id.tvAddMark) public void addBookMark() { int[] readPos = mPageWidget.getReadPos(); BookMark mark = new BookMark(); mark.chapter = readPos[0]; mark.startPos = readPos[1]; mark.endPos = readPos[2]; if (mark.chapter >= 1 && mark.chapter <= mChapterList.size()) { mark.title = mChapterList.get(mark.chapter - 1).title; } mark.desc = mPageWidget.getHeadLine(); if (SettingManager.getInstance().addBookMark(bookId, mark)) { ToastUtils.showSingleToast("?"); updateMark(); } else { ToastUtils.showSingleToast(""); } } private void updateMark() { if (mMarkAdapter == null) { mMarkAdapter = new BookMarkAdapter(this, new ArrayList<BookMark>()); lvMark.setAdapter(mMarkAdapter); lvMark.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { BookMark mark = mMarkAdapter.getData(position); if (mark != null) { mPageWidget.setPosition(new int[] { mark.chapter, mark.startPos, mark.endPos }); hideReadBar(); } else { ToastUtils.showSingleToast(""); } } }); } mMarkAdapter.clear(); mMarkList = SettingManager.getInstance().getBookMarks(bookId); if (mMarkList != null && mMarkList.size() > 0) { Collections.reverse(mMarkList); mMarkAdapter.addAll(mMarkList); } } /***************Event*****************/ @Subscribe(threadMode = ThreadMode.MAIN) public void showDownProgress(DownloadProgress progress) { if (bookId.equals(progress.bookId)) { if (isVisible(mLlBookReadBottom)) { // ?? visible(mTvDownloadProgress); // ??? mTvDownloadProgress.setText(progress.message); } else { gone(mTvDownloadProgress); } } } @Subscribe(threadMode = ThreadMode.MAIN) public void downloadMessage(final DownloadMessage msg) { if (isVisible(mLlBookReadBottom)) { // ?? if (bookId.equals(msg.bookId)) { visible(mTvDownloadProgress); mTvDownloadProgress.setText(msg.message); if (msg.isComplete) { mTvDownloadProgress.postDelayed(new Runnable() { @Override public void run() { gone(mTvDownloadProgress); } }, 2500); } } } } /** * ? * * @param bean */ private void showJoinBookShelfDialog(final Recommend.RecommendBooks bean) { new AlertDialog.Builder(mContext).setTitle(getString(R.string.book_read_add_book)) .setMessage(getString(R.string.book_read_would_you_like_to_add_this_to_the_book_shelf)) .setPositiveButton(getString(R.string.book_read_join_the_book_shelf), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); bean.recentReadingTime = FormatUtils .getCurrentTimeString(FormatUtils.FORMAT_DATE_TIME); CollectionsManager.getInstance().add(bean); finish(); } }) .setNegativeButton(getString(R.string.book_read_not), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); finish(); } }).create().show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { BookSource bookSource = (BookSource) data.getSerializableExtra("source"); bookId = bookSource._id; } //mPresenter.getBookMixAToc(bookId, "chapters"); break; default: break; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: if (mTocListPopupWindow != null && mTocListPopupWindow.isShowing()) { mTocListPopupWindow.dismiss(); gone(mTvBookReadTocTitle); visible(mTvBookReadReading, mTvBookReadCommunity, mTvBookReadChangeSource); return true; } else if (isVisible(rlReadAaSet)) { gone(rlReadAaSet); return true; } else if (isVisible(mLlBookReadBottom)) { hideReadBar(); return true; } else if (!CollectionsManager.getInstance().isCollected(bookId)) { showJoinBookShelfDialog(recommendBooks); return true; } break; case KeyEvent.KEYCODE_MENU: toggleReadBar(); return true; case KeyEvent.KEYCODE_VOLUME_DOWN: if (SettingManager.getInstance().isVolumeFlipEnable()) { return true; } break; case KeyEvent.KEYCODE_VOLUME_UP: if (SettingManager.getInstance().isVolumeFlipEnable()) { return true; } break; default: break; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { if (SettingManager.getInstance().isVolumeFlipEnable()) { mPageWidget.nextPage(); return true;// } } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { if (SettingManager.getInstance().isVolumeFlipEnable()) { mPageWidget.prePage(); return true; } } return super.onKeyUp(keyCode, event); } @Override protected void onDestroy() { super.onDestroy(); if (mTtsPlayer.getPlayerState() == TTSCommonPlayer.PLAYER_STATE_PLAYING) mTtsPlayer.stop(); EventManager.refreshCollectionIcon(); EventManager.refreshCollectionList(); EventBus.getDefault().unregister(this); try { unregisterReceiver(receiver); } catch (Exception e) { LogUtils.e("Receiver not registered"); } if (isAutoLightness) { ScreenUtils.startAutoBrightness(ReadActivity.this); } else { ScreenUtils.stopAutoBrightness(ReadActivity.this); } if (mPresenter != null) { mPresenter.detachView(); } } private class ReadListener implements OnReadStateChangeListener { @Override public void onChapterChanged(int chapter) { LogUtils.i("onChapterChanged:" + chapter); currentChapter = chapter; mTocListAdapter.setCurrentChapter(currentChapter); // ? ? for (int i = chapter - 1; i <= chapter + 3 && i <= mChapterList.size(); i++) { if (i > 0 && i != chapter && CacheManager.getInstance().getChapterFile(bookId, i) == null) { mPresenter.getChapterRead(mChapterList.get(i - 1).link, i); } } } @Override public void onPageChanged(int chapter, int page) { LogUtils.i("onPageChanged:" + chapter + "-" + page); } @Override public void onLoadChapterFailure(int chapter) { LogUtils.i("onLoadChapterFailure:" + chapter); startRead = false; if (CacheManager.getInstance().getChapterFile(bookId, chapter) == null) mPresenter.getChapterRead(mChapterList.get(chapter - 1).link, chapter); } @Override public void onCenterClick() { LogUtils.i("onCenterClick"); toggleReadBar(); } @Override public void onFlip() { hideReadBar(); } } private class SeekBarChangeListener implements SeekBar.OnSeekBarChangeListener { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (seekBar.getId() == seekbarFontSize.getId() && fromUser) { calcFontSize(progress); } else if (seekBar.getId() == seekbarLightness.getId() && fromUser && !SettingManager.getInstance().isAutoBrightness()) { // ?? ??? ScreenUtils.setScreenBrightness(progress, ReadActivity.this); SettingManager.getInstance().saveReadBrightness(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } } private class ChechBoxChangeListener implements CompoundButton.OnCheckedChangeListener { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView.getId() == cbVolume.getId()) { SettingManager.getInstance().saveVolumeFlipEnable(isChecked); } else if (buttonView.getId() == cbAutoBrightness.getId()) { if (isChecked) { startAutoLightness(); } else { stopAutoLightness(); } } } } class Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (mPageWidget != null) { if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { int level = intent.getIntExtra("level", 0); mPageWidget.setBattery(100 - level); } else if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) { mPageWidget.setTime(sdf.format(new Date())); } } } } private void startAutoLightness() { SettingManager.getInstance().saveAutoBrightness(true); ScreenUtils.startAutoBrightness(ReadActivity.this); seekbarLightness.setEnabled(false); } private void stopAutoLightness() { SettingManager.getInstance().saveAutoBrightness(false); ScreenUtils.stopAutoBrightness(ReadActivity.this); int value = SettingManager.getInstance().getReadBrightness(); seekbarLightness.setProgress(value); ScreenUtils.setScreenBrightness(value, ReadActivity.this); seekbarLightness.setEnabled(true); } private void calcFontSize(int progress) { // progress range 1 - 10 if (progress >= 0 && progress <= 10) { seekbarFontSize.setProgress(progress); mPageWidget.setFontSize(ScreenUtils.dpToPxInt(12 + 1.7f * progress)); } } }