This commit is contained in:
parent
7fc23d526b
commit
ad97d03f1d
@ -109,6 +109,7 @@ public class CatalogueFragment extends BaseRxFragment<CataloguePresenter>
|
|||||||
} else {
|
} else {
|
||||||
selectedIndex = position;
|
selectedIndex = position;
|
||||||
showProgressBar();
|
showProgressBar();
|
||||||
|
recycler.setAdapter(adapter);
|
||||||
getPresenter().startRequesting(source);
|
getPresenter().startRequesting(source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -211,7 +212,7 @@ public class CatalogueFragment extends BaseRxFragment<CataloguePresenter>
|
|||||||
|
|
||||||
public void onAddPage(int page, List<Manga> mangas) {
|
public void onAddPage(int page, List<Manga> mangas) {
|
||||||
hideProgressBar();
|
hideProgressBar();
|
||||||
if (page == 1) {
|
if (page == 0) {
|
||||||
adapter.clear();
|
adapter.clear();
|
||||||
scrollListener.resetScroll();
|
scrollListener.resetScroll();
|
||||||
}
|
}
|
||||||
@ -260,13 +261,16 @@ public class CatalogueFragment extends BaseRxFragment<CataloguePresenter>
|
|||||||
@Override
|
@Override
|
||||||
public void onListItemLongClick(int position) {
|
public void onListItemLongClick(int position) {
|
||||||
final Manga selectedManga = adapter.getItem(position);
|
final Manga selectedManga = adapter.getItem(position);
|
||||||
|
final Manga dbManga = getPresenter().getDbManga(selectedManga.id);
|
||||||
|
|
||||||
|
int textRes = dbManga.favorite ? R.string.remove_from_library : R.string.add_to_library;
|
||||||
|
|
||||||
new MaterialDialog.Builder(getActivity())
|
new MaterialDialog.Builder(getActivity())
|
||||||
.items(getString(R.string.add_to_library))
|
.items(getString(textRes))
|
||||||
.itemsCallback((dialog, itemView, which, text) -> {
|
.itemsCallback((dialog, itemView, which, text) -> {
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case 0:
|
case 0:
|
||||||
getPresenter().addMangaToLibrary(selectedManga);
|
getPresenter().changeMangaFavorite(selectedManga);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.ui.catalogue;
|
|||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Pair;
|
|
||||||
|
|
||||||
import com.pushtorefresh.storio.sqlite.operations.put.PutResult;
|
import com.pushtorefresh.storio.sqlite.operations.put.PutResult;
|
||||||
|
|
||||||
@ -38,14 +37,14 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
|
|
||||||
private String query;
|
private String query;
|
||||||
|
|
||||||
private int currentPage;
|
private RxPager<Manga> pager;
|
||||||
private RxPager pager;
|
|
||||||
private MangasPage lastMangasPage;
|
private MangasPage lastMangasPage;
|
||||||
|
|
||||||
private PublishSubject<List<Manga>> mangaDetailSubject;
|
private PublishSubject<List<Manga>> mangaDetailSubject;
|
||||||
|
|
||||||
private static final int GET_MANGA_LIST = 1;
|
private static final int GET_MANGA_LIST = 1;
|
||||||
private static final int GET_MANGA_DETAIL = 2;
|
private static final int GET_MANGA_DETAIL = 2;
|
||||||
|
private static final int GET_MANGA_PAGE = 3;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedState) {
|
protected void onCreate(Bundle savedState) {
|
||||||
@ -57,13 +56,16 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
|
|
||||||
mangaDetailSubject = PublishSubject.create();
|
mangaDetailSubject = PublishSubject.create();
|
||||||
|
|
||||||
|
pager = new RxPager<>();
|
||||||
|
|
||||||
restartableReplay(GET_MANGA_LIST,
|
restartableReplay(GET_MANGA_LIST,
|
||||||
() -> pager.pages().concatMap(page -> getMangasPageObservable(page + 1)),
|
pager::results,
|
||||||
(view, pair) -> view.onAddPage(pair.first, pair.second),
|
(view, pair) -> view.onAddPage(pair.first, pair.second));
|
||||||
(view, error) -> {
|
|
||||||
view.onAddPageError();
|
restartableFirst(GET_MANGA_PAGE,
|
||||||
Timber.e(error.getMessage());
|
() -> pager.request(page -> getMangasPageObservable(page + 1)),
|
||||||
});
|
(view, next) -> {},
|
||||||
|
(view, error) -> view.onAddPageError());
|
||||||
|
|
||||||
restartableLatestCache(GET_MANGA_DETAIL,
|
restartableLatestCache(GET_MANGA_DETAIL,
|
||||||
() -> mangaDetailSubject
|
() -> mangaDetailSubject
|
||||||
@ -82,6 +84,7 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
source = sourceManager.get(sourceId);
|
source = sourceManager.get(sourceId);
|
||||||
stop(GET_MANGA_LIST);
|
stop(GET_MANGA_LIST);
|
||||||
stop(GET_MANGA_DETAIL);
|
stop(GET_MANGA_DETAIL);
|
||||||
|
stop(GET_MANGA_PAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startRequesting(Source source) {
|
public void startRequesting(Source source) {
|
||||||
@ -92,20 +95,21 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
|
|
||||||
public void restartRequest(String query) {
|
public void restartRequest(String query) {
|
||||||
this.query = query;
|
this.query = query;
|
||||||
stop(GET_MANGA_LIST);
|
stop(GET_MANGA_PAGE);
|
||||||
currentPage = 1;
|
lastMangasPage = null;
|
||||||
pager = new RxPager();
|
|
||||||
|
|
||||||
start(GET_MANGA_DETAIL);
|
start(GET_MANGA_DETAIL);
|
||||||
start(GET_MANGA_LIST);
|
start(GET_MANGA_LIST);
|
||||||
|
start(GET_MANGA_PAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void requestNext() {
|
public void requestNext() {
|
||||||
if (hasNextPage())
|
if (hasNextPage()) {
|
||||||
pager.requestNext(++currentPage);
|
start(GET_MANGA_PAGE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Observable<Pair<Integer, List<Manga>>> getMangasPageObservable(int page) {
|
private Observable<List<Manga>> getMangasPageObservable(int page) {
|
||||||
MangasPage nextMangasPage = new MangasPage(page);
|
MangasPage nextMangasPage = new MangasPage(page);
|
||||||
if (page != 1) {
|
if (page != 1) {
|
||||||
nextMangasPage.url = lastMangasPage.nextPageUrl;
|
nextMangasPage.url = lastMangasPage.nextPageUrl;
|
||||||
@ -120,10 +124,9 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
.flatMap(mangasPage -> Observable.from(mangasPage.mangas))
|
.flatMap(mangasPage -> Observable.from(mangasPage.mangas))
|
||||||
.map(this::networkToLocalManga)
|
.map(this::networkToLocalManga)
|
||||||
.toList()
|
.toList()
|
||||||
.map(mangas -> Pair.create(page, mangas))
|
.doOnNext(mangas -> {
|
||||||
.doOnNext(pair -> {
|
|
||||||
if (mangaDetailSubject != null)
|
if (mangaDetailSubject != null)
|
||||||
mangaDetailSubject.onNext(pair.second);
|
mangaDetailSubject.onNext(mangas);
|
||||||
})
|
})
|
||||||
.observeOn(AndroidSchedulers.mainThread());
|
.observeOn(AndroidSchedulers.mainThread());
|
||||||
}
|
}
|
||||||
@ -149,6 +152,10 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
.onErrorResumeNext(error -> Observable.just(manga));
|
.onErrorResumeNext(error -> Observable.just(manga));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Manga getDbManga(long id) {
|
||||||
|
return db.getManga(id).executeAsBlocking();
|
||||||
|
}
|
||||||
|
|
||||||
public Source getSource() {
|
public Source getSource() {
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
@ -170,8 +177,8 @@ public class CataloguePresenter extends BasePresenter<CatalogueFragment> {
|
|||||||
return sourceManager.getSources();
|
return sourceManager.getSources();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addMangaToLibrary(Manga manga) {
|
public void changeMangaFavorite(Manga manga) {
|
||||||
manga.favorite = true;
|
manga.favorite = !manga.favorite;
|
||||||
db.insertManga(manga).executeAsBlocking();
|
db.insertManga(manga).executeAsBlocking();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,32 +1,26 @@
|
|||||||
package eu.kanade.tachiyomi.util;
|
package eu.kanade.tachiyomi.util;
|
||||||
|
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
import rx.functions.Func1;
|
||||||
import rx.subjects.PublishSubject;
|
import rx.subjects.PublishSubject;
|
||||||
|
|
||||||
public class RxPager {
|
public class RxPager<T> {
|
||||||
|
|
||||||
private final int initialPageCount;
|
private final PublishSubject<List<T>> results = PublishSubject.create();
|
||||||
private final PublishSubject<Integer> requests = PublishSubject.create();
|
|
||||||
private int requestedCount;
|
private int requestedCount;
|
||||||
|
|
||||||
public RxPager() {
|
public Observable<Pair<Integer, List<T>>> results() {
|
||||||
this(1);
|
requestedCount = 0;
|
||||||
|
return results.map(list -> Pair.create(requestedCount++, list));
|
||||||
}
|
}
|
||||||
|
|
||||||
public RxPager(int initialPageCount) {
|
public Observable<List<T>> request(Func1<Integer, Observable<List<T>>> networkObservable) {
|
||||||
this.initialPageCount = initialPageCount;
|
return networkObservable.call(requestedCount).doOnNext(results::onNext);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void requestNext(int page) {
|
|
||||||
requests.onNext(page);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Observable<Integer> pages() {
|
|
||||||
return requests
|
|
||||||
.concatMap(targetPage -> targetPage <= requestedCount ?
|
|
||||||
Observable.<Integer>empty() :
|
|
||||||
Observable.range(requestedCount, targetPage - requestedCount))
|
|
||||||
.startWith(Observable.range(0, initialPageCount))
|
|
||||||
.doOnNext(it -> requestedCount = it + 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<color name="colorAccent">@color/md_blue_A400</color>
|
<color name="colorAccent">@color/md_blue_A400</color>
|
||||||
<color name="colorPrimary">@color/md_blue_grey_500</color>
|
<color name="colorPrimary">#54759e</color>
|
||||||
<color name="colorPrimaryDark">@color/md_blue_grey_700</color>
|
<color name="colorPrimaryDark">#435e7e</color>
|
||||||
<color name="colorPrimarySuperDark">@color/md_blue_grey_900</color>
|
<color name="colorPrimarySuperDark">@color/md_blue_grey_900</color>
|
||||||
<color name="colorPrimaryLight">@color/md_blue_grey_100</color>
|
<color name="colorPrimaryLight">@color/md_blue_grey_100</color>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user