2 * Copyright (C) 2016 Pedro Paulo de Amorim
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
16 package com.folioreader.ui.folio.activity;
\r
18 import android.Manifest;
\r
19 import android.annotation.TargetApi;
\r
20 import android.content.Context;
\r
21 import android.content.Intent;
\r
22 import android.content.pm.PackageManager;
\r
23 import android.os.Build;
\r
24 import android.os.Bundle;
\r
25 import android.support.annotation.NonNull;
\r
26 import android.support.v4.app.ActivityCompat;
\r
27 import android.support.v4.content.ContextCompat;
\r
28 import android.support.v7.app.AppCompatActivity;
\r
29 import android.support.v7.widget.Toolbar;
\r
30 import android.text.Html;
\r
31 import android.util.Log;
\r
32 import android.view.View;
\r
33 import android.view.animation.Animation;
\r
34 import android.view.animation.AnimationUtils;
\r
35 import android.widget.ImageButton;
\r
36 import android.widget.RelativeLayout;
\r
37 import android.widget.TextView;
\r
38 import android.widget.Toast;
\r
40 import com.folioreader.Config;
\r
41 import com.folioreader.Constants;
\r
42 import com.folioreader.R;
\r
43 import com.folioreader.model.HighlightImpl;
\r
44 import com.folioreader.model.event.AnchorIdEvent;
\r
45 import com.folioreader.model.event.BusOwner;
\r
46 import com.folioreader.model.event.MediaOverlayHighlightStyleEvent;
\r
47 import com.folioreader.model.event.MediaOverlayPlayPauseEvent;
\r
48 import com.folioreader.model.event.MediaOverlaySpeedEvent;
\r
49 import com.folioreader.model.event.WebViewPosition;
\r
50 import com.folioreader.ui.folio.adapter.FolioPageFragmentAdapter;
\r
51 import com.folioreader.ui.folio.fragment.FolioPageFragment;
\r
52 import com.folioreader.ui.folio.presenter.MainMvpView;
\r
53 import com.folioreader.ui.folio.presenter.MainPresenter;
\r
54 import com.folioreader.util.AppUtil;
\r
55 import com.folioreader.util.FileUtil;
\r
56 import com.folioreader.util.FolioReader;
\r
57 import com.folioreader.util.UiUtil;
\r
58 import com.folioreader.view.ConfigBottomSheetDialogFragment;
\r
59 import com.folioreader.view.DirectionalViewpager;
\r
60 import com.folioreader.view.ObservableWebView;
\r
61 import com.folioreader.view.StyleableTextView;
\r
62 import com.squareup.otto.Bus;
\r
63 import com.squareup.otto.ThreadEnforcer;
\r
65 import org.readium.r2_streamer.model.container.Container;
\r
66 import org.readium.r2_streamer.model.container.EpubContainer;
\r
67 import org.readium.r2_streamer.model.publication.EpubPublication;
\r
68 import org.readium.r2_streamer.model.publication.link.Link;
\r
69 import org.readium.r2_streamer.server.EpubServer;
\r
70 import org.readium.r2_streamer.server.EpubServerSingleton;
\r
72 import java.io.IOException;
\r
73 import java.util.ArrayList;
\r
74 import java.util.List;
\r
76 import static com.folioreader.Constants.CHAPTER_SELECTED;
\r
77 import static com.folioreader.Constants.HIGHLIGHT_SELECTED;
\r
78 import static com.folioreader.Constants.SELECTED_CHAPTER_POSITION;
\r
79 import static com.folioreader.Constants.TYPE;
\r
81 public class FolioActivity
\r
82 extends AppCompatActivity
\r
83 implements FolioPageFragment.FolioPageFragmentCallback,
\r
84 ObservableWebView.ToolBarListener,
\r
85 ConfigBottomSheetDialogFragment.ConfigDialogCallback,
\r
89 private static final String TAG = "FolioActivity";
\r
91 public static final String INTENT_EPUB_SOURCE_PATH = "com.folioreader.epub_asset_path";
\r
92 public static final String INTENT_EPUB_SOURCE_TYPE = "epub_source_type";
\r
93 public static final String INTENT_HIGHLIGHTS_LIST = "highlight_list";
\r
94 public static final String PARAM_FILE_NAME = "PARAM_FILE_NAME";
\r
95 public static final String PARAM_CURRENT_CHAPTER = "PARAM_CURRENT_CHAPTER";
\r
96 public static final String PARAM_CHAPTERS_COUNT = "PARAM_CHAPTERS_COUNT";
\r
98 public enum EpubSourceType {
\r
104 private boolean isOpen = true;
\r
106 public static final int ACTION_CONTENT_HIGHLIGHT = 77;
\r
107 private String bookFileName;
\r
108 private static final String HIGHLIGHT_ITEM = "highlight_item";
\r
110 private final Bus BUS = new Bus(ThreadEnforcer.MAIN);
\r
112 public Bus getBus() {
\r
116 public boolean mIsActionBarVisible;
\r
117 private DirectionalViewpager mFolioPageViewPager;
\r
118 private Toolbar mToolbar;
\r
120 private int mChapterPosition;
\r
121 private FolioPageFragmentAdapter mFolioPageFragmentAdapter;
\r
122 private int mWebViewScrollPosition;
\r
123 private ConfigBottomSheetDialogFragment mConfigBottomSheetDialogFragment;
\r
124 private TextView title;
\r
126 private List<Link> mSpineReferenceList = new ArrayList<>();
\r
127 private EpubServer mEpubServer;
\r
129 private Animation slide_down;
\r
130 private Animation slide_up;
\r
131 private boolean mIsNightMode;
\r
132 private Config mConfig;
\r
133 private String mBookId;
\r
134 private String mEpubFilePath;
\r
135 private EpubSourceType mEpubSourceType;
\r
136 int mEpubRawId = 0;
\r
139 protected void onCreate(Bundle savedInstanceState) {
\r
140 super.onCreate(savedInstanceState);
\r
141 setContentView(R.layout.folio_activity);
\r
143 mBookId = getIntent().getStringExtra(FolioReader.INTENT_BOOK_ID);
\r
144 mEpubSourceType = (EpubSourceType)
\r
145 getIntent().getExtras().getSerializable(FolioActivity.INTENT_EPUB_SOURCE_TYPE);
\r
146 if (mEpubSourceType.equals(EpubSourceType.RAW)) {
\r
147 mEpubRawId = getIntent().getExtras().getInt(FolioActivity.INTENT_EPUB_SOURCE_PATH);
\r
149 mEpubFilePath = getIntent().getExtras()
\r
150 .getString(FolioActivity.INTENT_EPUB_SOURCE_PATH);
\r
155 if (!mConfig.isShowTts()) {
\r
156 findViewById(R.id.btn_speaker).setVisibility(View.GONE);
\r
159 title = (TextView) findViewById(R.id.lbl_center);
\r
160 slide_down = AnimationUtils.loadAnimation(getApplicationContext(),
\r
161 R.anim.slide_down);
\r
162 slide_up = AnimationUtils.loadAnimation(getApplicationContext(),
\r
165 mToolbar = (Toolbar) findViewById(R.id.toolbar);
\r
167 BUS.register(this);
\r
170 if (ContextCompat.checkSelfPermission(FolioActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
\r
171 ActivityCompat.requestPermissions(FolioActivity.this, Constants.getWriteExternalStoragePerms(), Constants.WRITE_EXTERNAL_STORAGE_REQUEST);
\r
178 findViewById(R.id.btn_drawer).setOnClickListener(new View.OnClickListener() {
\r
180 public void onClick(View v) {
\r
181 Intent intent = new Intent(FolioActivity.this, ContentHighlightActivity.class);
\r
182 intent.putExtra(CHAPTER_SELECTED, mSpineReferenceList.get(mChapterPosition).href);
\r
183 intent.putExtra(FolioReader.INTENT_BOOK_ID, mBookId);
\r
184 intent.putExtra(Constants.BOOK_TITLE, bookFileName);
\r
185 startActivityForResult(intent, ACTION_CONTENT_HIGHLIGHT);
\r
186 overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up);
\r
190 // speaker = (ImageView) findViewById(R.id.btn_speaker);
\r
191 findViewById(R.id.btn_speaker).setOnClickListener(new View.OnClickListener() {
\r
193 public void onClick(View v) {
\r
195 audioContainer.startAnimation(slide_up);
\r
196 audioContainer.setVisibility(View.VISIBLE);
\r
197 shade.setVisibility(View.VISIBLE);
\r
199 audioContainer.startAnimation(slide_down);
\r
200 audioContainer.setVisibility(View.INVISIBLE);
\r
201 shade.setVisibility(View.GONE);
\r
207 mIsNightMode = mConfig.isNightMode();
\r
208 if (mIsNightMode) {
\r
209 audioContainer.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.night));
\r
211 ToolbarUtils.updateToolbarColors(this, mToolbar, mConfig, mIsNightMode);
\r
214 private void initBook(String mEpubFileName, int mEpubRawId, String mEpubFilePath, EpubSourceType mEpubSourceType) {
\r
216 int portNumber = getIntent().getIntExtra(Config.INTENT_PORT, Constants.PORT_NUMBER);
\r
217 mEpubServer = EpubServerSingleton.getEpubServerInstance(portNumber);
\r
218 mEpubServer.start();
\r
219 String path = FileUtil.saveEpubFileAndLoadLazyBook(FolioActivity.this, mEpubSourceType, mEpubFilePath,
\r
220 mEpubRawId, mEpubFileName);
\r
223 String urlString = Constants.LOCALHOST + bookFileName + "/manifest";
\r
224 new MainPresenter(this).parseManifest(urlString);
\r
226 } catch (IOException e) {
\r
227 Log.e(TAG, "initBook failed", e);
\r
231 private void addEpub(String path) throws IOException {
\r
232 Container epubContainer = new EpubContainer(path);
\r
233 mEpubServer.addEpub(epubContainer, "/" + bookFileName);
\r
237 private void getEpubResource() {
\r
241 protected void onPostCreate(Bundle savedInstanceState) {
\r
242 super.onPostCreate(savedInstanceState);
\r
243 configDrawerLayoutButtons();
\r
247 public void onBackPressed() {
\r
249 Intent data = new Intent();
\r
250 data.putExtra(PARAM_FILE_NAME, bookFileName);
\r
251 data.putExtra(PARAM_CURRENT_CHAPTER,mFolioPageViewPager.getCurrentItem() + 1);
\r
252 data.putExtra(PARAM_CHAPTERS_COUNT, mFolioPageViewPager.getExpectedAdapterCount());
\r
253 setResult(RESULT_OK, data);
\r
258 public void onOrientationChange(int orentation) {
\r
259 if (orentation == 0) {
\r
260 mFolioPageViewPager.setDirection(DirectionalViewpager.Direction.VERTICAL);
\r
261 mFolioPageFragmentAdapter =
\r
262 new FolioPageFragmentAdapter(getSupportFragmentManager(),
\r
263 mSpineReferenceList, bookFileName, mBookId);
\r
264 mFolioPageViewPager.setAdapter(mFolioPageFragmentAdapter);
\r
265 mFolioPageViewPager.setOffscreenPageLimit(1);
\r
266 mFolioPageViewPager.setCurrentItem(mChapterPosition);
\r
269 mFolioPageViewPager.setDirection(DirectionalViewpager.Direction.HORIZONTAL);
\r
270 mFolioPageFragmentAdapter =
\r
271 new FolioPageFragmentAdapter(getSupportFragmentManager(),
\r
272 mSpineReferenceList, bookFileName, mBookId);
\r
273 mFolioPageViewPager.setAdapter(mFolioPageFragmentAdapter);
\r
274 mFolioPageViewPager.setCurrentItem(mChapterPosition);
\r
278 private void configFolio() {
\r
279 mFolioPageViewPager = (DirectionalViewpager) findViewById(R.id.folioPageViewPager);
\r
280 mFolioPageViewPager.setOnPageChangeListener(new DirectionalViewpager.OnPageChangeListener() {
\r
282 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
\r
286 public void onPageSelected(int position) {
\r
287 BUS.post(new MediaOverlayPlayPauseEvent(mSpineReferenceList.get(mChapterPosition).href, false, true));
\r
288 mPlayPauseBtn.setImageDrawable(ContextCompat.getDrawable(FolioActivity.this, R.drawable.play_icon));
\r
289 mChapterPosition = position;
\r
293 public void onPageScrollStateChanged(int state) {
\r
294 // if (state == DirectionalViewpager.SCROLL_STATE_IDLE) {
\r
295 // title.setText(mSpineReferenceList.get(mChapterPosition).bookTitle);
\r
300 if (mSpineReferenceList != null) {
\r
301 mFolioPageFragmentAdapter = new FolioPageFragmentAdapter(getSupportFragmentManager(), mSpineReferenceList, bookFileName, mBookId);
\r
302 mFolioPageViewPager.setAdapter(mFolioPageFragmentAdapter);
\r
305 if (AppUtil.checkPreviousBookStateExist(FolioActivity.this, bookFileName)) {
\r
306 mFolioPageViewPager.setCurrentItem(AppUtil.getPreviousBookStatePosition(FolioActivity.this, bookFileName));
\r
310 private void configDrawerLayoutButtons() {
\r
311 findViewById(R.id.btn_close).setOnClickListener(new View.OnClickListener() {
\r
313 public void onClick(View v) {
\r
318 findViewById(R.id.btn_config).setOnClickListener(new View.OnClickListener() {
\r
320 public void onClick(View v) {
\r
321 mConfigBottomSheetDialogFragment = new ConfigBottomSheetDialogFragment();
\r
322 mConfigBottomSheetDialogFragment.show(getSupportFragmentManager(), mConfigBottomSheetDialogFragment.getTag());
\r
327 private void saveBookState() {
\r
328 if (mSpineReferenceList.size() > 0) {
\r
329 AppUtil.saveBookState(FolioActivity.this, bookFileName, mFolioPageViewPager.getCurrentItem(), mFolioPageViewPager
\r
330 .getExpectedAdapterCount(), mWebViewScrollPosition);
\r
335 public void hideOrshowToolBar() {
\r
336 // if (mIsActionBarVisible) {
\r
337 // toolbarAnimateHide();
\r
339 // toolbarAnimateShow();
\r
344 public void hideToolBarIfVisible() {
\r
345 // if (mIsActionBarVisible) {
\r
346 // toolbarAnimateHide();
\r
351 public void setPagerToPosition(String href) {
\r
355 public void setLastWebViewPosition(int position) {
\r
356 this.mWebViewScrollPosition = position;
\r
360 public void goToChapter(String href) {
\r
361 String spineHref = href.substring(href.indexOf(bookFileName + "/") + bookFileName.length() + 1);
\r
362 String anchorHref = new String(spineHref);
\r
363 if (href.contains("#")) {
\r
364 spineHref = spineHref.substring(0, spineHref.indexOf("#"));
\r
366 for (Link spine : mSpineReferenceList) {
\r
367 if (spine.href.contains(spineHref)) {
\r
368 mChapterPosition = mSpineReferenceList.indexOf(spine);
\r
369 mFolioPageViewPager.setCurrentItem(mChapterPosition);
\r
370 title.setText(spine.getChapterTitle());
\r
371 BUS.post(new AnchorIdEvent(anchorHref));
\r
377 private void toolbarAnimateShow() {
\r
378 // if (!mIsActionBarVisible) {
\r
379 // mToolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();
\r
380 // mIsActionBarVisible = true;
\r
384 private void toolbarAnimateHide() {
\r
385 // mIsActionBarVisible = false;
\r
386 // mToolbar.animate().translationY(-mToolbar.getHeight()).setInterpolator(new AccelerateInterpolator(2)).start();
\r
389 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
\r
390 private void toolbarSetElevation(float elevation) {
\r
391 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
\r
392 mToolbar.setElevation(elevation);
\r
396 public HighlightImpl setCurrentPagerPostion(HighlightImpl highlightImpl) {
\r
397 // highlight.setCurrentPagerPostion(mFolioPageViewPager.getCurrentItem());
\r
398 return highlightImpl;
\r
402 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
\r
403 if (requestCode == ACTION_CONTENT_HIGHLIGHT && resultCode == RESULT_OK && data.hasExtra(TYPE)) {
\r
405 String type = data.getStringExtra(TYPE);
\r
406 if (type.equals(CHAPTER_SELECTED)) {
\r
407 String selectedChapterHref = data.getStringExtra(SELECTED_CHAPTER_POSITION);
\r
408 for (Link spine : mSpineReferenceList) {
\r
409 if (selectedChapterHref.contains(spine.href)) {
\r
410 mChapterPosition = mSpineReferenceList.indexOf(spine);
\r
411 mFolioPageViewPager.setCurrentItem(mChapterPosition);
\r
412 title.setText(data.getStringExtra(Constants.BOOK_TITLE));
\r
413 BUS.post(new AnchorIdEvent(selectedChapterHref));
\r
417 } else if (type.equals(HIGHLIGHT_SELECTED)) {
\r
418 HighlightImpl highlightImpl = data.getParcelableExtra(HIGHLIGHT_ITEM);
\r
419 int position = highlightImpl.getPageNumber();
\r
420 mFolioPageViewPager.setCurrentItem(position);
\r
421 BUS.post(new WebViewPosition(mSpineReferenceList.get(mChapterPosition).href, highlightImpl.getRangy()));
\r
427 protected void onDestroy() {
\r
429 if (mEpubServer != null) {
\r
430 mEpubServer.stop();
\r
432 BUS.unregister(this);
\r
435 public int getmChapterPosition() {
\r
436 return mChapterPosition;
\r
440 public void onLoadPublication(EpubPublication publication) {
\r
441 mSpineReferenceList.addAll(publication.spines);
\r
442 if (publication.metadata.title != null) {
\r
443 title.setText(publication.metadata.title);
\r
446 if (mBookId == null) {
\r
447 if (publication.metadata.identifier != null) {
\r
448 mBookId = publication.metadata.identifier;
\r
450 if (publication.metadata.title != null) {
\r
451 mBookId = String.valueOf(publication.metadata.title.hashCode());
\r
453 mBookId = String.valueOf(bookFileName.hashCode());
\r
460 private void setConfig() {
\r
461 if (AppUtil.getSavedConfig(this) != null) {
\r
462 mConfig = AppUtil.getSavedConfig(this);
\r
463 } else if (getIntent().getParcelableExtra(Config.INTENT_CONFIG) != null) {
\r
464 mConfig = getIntent().getParcelableExtra(Config.INTENT_CONFIG);
\r
465 AppUtil.saveConfig(this, mConfig);
\r
467 mConfig = new Config.ConfigBuilder().build();
\r
468 AppUtil.saveConfig(this, mConfig);
\r
473 //*************************************************************************//
\r
475 //*************************************************************************//
\r
476 private StyleableTextView mHalfSpeed, mOneSpeed, mTwoSpeed, mOneAndHalfSpeed;
\r
477 private StyleableTextView mBackgroundColorStyle, mUnderlineStyle, mTextColorStyle;
\r
478 private RelativeLayout audioContainer;
\r
479 private boolean mIsSpeaking;
\r
480 private ImageButton mPlayPauseBtn, mPreviousButton, mNextButton;
\r
481 private RelativeLayout shade;
\r
483 private void initAudioView() {
\r
484 mHalfSpeed = (StyleableTextView) findViewById(R.id.btn_half_speed);
\r
485 mOneSpeed = (StyleableTextView) findViewById(R.id.btn_one_x_speed);
\r
486 mTwoSpeed = (StyleableTextView) findViewById(R.id.btn_twox_speed);
\r
487 audioContainer = (RelativeLayout) findViewById(R.id.container);
\r
488 shade = (RelativeLayout) findViewById(R.id.shade);
\r
489 mOneAndHalfSpeed = (StyleableTextView) findViewById(R.id.btn_one_and_half_speed);
\r
490 mPlayPauseBtn = (ImageButton) findViewById(R.id.play_button);
\r
491 mPreviousButton = (ImageButton) findViewById(R.id.prev_button);
\r
492 mNextButton = (ImageButton) findViewById(R.id.next_button);
\r
493 mBackgroundColorStyle = (StyleableTextView) findViewById(R.id.btn_backcolor_style);
\r
494 mUnderlineStyle = (StyleableTextView) findViewById(R.id.btn_text_undeline_style);
\r
495 mTextColorStyle = (StyleableTextView) findViewById(R.id.btn_text_color_style);
\r
496 mIsSpeaking = false;
\r
498 final Context mContext = mHalfSpeed.getContext();
\r
499 mOneAndHalfSpeed.setText(Html.fromHtml(mContext.getString(R.string.one_and_half_speed)));
\r
500 mHalfSpeed.setText(Html.fromHtml(mContext.getString(R.string.half_speed_text)));
\r
501 String styleUnderline =
\r
502 mHalfSpeed.getContext().getResources().getString(R.string.style_underline);
\r
503 mUnderlineStyle.setText(Html.fromHtml(styleUnderline));
\r
505 setupColors(mContext);
\r
506 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
\r
507 findViewById(R.id.playback_speed_Layout).setVisibility(View.GONE);
\r
510 shade.setOnClickListener(new View.OnClickListener() {
\r
512 public void onClick(View v) {
\r
514 audioContainer.startAnimation(slide_up);
\r
515 audioContainer.setVisibility(View.VISIBLE);
\r
516 shade.setVisibility(View.VISIBLE);
\r
518 audioContainer.startAnimation(slide_down);
\r
519 audioContainer.setVisibility(View.INVISIBLE);
\r
520 shade.setVisibility(View.GONE);
\r
526 mPlayPauseBtn.setOnClickListener(new View.OnClickListener() {
\r
528 public void onClick(View v) {
\r
530 BUS.post(new MediaOverlayPlayPauseEvent(mSpineReferenceList.get(mChapterPosition).href, false, false));
\r
531 mPlayPauseBtn.setImageDrawable(ContextCompat.getDrawable(FolioActivity.this, R.drawable.play_icon));
\r
532 UiUtil.setColorToImage(mContext, mConfig.getThemeColor(), mPlayPauseBtn.getDrawable());
\r
534 BUS.post(new MediaOverlayPlayPauseEvent(mSpineReferenceList.get(mChapterPosition).href, true, false));
\r
535 mPlayPauseBtn.setImageDrawable(ContextCompat.getDrawable(FolioActivity.this, R.drawable.pause_btn));
\r
536 UiUtil.setColorToImage(mContext, mConfig.getThemeColor(), mPlayPauseBtn.getDrawable());
\r
538 mIsSpeaking = !mIsSpeaking;
\r
542 mHalfSpeed.setOnClickListener(new View.OnClickListener() {
\r
543 @TargetApi(Build.VERSION_CODES.M)
\r
545 public void onClick(View v) {
\r
546 mHalfSpeed.setSelected(true);
\r
547 mOneSpeed.setSelected(false);
\r
548 mOneAndHalfSpeed.setSelected(false);
\r
549 mTwoSpeed.setSelected(false);
\r
550 BUS.post(new MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.HALF));
\r
554 mOneSpeed.setOnClickListener(new View.OnClickListener() {
\r
555 @TargetApi(Build.VERSION_CODES.M)
\r
557 public void onClick(View v) {
\r
558 mHalfSpeed.setSelected(false);
\r
559 mOneSpeed.setSelected(true);
\r
560 mOneAndHalfSpeed.setSelected(false);
\r
561 mTwoSpeed.setSelected(false);
\r
562 BUS.post(new MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.ONE));
\r
565 mOneAndHalfSpeed.setOnClickListener(new View.OnClickListener() {
\r
566 @TargetApi(Build.VERSION_CODES.M)
\r
568 public void onClick(View v) {
\r
569 mHalfSpeed.setSelected(false);
\r
570 mOneSpeed.setSelected(false);
\r
571 mOneAndHalfSpeed.setSelected(true);
\r
572 mTwoSpeed.setSelected(false);
\r
573 BUS.post(new MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.ONE_HALF));
\r
576 mTwoSpeed.setOnClickListener(new View.OnClickListener() {
\r
578 public void onClick(View v) {
\r
579 mHalfSpeed.setSelected(false);
\r
580 mOneSpeed.setSelected(false);
\r
581 mOneAndHalfSpeed.setSelected(false);
\r
582 mTwoSpeed.setSelected(true);
\r
583 BUS.post(new MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.TWO));
\r
587 mBackgroundColorStyle.setOnClickListener(new View.OnClickListener() {
\r
589 public void onClick(View v) {
\r
590 mBackgroundColorStyle.setSelected(true);
\r
591 mUnderlineStyle.setSelected(false);
\r
592 mTextColorStyle.setSelected(false);
\r
593 BUS.post(new MediaOverlayHighlightStyleEvent(MediaOverlayHighlightStyleEvent.Style.DEFAULT));
\r
597 mUnderlineStyle.setOnClickListener(new View.OnClickListener() {
\r
599 public void onClick(View v) {
\r
600 mBackgroundColorStyle.setSelected(false);
\r
601 mUnderlineStyle.setSelected(true);
\r
602 mTextColorStyle.setSelected(false);
\r
603 BUS.post(new MediaOverlayHighlightStyleEvent(MediaOverlayHighlightStyleEvent.Style.UNDERLINE));
\r
608 mTextColorStyle.setOnClickListener(new View.OnClickListener() {
\r
610 public void onClick(View v) {
\r
611 mBackgroundColorStyle.setSelected(false);
\r
612 mUnderlineStyle.setSelected(false);
\r
613 mTextColorStyle.setSelected(true);
\r
614 BUS.post(new MediaOverlayHighlightStyleEvent(MediaOverlayHighlightStyleEvent.Style.BACKGROUND));
\r
620 private void setupColors(Context context) {
\r
621 mHalfSpeed.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color));
\r
622 mOneAndHalfSpeed.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color));
\r
623 mTwoSpeed.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color));
\r
624 mOneSpeed.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color));
\r
625 mUnderlineStyle.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color));
\r
626 mBackgroundColorStyle.setTextColor(UiUtil.getColorList(context, R.color.white, R.color.grey_color));
\r
627 mBackgroundColorStyle.setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(this, mConfig.getThemeColor(), android.R.color.transparent));
\r
628 mTextColorStyle.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color));
\r
629 UiUtil.setColorToImage(context, mConfig.getThemeColor(), mPlayPauseBtn.getDrawable());
\r
630 UiUtil.setColorToImage(context, mConfig.getThemeColor(), mNextButton.getDrawable());
\r
631 UiUtil.setColorToImage(context, mConfig.getThemeColor(), mPreviousButton.getDrawable());
\r
635 public void onError() {
\r
638 private void setupBook() {
\r
639 bookFileName = FileUtil.getEpubFilename(this, mEpubSourceType, mEpubFilePath, mEpubRawId);
\r
640 initBook(bookFileName, mEpubRawId, mEpubFilePath, mEpubSourceType);
\r
644 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
\r
645 switch (requestCode) {
\r
646 case Constants.WRITE_EXTERNAL_STORAGE_REQUEST:
\r
647 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
\r
650 Toast.makeText(this, getString(R.string.cannot_access_epub_message), Toast.LENGTH_LONG).show();
\r