Added Android code
[wl-app.git] / Android / folioreader / src / main / java / com / folioreader / ui / folio / activity / FolioActivity.java
1 /*\r
2 * Copyright (C) 2016 Pedro Paulo de Amorim\r
3 *\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
7 *\r
8 * http://www.apache.org/licenses/LICENSE-2.0\r
9 *\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
15 */\r
16 package com.folioreader.ui.folio.activity;\r
17 \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
39 \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
64 \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
71 \r
72 import java.io.IOException;\r
73 import java.util.ArrayList;\r
74 import java.util.List;\r
75 \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
80 \r
81 public class FolioActivity\r
82         extends AppCompatActivity\r
83         implements FolioPageFragment.FolioPageFragmentCallback,\r
84         ObservableWebView.ToolBarListener,\r
85         ConfigBottomSheetDialogFragment.ConfigDialogCallback,\r
86         BusOwner,\r
87         MainMvpView {\r
88 \r
89     private static final String TAG = "FolioActivity";\r
90 \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
97 \r
98         public enum EpubSourceType {\r
99         RAW,\r
100         ASSETS,\r
101         SD_CARD\r
102     }\r
103 \r
104     private boolean isOpen = true;\r
105 \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
109 \r
110     private final Bus BUS = new Bus(ThreadEnforcer.MAIN);\r
111     @Override\r
112     public Bus getBus() {\r
113         return BUS;\r
114     }\r
115 \r
116     public boolean mIsActionBarVisible;\r
117     private DirectionalViewpager mFolioPageViewPager;\r
118     private Toolbar mToolbar;\r
119 \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
125 \r
126     private List<Link> mSpineReferenceList = new ArrayList<>();\r
127     private EpubServer mEpubServer;\r
128 \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
137 \r
138     @Override\r
139     protected void onCreate(Bundle savedInstanceState) {\r
140         super.onCreate(savedInstanceState);\r
141         setContentView(R.layout.folio_activity);\r
142 \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
148         } else {\r
149             mEpubFilePath = getIntent().getExtras()\r
150                     .getString(FolioActivity.INTENT_EPUB_SOURCE_PATH);\r
151         }\r
152 \r
153         setConfig();\r
154 \r
155         if (!mConfig.isShowTts()) {\r
156             findViewById(R.id.btn_speaker).setVisibility(View.GONE);\r
157         }\r
158 \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
163                 R.anim.slide_up);\r
164 \r
165         mToolbar = (Toolbar) findViewById(R.id.toolbar);\r
166 \r
167         BUS.register(this);\r
168 \r
169 \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
172         } else {\r
173             setupBook();\r
174         }\r
175 \r
176         initAudioView();\r
177 \r
178         findViewById(R.id.btn_drawer).setOnClickListener(new View.OnClickListener() {\r
179             @Override\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
187             }\r
188         });\r
189 \r
190         // speaker = (ImageView) findViewById(R.id.btn_speaker);\r
191         findViewById(R.id.btn_speaker).setOnClickListener(new View.OnClickListener() {\r
192             @Override\r
193             public void onClick(View v) {\r
194                 if (isOpen) {\r
195                     audioContainer.startAnimation(slide_up);\r
196                     audioContainer.setVisibility(View.VISIBLE);\r
197                     shade.setVisibility(View.VISIBLE);\r
198                 } else {\r
199                     audioContainer.startAnimation(slide_down);\r
200                     audioContainer.setVisibility(View.INVISIBLE);\r
201                     shade.setVisibility(View.GONE);\r
202                 }\r
203                 isOpen = !isOpen;\r
204             }\r
205         });\r
206 \r
207         mIsNightMode = mConfig.isNightMode();\r
208         if (mIsNightMode) {\r
209             audioContainer.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.night));\r
210         }\r
211         ToolbarUtils.updateToolbarColors(this, mToolbar, mConfig, mIsNightMode);\r
212     }\r
213 \r
214     private void initBook(String mEpubFileName, int mEpubRawId, String mEpubFilePath, EpubSourceType mEpubSourceType) {\r
215         try {\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
221             addEpub(path);\r
222 \r
223             String urlString = Constants.LOCALHOST + bookFileName + "/manifest";\r
224             new MainPresenter(this).parseManifest(urlString);\r
225 \r
226         } catch (IOException e) {\r
227             Log.e(TAG, "initBook failed", e);\r
228         }\r
229     }\r
230 \r
231     private void addEpub(String path) throws IOException {\r
232         Container epubContainer = new EpubContainer(path);\r
233         mEpubServer.addEpub(epubContainer, "/" + bookFileName);\r
234         getEpubResource();\r
235     }\r
236 \r
237     private void getEpubResource() {\r
238     }\r
239 \r
240     @Override\r
241     protected void onPostCreate(Bundle savedInstanceState) {\r
242         super.onPostCreate(savedInstanceState);\r
243         configDrawerLayoutButtons();\r
244     }\r
245 \r
246     @Override\r
247     public void onBackPressed() {\r
248         saveBookState();\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
254         finish();\r
255     }\r
256 \r
257     @Override\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
267 \r
268         } else {\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
275         }\r
276     }\r
277 \r
278     private void configFolio() {\r
279         mFolioPageViewPager = (DirectionalViewpager) findViewById(R.id.folioPageViewPager);\r
280         mFolioPageViewPager.setOnPageChangeListener(new DirectionalViewpager.OnPageChangeListener() {\r
281             @Override\r
282             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {\r
283             }\r
284 \r
285             @Override\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
290             }\r
291 \r
292             @Override\r
293             public void onPageScrollStateChanged(int state) {\r
294 //                if (state == DirectionalViewpager.SCROLL_STATE_IDLE) {\r
295 //                    title.setText(mSpineReferenceList.get(mChapterPosition).bookTitle);\r
296 //                }\r
297             }\r
298         });\r
299 \r
300         if (mSpineReferenceList != null) {\r
301             mFolioPageFragmentAdapter = new FolioPageFragmentAdapter(getSupportFragmentManager(), mSpineReferenceList, bookFileName, mBookId);\r
302             mFolioPageViewPager.setAdapter(mFolioPageFragmentAdapter);\r
303         }\r
304 \r
305         if (AppUtil.checkPreviousBookStateExist(FolioActivity.this, bookFileName)) {\r
306             mFolioPageViewPager.setCurrentItem(AppUtil.getPreviousBookStatePosition(FolioActivity.this, bookFileName));\r
307         }\r
308     }\r
309 \r
310     private void configDrawerLayoutButtons() {\r
311         findViewById(R.id.btn_close).setOnClickListener(new View.OnClickListener() {\r
312             @Override\r
313             public void onClick(View v) {\r
314                 onBackPressed();\r
315             }\r
316         });\r
317 \r
318         findViewById(R.id.btn_config).setOnClickListener(new View.OnClickListener() {\r
319             @Override\r
320             public void onClick(View v) {\r
321                 mConfigBottomSheetDialogFragment = new ConfigBottomSheetDialogFragment();\r
322                 mConfigBottomSheetDialogFragment.show(getSupportFragmentManager(), mConfigBottomSheetDialogFragment.getTag());\r
323             }\r
324         });\r
325     }\r
326 \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
331         }\r
332     }\r
333 \r
334     @Override\r
335     public void hideOrshowToolBar() {\r
336 //        if (mIsActionBarVisible) {\r
337 //            toolbarAnimateHide();\r
338 //        } else {\r
339 //            toolbarAnimateShow();\r
340 //        }\r
341     }\r
342 \r
343     @Override\r
344     public void hideToolBarIfVisible() {\r
345 //        if (mIsActionBarVisible) {\r
346 //            toolbarAnimateHide();\r
347 //        }\r
348     }\r
349 \r
350     @Override\r
351     public void setPagerToPosition(String href) {\r
352     }\r
353 \r
354     @Override\r
355     public void setLastWebViewPosition(int position) {\r
356         this.mWebViewScrollPosition = position;\r
357     }\r
358 \r
359     @Override\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
365         }\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
372                 break;\r
373             }\r
374         }\r
375     }\r
376 \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
381 //        }\r
382     }\r
383 \r
384     private void toolbarAnimateHide() {\r
385 //        mIsActionBarVisible = false;\r
386 //        mToolbar.animate().translationY(-mToolbar.getHeight()).setInterpolator(new AccelerateInterpolator(2)).start();\r
387     }\r
388 \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
393         }\r
394     }\r
395 \r
396     public HighlightImpl setCurrentPagerPostion(HighlightImpl highlightImpl) {\r
397 //        highlight.setCurrentPagerPostion(mFolioPageViewPager.getCurrentItem());\r
398         return highlightImpl;\r
399     }\r
400 \r
401     @Override\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
404 \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
414                         break;\r
415                     }\r
416                 }\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
422             }\r
423         }\r
424     }\r
425 \r
426     @Override\r
427     protected void onDestroy() {\r
428         super.onDestroy();\r
429         if (mEpubServer != null) {\r
430             mEpubServer.stop();\r
431         }\r
432         BUS.unregister(this);\r
433     }\r
434 \r
435     public int getmChapterPosition() {\r
436         return mChapterPosition;\r
437     }\r
438 \r
439     @Override\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
444         }\r
445 \r
446         if (mBookId == null) {\r
447             if (publication.metadata.identifier != null) {\r
448                 mBookId = publication.metadata.identifier;\r
449             } else {\r
450                 if (publication.metadata.title != null) {\r
451                     mBookId = String.valueOf(publication.metadata.title.hashCode());\r
452                 } else {\r
453                     mBookId = String.valueOf(bookFileName.hashCode());\r
454                 }\r
455             }\r
456         }\r
457         configFolio();\r
458     }\r
459 \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
466         } else {\r
467             mConfig = new Config.ConfigBuilder().build();\r
468             AppUtil.saveConfig(this, mConfig);\r
469         }\r
470     }\r
471 \r
472 \r
473     //*************************************************************************//\r
474     //                           AUDIO PLAYER                                  //\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
482 \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
497 \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
504 \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
508         }\r
509 \r
510         shade.setOnClickListener(new View.OnClickListener() {\r
511             @Override\r
512             public void onClick(View v) {\r
513                 if (isOpen) {\r
514                     audioContainer.startAnimation(slide_up);\r
515                     audioContainer.setVisibility(View.VISIBLE);\r
516                     shade.setVisibility(View.VISIBLE);\r
517                 } else {\r
518                     audioContainer.startAnimation(slide_down);\r
519                     audioContainer.setVisibility(View.INVISIBLE);\r
520                     shade.setVisibility(View.GONE);\r
521                 }\r
522                 isOpen = !isOpen;\r
523             }\r
524         });\r
525 \r
526         mPlayPauseBtn.setOnClickListener(new View.OnClickListener() {\r
527             @Override\r
528             public void onClick(View v) {\r
529                 if (mIsSpeaking) {\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
533                 } else {\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
537                 }\r
538                 mIsSpeaking = !mIsSpeaking;\r
539             }\r
540         });\r
541 \r
542         mHalfSpeed.setOnClickListener(new View.OnClickListener() {\r
543             @TargetApi(Build.VERSION_CODES.M)\r
544             @Override\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
551             }\r
552         });\r
553 \r
554         mOneSpeed.setOnClickListener(new View.OnClickListener() {\r
555             @TargetApi(Build.VERSION_CODES.M)\r
556             @Override\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
563             }\r
564         });\r
565         mOneAndHalfSpeed.setOnClickListener(new View.OnClickListener() {\r
566             @TargetApi(Build.VERSION_CODES.M)\r
567             @Override\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
574             }\r
575         });\r
576         mTwoSpeed.setOnClickListener(new View.OnClickListener() {\r
577             @Override\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
584             }\r
585         });\r
586 \r
587         mBackgroundColorStyle.setOnClickListener(new View.OnClickListener() {\r
588             @Override\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
594             }\r
595         });\r
596 \r
597         mUnderlineStyle.setOnClickListener(new View.OnClickListener() {\r
598             @Override\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
604 \r
605             }\r
606         });\r
607 \r
608         mTextColorStyle.setOnClickListener(new View.OnClickListener() {\r
609             @Override\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
615             }\r
616         });\r
617 \r
618     }\r
619 \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
632     }\r
633 \r
634     @Override\r
635     public void onError() {\r
636     }\r
637 \r
638     private void setupBook() {\r
639         bookFileName = FileUtil.getEpubFilename(this, mEpubSourceType, mEpubFilePath, mEpubRawId);\r
640         initBook(bookFileName, mEpubRawId, mEpubFilePath, mEpubSourceType);\r
641     }\r
642 \r
643     @Override\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
648                     setupBook();\r
649                 } else {\r
650                     Toast.makeText(this, getString(R.string.cannot_access_epub_message), Toast.LENGTH_LONG).show();\r
651                     finish();\r
652                 }\r
653                 break;\r
654         }\r
655     }\r
656 }\r