mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Add buttons to open next/previous chapter in the reader. Try entire app with hardware acceleration
This commit is contained in:
		| @@ -9,6 +9,8 @@ import android.os.Bundle; | ||||
| import android.support.annotation.NonNull; | ||||
| import android.support.v4.content.ContextCompat; | ||||
| import android.support.v7.widget.Toolbar; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.view.Surface; | ||||
| import android.view.View; | ||||
| import android.view.WindowManager; | ||||
| @@ -111,6 +113,16 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> { | ||||
|         super.onDestroy(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onCreateOptionsMenu(Menu menu) { | ||||
|         return readerMenu.onCreateOptionsMenu(menu); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(MenuItem item) { | ||||
|         return readerMenu.onOptionsItemSelected(item) || super.onOptionsItemSelected(item); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onSaveInstanceState(@NonNull Bundle outState) { | ||||
|         Icepick.saveInstanceState(readerMenu, outState); | ||||
| @@ -131,6 +143,10 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> { | ||||
|         readerMenu.onChapterReady(pages.size(), manga, chapter, currentPage); | ||||
|     } | ||||
|  | ||||
|     public void onAdjacentChapters(Chapter previous, Chapter next) { | ||||
|         readerMenu.onAdjacentChapters(previous, next); | ||||
|     } | ||||
|  | ||||
|     private BaseReader createViewer(Manga manga) { | ||||
|         int mangaViewer = manga.viewer == 0 ? preferences.getDefaultViewer() : manga.viewer; | ||||
|  | ||||
| @@ -160,6 +176,21 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> { | ||||
|         readerMenu.toggle(); | ||||
|     } | ||||
|  | ||||
|     public void requestNextChapter() { | ||||
|         getPresenter().setCurrentPage(viewer != null ? viewer.getCurrentPage() : 0); | ||||
|         if (!getPresenter().loadNextChapter()) { | ||||
|             ToastUtil.showShort(this, R.string.no_next_chapter); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     public void requestPreviousChapter() { | ||||
|         getPresenter().setCurrentPage(viewer != null ? viewer.getCurrentPage() : 0); | ||||
|         if (!getPresenter().loadPreviousChapter()) { | ||||
|             ToastUtil.showShort(this, R.string.no_previous_chapter); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void initializeSettings() { | ||||
|         subscriptions.add(preferences.showPageNumber() | ||||
|                 .asObservable() | ||||
|   | ||||
| @@ -5,6 +5,8 @@ import android.content.Context; | ||||
| import android.support.v7.app.AlertDialog; | ||||
| import android.support.v7.widget.Toolbar; | ||||
| import android.view.Gravity; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.WindowManager; | ||||
| import android.view.WindowManager.LayoutParams; | ||||
| @@ -42,6 +44,11 @@ public class ReaderMenu { | ||||
|     @Bind(R.id.reader_extra_settings) ImageButton extraSettings; | ||||
|     @Bind(R.id.reader_brightness) ImageButton brightnessSettings; | ||||
|  | ||||
|     private MenuItem nextChapterBtn; | ||||
|     private MenuItem prevChapterBtn; | ||||
|     private Chapter prevChapter; | ||||
|     private Chapter nextChapter; | ||||
|  | ||||
|     private ReaderActivity activity; | ||||
|     private PreferencesHelper preferences; | ||||
|  | ||||
| @@ -106,6 +113,25 @@ public class ReaderMenu { | ||||
|         showing = false; | ||||
|     } | ||||
|  | ||||
|     public boolean onCreateOptionsMenu(Menu menu) { | ||||
|         activity.getMenuInflater().inflate(R.menu.reader, menu); | ||||
|         nextChapterBtn = menu.findItem(R.id.action_next_chapter); | ||||
|         prevChapterBtn = menu.findItem(R.id.action_previous_chapter); | ||||
|         setAdjacentChaptersVisibility(); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     public boolean onOptionsItemSelected(MenuItem item) { | ||||
|         if (item == prevChapterBtn) { | ||||
|             activity.requestPreviousChapter(); | ||||
|         } else if (item == nextChapterBtn) { | ||||
|             activity.requestNextChapter(); | ||||
|         } else { | ||||
|             return false; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     public void onChapterReady(int numPages, Manga manga, Chapter chapter, int currentPageIndex) { | ||||
|         if (manga.viewer == ReaderActivity.RIGHT_TO_LEFT && !inverted) { | ||||
|             // Invert the seekbar and textview fields for the right to left reader | ||||
| @@ -136,6 +162,17 @@ public class ReaderMenu { | ||||
|         seekBar.setProgress(pageIndex); | ||||
|     } | ||||
|  | ||||
|     public void onAdjacentChapters(Chapter previous, Chapter next) { | ||||
|         prevChapter = previous; | ||||
|         nextChapter = next; | ||||
|         setAdjacentChaptersVisibility(); | ||||
|     } | ||||
|  | ||||
|     private void setAdjacentChaptersVisibility() { | ||||
|         if (prevChapterBtn != null) prevChapterBtn.setVisible(prevChapter != null); | ||||
|         if (nextChapterBtn != null) nextChapterBtn.setVisible(nextChapter != null); | ||||
|     } | ||||
|  | ||||
|     private void initializeOptions() { | ||||
|         // Orientation changes | ||||
|         add(preferences.lockOrientation().asObservable() | ||||
|   | ||||
| @@ -2,6 +2,7 @@ package eu.kanade.mangafeed.ui.reader; | ||||
|  | ||||
| import android.os.Bundle; | ||||
| import android.support.annotation.NonNull; | ||||
| import android.util.Pair; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.List; | ||||
| @@ -53,8 +54,9 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|  | ||||
|     private static final int GET_PAGE_LIST = 1; | ||||
|     private static final int GET_PAGE_IMAGES = 2; | ||||
|     private static final int RETRY_IMAGES = 3; | ||||
|     private static final int PRELOAD_NEXT_CHAPTER = 4; | ||||
|     private static final int GET_ADJACENT_CHAPTERS = 3; | ||||
|     private static final int RETRY_IMAGES = 4; | ||||
|     private static final int PRELOAD_NEXT_CHAPTER = 5; | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedState) { | ||||
| @@ -71,12 +73,16 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|                 (view, pages) -> {}, | ||||
|                 (view, error) -> Timber.e("An error occurred while preloading a chapter")); | ||||
|  | ||||
|         restartableReplay(GET_PAGE_IMAGES, | ||||
|                 () -> getPageImagesObservable() | ||||
|                         .doOnCompleted(this::preloadNextChapter), | ||||
|         restartableLatestCache(GET_PAGE_IMAGES, | ||||
|                 this::getPageImagesObservable, | ||||
|                 (view, page) -> {}, | ||||
|                 (view, error) -> Timber.e("An error occurred while downloading an image")); | ||||
|  | ||||
|         restartableLatestCache(GET_ADJACENT_CHAPTERS, | ||||
|                 this::getAdjacentChaptersObservable, | ||||
|                 (view, pair) -> view.onAdjacentChapters(pair.first, pair.second), | ||||
|                 (view, error) -> Timber.e("An error occurred while getting adjacent chapters")); | ||||
|  | ||||
|         restartableLatestCache(RETRY_IMAGES, | ||||
|                 this::getRetryPageObservable, | ||||
|                 (view, page) -> {}, | ||||
| @@ -86,7 +92,7 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|                 () -> getPageListObservable() | ||||
|                         .doOnNext(pages -> pageList = pages) | ||||
|                         .doOnCompleted(() -> { | ||||
|                             getAdjacentChapters(); | ||||
|                             start(GET_ADJACENT_CHAPTERS); | ||||
|                             start(GET_PAGE_IMAGES); | ||||
|                             start(RETRY_IMAGES); | ||||
|                         }), | ||||
| @@ -117,6 +123,7 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|  | ||||
|         // These are started by GET_PAGE_LIST, so we don't let them restart itselves | ||||
|         stop(GET_PAGE_IMAGES); | ||||
|         stop(GET_ADJACENT_CHAPTERS); | ||||
|         stop(RETRY_IMAGES); | ||||
|         stop(PRELOAD_NEXT_CHAPTER); | ||||
|     } | ||||
| @@ -153,9 +160,19 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|             pageObservable = Observable.from(pageList) | ||||
|                     .flatMap(page -> downloadManager.getDownloadedImage(page, chapterDir)); | ||||
|         } | ||||
|         return Observable.defer(() -> pageObservable) | ||||
|                 .subscribeOn(Schedulers.io()) | ||||
|                 .onBackpressureBuffer() | ||||
|         return pageObservable.subscribeOn(Schedulers.io()) | ||||
|                 .doOnCompleted(this::preloadNextChapter); | ||||
|     } | ||||
|  | ||||
|     private Observable<Pair<Chapter, Chapter>> getAdjacentChaptersObservable() { | ||||
|         return Observable.zip( | ||||
|                 db.getPreviousChapter(chapter).createObservable().take(1), | ||||
|                 db.getNextChapter(chapter).createObservable().take(1), | ||||
|                 Pair::create) | ||||
|                 .doOnNext(pair -> { | ||||
|                     previousChapter = pair.first; | ||||
|                     nextChapter = pair.second; | ||||
|                 }) | ||||
|                 .observeOn(AndroidSchedulers.mainThread()); | ||||
|     } | ||||
|  | ||||
| @@ -275,28 +292,22 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> { | ||||
|         this.currentPage = currentPage; | ||||
|     } | ||||
|  | ||||
|     private void getAdjacentChapters() { | ||||
|         add(db.getNextChapter(chapter).createObservable() | ||||
|                 .take(1) | ||||
|                 .subscribe(result -> nextChapter = result)); | ||||
|  | ||||
|         add(db.getPreviousChapter(chapter).createObservable() | ||||
|                 .take(1) | ||||
|                 .subscribe(result -> previousChapter = result)); | ||||
|     } | ||||
|  | ||||
|     public void loadNextChapter() { | ||||
|     public boolean loadNextChapter() { | ||||
|         if (hasNextChapter()) { | ||||
|             onChapterLeft(); | ||||
|             loadChapter(nextChapter); | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     public void loadPreviousChapter() { | ||||
|     public boolean loadPreviousChapter() { | ||||
|         if (hasPreviousChapter()) { | ||||
|             onChapterLeft(); | ||||
|             loadChapter(previousChapter); | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     public boolean hasNextChapter() { | ||||
|   | ||||
| @@ -4,12 +4,9 @@ import android.view.MotionEvent; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import eu.kanade.mangafeed.R; | ||||
| import eu.kanade.mangafeed.data.source.model.Page; | ||||
| import eu.kanade.mangafeed.ui.base.fragment.BaseFragment; | ||||
| import eu.kanade.mangafeed.ui.reader.ReaderActivity; | ||||
| import eu.kanade.mangafeed.ui.reader.ReaderPresenter; | ||||
| import eu.kanade.mangafeed.util.ToastUtil; | ||||
|  | ||||
| public abstract class BaseReader extends BaseFragment { | ||||
|  | ||||
| @@ -32,27 +29,6 @@ public abstract class BaseReader extends BaseFragment { | ||||
|         return page; | ||||
|     } | ||||
|  | ||||
|     public void requestNextChapter() { | ||||
|         ReaderPresenter presenter = getReaderActivity().getPresenter(); | ||||
|         if (presenter.hasNextChapter()) { | ||||
|             presenter.setCurrentPage(getCurrentPage()); | ||||
|             presenter.loadNextChapter(); | ||||
|         } else { | ||||
|             ToastUtil.showShort(getActivity(), R.string.no_next_chapter); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     public void requestPreviousChapter() { | ||||
|         ReaderPresenter presenter = getReaderActivity().getPresenter(); | ||||
|         if (presenter.hasPreviousChapter()) { | ||||
|             presenter.setCurrentPage(getCurrentPage()); | ||||
|             presenter.loadPreviousChapter(); | ||||
|         } else { | ||||
|             ToastUtil.showShort(getActivity(), R.string.no_previous_chapter); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void onPageChanged(int position) { | ||||
|         currentPage = getPageForPosition(position); | ||||
|         updatePageNumber(); | ||||
|   | ||||
| @@ -70,10 +70,12 @@ public abstract class PagerReader extends BaseReader { | ||||
|  | ||||
|     @Override | ||||
|     public void onPageListReady(List<Page> pages, int currentPage) { | ||||
|         this.pages = pages; | ||||
|         this.currentPage = currentPage; | ||||
|         if (isResumed()) { | ||||
|             setPages(); | ||||
|         if (this.pages != pages) { | ||||
|             this.pages = pages; | ||||
|             this.currentPage = currentPage; | ||||
|             if (isResumed()) { | ||||
|                 setPages(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -4,12 +4,12 @@ public class LeftToRightReader extends HorizontalReader { | ||||
|  | ||||
|     @Override | ||||
|     public void onFirstPageOut() { | ||||
|         requestPreviousChapter(); | ||||
|         getReaderActivity().requestPreviousChapter(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onLastPageOut() { | ||||
|         requestNextChapter(); | ||||
|         getReaderActivity().requestNextChapter(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -27,12 +27,12 @@ public class RightToLeftReader extends HorizontalReader { | ||||
|  | ||||
|     @Override | ||||
|     public void onFirstPageOut() { | ||||
|         requestNextChapter(); | ||||
|         getReaderActivity().requestNextChapter(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onLastPageOut() { | ||||
|         requestPreviousChapter(); | ||||
|         getReaderActivity().requestPreviousChapter(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -18,12 +18,12 @@ public class VerticalReader extends PagerReader { | ||||
|  | ||||
|     @Override | ||||
|     public void onFirstPageOut() { | ||||
|         requestPreviousChapter(); | ||||
|         getReaderActivity().requestPreviousChapter(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onLastPageOut() { | ||||
|         requestNextChapter(); | ||||
|         getReaderActivity().requestNextChapter(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -58,6 +58,13 @@ public class WebtoonAdapter extends RecyclerView.Adapter<WebtoonAdapter.ImageHol | ||||
|         notifyItemInserted(page.getPageNumber()); | ||||
|     } | ||||
|  | ||||
|     public void clear() { | ||||
|         if (pages != null) { | ||||
|             pages.clear(); | ||||
|             notifyDataSetChanged(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static class ImageHolder extends RecyclerView.ViewHolder { | ||||
|  | ||||
|         @Bind(R.id.page_image_view) SubsamplingScaleImageView imageView; | ||||
|   | ||||
| @@ -73,9 +73,13 @@ public class WebtoonReader extends BaseReader { | ||||
|  | ||||
|     @Override | ||||
|     public void onPause() { | ||||
|         unsubscribeStatus(); | ||||
|         super.onPause(); | ||||
|     } | ||||
|  | ||||
|     private void unsubscribeStatus() { | ||||
|         if (subscription != null && !subscription.isUnsubscribed()) | ||||
|             subscription.unsubscribe(); | ||||
|         super.onPause(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -85,14 +89,18 @@ public class WebtoonReader extends BaseReader { | ||||
|  | ||||
|     @Override | ||||
|     public void onPageListReady(List<Page> pages, int currentPage) { | ||||
|         this.pages = pages; | ||||
|         if (isResumed()) { | ||||
|             setPages(); | ||||
|         if (this.pages != pages) { | ||||
|             this.pages = pages; | ||||
|             if (isResumed()) { | ||||
|                 setPages(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void setPages() { | ||||
|         if (pages != null) { | ||||
|             unsubscribeStatus(); | ||||
|             adapter.clear(); | ||||
|             observeStatus(0); | ||||
|         } | ||||
|     } | ||||
| @@ -112,8 +120,8 @@ public class WebtoonReader extends BaseReader { | ||||
|         PublishSubject<Integer> statusSubject = PublishSubject.create(); | ||||
|         page.setStatusSubject(statusSubject); | ||||
|  | ||||
|         if (subscription != null && !subscription.isUnsubscribed()) | ||||
|             subscription.unsubscribe(); | ||||
|         // Unsubscribe from the previous page | ||||
|         unsubscribeStatus(); | ||||
|  | ||||
|         subscription = statusSubject | ||||
|                 .startWith(page.getStatus()) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user