From d0089e3f5e7cf0e3229ff4599ff250196c77a4d2 Mon Sep 17 00:00:00 2001 From: inorichi Date: Wed, 6 Jan 2016 20:55:52 +0100 Subject: [PATCH] Add buttons to open next/previous chapter in the reader. Try entire app with hardware acceleration --- app/src/main/AndroidManifest.xml | 4 +- .../mangafeed/ui/reader/ReaderActivity.java | 31 ++++++++++ .../mangafeed/ui/reader/ReaderMenu.java | 37 ++++++++++++ .../mangafeed/ui/reader/ReaderPresenter.java | 53 +++++++++++------- .../ui/reader/viewer/base/BaseReader.java | 24 -------- .../ui/reader/viewer/common/PagerReader.java | 10 ++-- .../viewer/horizontal/LeftToRightReader.java | 4 +- .../viewer/horizontal/RightToLeftReader.java | 4 +- .../viewer/vertical/VerticalReader.java | 4 +- .../reader/viewer/webtoon/WebtoonAdapter.java | 7 +++ .../reader/viewer/webtoon/WebtoonReader.java | 20 +++++-- app/src/main/res/anim/fade_in.xml | 3 +- .../drawable-hdpi/ic_skip_next_white_24dp.png | Bin 0 -> 195 bytes .../ic_skip_previous_white_24dp.png | Bin 0 -> 209 bytes .../drawable-ldpi/ic_skip_next_white_24dp.png | Bin 0 -> 179 bytes .../ic_skip_previous_white_24dp.png | Bin 0 -> 177 bytes .../drawable-mdpi/ic_skip_next_white_24dp.png | Bin 0 -> 150 bytes .../ic_skip_previous_white_24dp.png | Bin 0 -> 152 bytes .../ic_skip_next_white_24dp.png | Bin 0 -> 233 bytes .../ic_skip_previous_white_24dp.png | Bin 0 -> 257 bytes .../ic_skip_next_white_24dp.png | Bin 0 -> 309 bytes .../ic_skip_previous_white_24dp.png | Bin 0 -> 335 bytes .../ic_skip_next_white_24dp.png | Bin 0 -> 391 bytes .../ic_skip_previous_white_24dp.png | Bin 0 -> 423 bytes app/src/main/res/menu/reader.xml | 19 +++++++ app/src/main/res/values/strings.xml | 3 + 26 files changed, 159 insertions(+), 64 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_skip_next_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_skip_previous_white_24dp.png create mode 100644 app/src/main/res/drawable-ldpi/ic_skip_next_white_24dp.png create mode 100644 app/src/main/res/drawable-ldpi/ic_skip_previous_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_skip_next_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_skip_previous_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_skip_next_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_skip_previous_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_skip_next_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_skip_next_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_skip_previous_white_24dp.png create mode 100644 app/src/main/res/menu/reader.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c6e93a502..9dfb27f33 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,7 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" + android:hardwareAccelerated="true" android:theme="@style/AppTheme" > @@ -27,8 +28,7 @@ + android:parentActivityName=".ui.manga.MangaActivity"> diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderActivity.java b/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderActivity.java index 7101716f5..0f512b39f 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderActivity.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderActivity.java @@ -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 { 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 { 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 { 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() diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderMenu.java b/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderMenu.java index 48a5b87aa..25db12bf4 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderMenu.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderMenu.java @@ -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() diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderPresenter.java b/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderPresenter.java index d92d7361d..0ac9ebc6c 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderPresenter.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/reader/ReaderPresenter.java @@ -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 { 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 { (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 { () -> 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 { // 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 { 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> 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 { 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() { diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/base/BaseReader.java b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/base/BaseReader.java index 1bf05fd39..149abaec4 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/base/BaseReader.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/base/BaseReader.java @@ -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(); diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/common/PagerReader.java b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/common/PagerReader.java index 178fd4af3..a10985781 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/common/PagerReader.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/common/PagerReader.java @@ -70,10 +70,12 @@ public abstract class PagerReader extends BaseReader { @Override public void onPageListReady(List 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(); + } } } diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/horizontal/LeftToRightReader.java b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/horizontal/LeftToRightReader.java index fe5bfb1af..9256f8d97 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/horizontal/LeftToRightReader.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/horizontal/LeftToRightReader.java @@ -4,12 +4,12 @@ public class LeftToRightReader extends HorizontalReader { @Override public void onFirstPageOut() { - requestPreviousChapter(); + getReaderActivity().requestPreviousChapter(); } @Override public void onLastPageOut() { - requestNextChapter(); + getReaderActivity().requestNextChapter(); } } diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/horizontal/RightToLeftReader.java b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/horizontal/RightToLeftReader.java index 3f476a48e..043a90ddf 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/horizontal/RightToLeftReader.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/horizontal/RightToLeftReader.java @@ -27,12 +27,12 @@ public class RightToLeftReader extends HorizontalReader { @Override public void onFirstPageOut() { - requestNextChapter(); + getReaderActivity().requestNextChapter(); } @Override public void onLastPageOut() { - requestPreviousChapter(); + getReaderActivity().requestPreviousChapter(); } } diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/vertical/VerticalReader.java b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/vertical/VerticalReader.java index 1711d813b..ca1fa944e 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/vertical/VerticalReader.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/vertical/VerticalReader.java @@ -18,12 +18,12 @@ public class VerticalReader extends PagerReader { @Override public void onFirstPageOut() { - requestPreviousChapter(); + getReaderActivity().requestPreviousChapter(); } @Override public void onLastPageOut() { - requestNextChapter(); + getReaderActivity().requestNextChapter(); } } diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/webtoon/WebtoonAdapter.java b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/webtoon/WebtoonAdapter.java index ccb877781..baf9f60fb 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/webtoon/WebtoonAdapter.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/reader/viewer/webtoon/WebtoonAdapter.java @@ -58,6 +58,13 @@ public class WebtoonAdapter extends RecyclerView.Adapter 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 statusSubject = PublishSubject.create(); page.setStatusSubject(statusSubject); - if (subscription != null && !subscription.isUnsubscribed()) - subscription.unsubscribe(); + // Unsubscribe from the previous page + unsubscribeStatus(); subscription = statusSubject .startWith(page.getStatus()) diff --git a/app/src/main/res/anim/fade_in.xml b/app/src/main/res/anim/fade_in.xml index 1b253231b..94282b214 100644 --- a/app/src/main/res/anim/fade_in.xml +++ b/app/src/main/res/anim/fade_in.xml @@ -4,5 +4,6 @@ android:fromAlpha="0.0" android:toAlpha="1.0" android:interpolator="@android:anim/accelerate_interpolator" - android:duration="300" /> + android:duration="300" + android:fillAfter="true"/> \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_skip_next_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_skip_next_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..48dbcb9b630f61e4c6c278b1ae7aa6690991306d GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K8m#2$kNX4zUS2yxDIY_iU%+^@( zBEm82Wo(0Micl+_+;ag(f>|k0wldT1B8Lp3{MxwkcwN$Kh8VIo-oL|u)@*A zh=Zvh`_cdXJyL8p|JQf;PBUqa_+S3#e|PLOk!F*B^Z)*rpRV(fE%opJZ~yI=vUUEw z|4CkSLh6L`|EK@|ADks{{r}7V8ySUojsDd?{$HOZk@DrgRVfcsWv&#Ebj;6UF$-NR z&t$xEqQc5qt_m}^&6S!d#`JbYV9x=rZA%w#J+Z>E`Hlj^|M{C^jIuwN0^P{q>FVdQ I&MBb@0OR#nJOBUy literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/ic_skip_next_white_24dp.png b/app/src/main/res/drawable-ldpi/ic_skip_next_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..be6e4e44ad8ad5155f6209c6c52716a33853bb0d GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a)4Do+>3kcwN$2@2vJ9UTvZ(vM7F z=9ICim=Njg+$JiVB^@TA@gr$qS`G>=rKJUZ63jdgo_&3Z_Ysz8nieI*hZPFZb3 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/ic_skip_previous_white_24dp.png b/app/src/main/res/drawable-ldpi/ic_skip_previous_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..6f71c79986970319efcbe314b7f8d179117054a9 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a)43QrfukcwN$2@2vJ9UTn@%6gVO zjoH`NZDiOev`dYbm-k*XJHOH53?|L0udk*G3FNbFYF&_|<8ZXg!P%{>Ojuy8?HlO#aRP%g^kRapKqixBu&tOgsMG|0FLO5Y5by zHtCVdCL3PPYh^)AqD*f+IxQkDMOe*h^tj5vP`{;P<{gPZU7%GAp00i_>zopr01&)7 A=l}o! literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_skip_next_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_skip_next_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbbdc89f20074740874eb3bc1960cc69a0f93c1 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0D4W2HJAr-gYUbE$63>0a5DBYQ) zH8&_bt4ewUv$lbD0((w_Yy=~B0^_Sp&C*$!Y7@ir7OH>pQhC1nZ|$Vt#pgU#%9k=Q zaVRw8H^}bYzOCYEGQ&Eb7zVjDFK0QNn|XWNlwzF~UiZkw@5^s`erGsU;Re4Xsw h)5pjnaNvD|da999ir}p~SwOclc)I$ztaD0e0stgFSug+q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_skip_previous_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_skip_previous_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..95344a0567f855f8233b7efc7cddd5fb0d180c3e GIT binary patch literal 257 zcmV+c0sj7pP)04J~~-~^n26L11f-~tYyrd8^;Qb^=4o0lylEXnM*QOtbp zWPi!NyqOmW+5`t2aKHfzkk>DtX|huSLoT2DtU#R=kD@*s(B=58&jQT2feL7`=e0@& z##})KG}!R2N&@NIB{hzl`Au5pj`U-vt{c~M+Y2m;Gcmf`S~Jvb1LhE&{odt)K*p#YKAhixp4 zhZHxuHm5V1B{0okFw@{Zz~&Rc*1&jStLq~JQ{NN*^OReqoIdeAoWpm)|I61q<-$U1 z)eTQ5H1imNi5KFI)xYHTKeCKxKG?cajN@I-3#~?{b3I!e0ybV@YL$`5Xnb(Whg)RR z;^nMOO`T#KS=UOYI4G*OMJensyw23RWqYhjK=o}`=B-;}T`v6I*3DCuyZgn0wA-Ey zMXCWuon9~Yo7z{qtmKXNTKUBxr5#gW2WI|R5vj?W!J52Ouxz!-lkV8&qNUwQn^!K< zmkwH5>a%Q1pXOGvup({S{6t=eBY`gcC;o-OIpu6@i;;r{FdP^>UHx3vIVCg!05Xew AC;$Ke literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c0fff07600450ccdbd81c44249c2ed3cbcf81366 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXoKNz$oVF;uunK>+KCkzJm@DtPk9h zl9SU;G<#zvOrS z3%@`?sKNvXCQcPFalyW6((BvNS2w0HeJwn3J(^`j7wfvp>c7pmZtVQ>i_N#N?Dbd9 ztOVvA-+nRk7P3S*n68n&u8a8O%mxBifW*-8(G z{w0eTR3~>ae3=uX+I-1VHQ?7G;brb_KZ9=P${XcYN82vre{5@|q&H!uVDOGxSw*t; zZy0lrl{jp^dT<_h3g1s}pbX>Xe1WI^Nny7#Z+ys-5jN^go|NfscB$K>Rn$YFkwpkh cy!gJ0(ZcI&Rn9SMP(U$wy85}Sb4q9e01G~a)c^nh literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_skip_next_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_skip_next_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..268f3d49437cbd4b1f02ee0f7647257040df1b6d GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7!06}c;uunK>+LODKc+yDwuhXZ ztfF(5>R!3Ao3Z=>R|)Gb<~s~;4v0QrDqy^}CF0V}3lnCXzZ2$|CUoTYtnX*oo_Rid zZvA|o8t?Bc77hUghXw{lCIn*++lMI!1M?qd|Fu%6JS{3cq2`HUdWyr!>peFbQYKrQ zEx1yA?q);E+-x9Ar`Aj%^4TO_k8PD6{X809Cvlr8RG#OR4p{+P+*zJ~)ujuvuv zwzc&cZMkxxo$(OMNtVPW14pCAnG9+PjXVy#x~aQDL_A(7yw*I$UMM3YazFX+{kQA? zOwRear#ybyncYS}bJ4+Z#+-HkYvvT&S~KT;{rJ5ukYV|(7rXuTOEhTjz4lg|v0(lA zUw>z@#k_dBq3$fxI}__I@x=|swpq8081KA@En=PX!ZCi5_Jg3{w^0Wfna`?*J4`HD z6&~T>Wwop!_0mR`HEOcX2dXX^GXL?j3Tw#qJkAy{t;C1nspoNq4c0GP*h5t3K4^Hg zL|EoRIeW^hiv3P6mE|n!kE~qx^%<{5UCK`L1uNziPswnd;cZ&dcX{oN3rlpL-l+7R zx$5 + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e33d981b..35bcbc5d3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,6 +34,9 @@ Next unread Start Stop + Previous chapter + Next chapter + OK