Improve the refresh of chapter filters
This commit is contained in:
parent
ab216a3608
commit
b986309b81
3 changed files with 61 additions and 38 deletions
|
@ -340,7 +340,6 @@ public class DownloadManager {
|
|||
public void deleteChapter(Source source, Manga manga, Chapter chapter) {
|
||||
File path = getAbsoluteChapterDirectory(source, manga, chapter);
|
||||
DiskUtils.deleteFiles(path);
|
||||
queue.remove(chapter);
|
||||
}
|
||||
|
||||
public DownloadQueue getQueue() {
|
||||
|
|
|
@ -35,12 +35,13 @@ import eu.kanade.mangafeed.util.EventBusHook;
|
|||
import eu.kanade.mangafeed.util.ToastUtil;
|
||||
import nucleus.factory.RequiresPresenter;
|
||||
import rx.Observable;
|
||||
import timber.log.Timber;
|
||||
|
||||
@RequiresPresenter(ChaptersPresenter.class)
|
||||
public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implements
|
||||
ActionMode.Callback, ChaptersAdapter.OnItemClickListener {
|
||||
|
||||
@Bind(R.id.chapter_list) RecyclerView chapters;
|
||||
@Bind(R.id.chapter_list) RecyclerView recyclerView;
|
||||
@Bind(R.id.swipe_refresh) SwipeRefreshLayout swipeRefresh;
|
||||
@Bind(R.id.toolbar_bottom) Toolbar toolbarBottom;
|
||||
|
||||
|
@ -50,7 +51,7 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
|
|||
@Bind(R.id.action_show_downloaded) CheckBox downloadedCb;
|
||||
|
||||
private ChaptersAdapter adapter;
|
||||
|
||||
private LinearLayoutManager linearLayout;
|
||||
private ActionMode actionMode;
|
||||
|
||||
public static ChaptersFragment newInstance() {
|
||||
|
@ -61,7 +62,6 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
|
|||
public void onCreate(Bundle savedState) {
|
||||
super.onCreate(savedState);
|
||||
setHasOptionsMenu(true);
|
||||
getPresenter().setIsCatalogueManga(isCatalogueManga());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -72,10 +72,11 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
|
|||
ButterKnife.bind(this, view);
|
||||
|
||||
// Init RecyclerView and adapter
|
||||
chapters.setLayoutManager(new LinearLayoutManager(getActivity()));
|
||||
chapters.addItemDecoration(new DividerItemDecoration(ContextCompat.getDrawable(this.getContext(), R.drawable.line_divider)));
|
||||
linearLayout = new LinearLayoutManager(getActivity());
|
||||
recyclerView.setLayoutManager(linearLayout);
|
||||
recyclerView.addItemDecoration(new DividerItemDecoration(ContextCompat.getDrawable(getContext(), R.drawable.line_divider)));
|
||||
adapter = new ChaptersAdapter(this);
|
||||
chapters.setAdapter(adapter);
|
||||
recyclerView.setAdapter(adapter);
|
||||
|
||||
// Set initial values
|
||||
setReadFilter();
|
||||
|
@ -133,13 +134,18 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
|
|||
}
|
||||
|
||||
public void onNextChapters(List<Chapter> chapters) {
|
||||
if (chapters.isEmpty() && isCatalogueManga()) {
|
||||
swipeRefresh.setRefreshing(true);
|
||||
getPresenter().fetchChaptersFromSource();
|
||||
}
|
||||
|
||||
closeActionMode();
|
||||
adapter.setItems(chapters);
|
||||
}
|
||||
|
||||
public void onFetchChapters() {
|
||||
swipeRefresh.setRefreshing(true);
|
||||
getPresenter().fetchChapters();
|
||||
getPresenter().fetchChaptersFromSource();
|
||||
}
|
||||
|
||||
public void onFetchChaptersFinish() {
|
||||
|
@ -163,11 +169,13 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
|
|||
if (manga != null && !event.getChapter().manga_id.equals(manga.id))
|
||||
return;
|
||||
|
||||
getPresenter().updateChapterStatus(event);
|
||||
|
||||
Chapter chapter;
|
||||
for (int i = 0; i < adapter.getItemCount(); i++) {
|
||||
chapter = adapter.getItem(i);
|
||||
for (int i = linearLayout.findFirstVisibleItemPosition(); i < linearLayout.findLastVisibleItemPosition(); i++) {
|
||||
int pos = recyclerView.getChildAdapterPosition(linearLayout.findViewByPosition(i));
|
||||
chapter = adapter.getItem(pos);
|
||||
if (event.getChapter().id.equals(chapter.id)) {
|
||||
chapter.status = event.getStatus();
|
||||
adapter.notifyItemChanged(i);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ import eu.kanade.mangafeed.data.source.SourceManager;
|
|||
import eu.kanade.mangafeed.data.source.base.Source;
|
||||
import eu.kanade.mangafeed.event.ChapterCountEvent;
|
||||
import eu.kanade.mangafeed.event.DownloadChaptersEvent;
|
||||
import eu.kanade.mangafeed.event.DownloadStatusEvent;
|
||||
import eu.kanade.mangafeed.event.ReaderEvent;
|
||||
import eu.kanade.mangafeed.ui.base.presenter.BasePresenter;
|
||||
import eu.kanade.mangafeed.util.EventBusHook;
|
||||
|
@ -25,6 +26,7 @@ import rx.Observable;
|
|||
import rx.android.schedulers.AndroidSchedulers;
|
||||
import rx.schedulers.Schedulers;
|
||||
import rx.subjects.PublishSubject;
|
||||
import timber.log.Timber;
|
||||
|
||||
public class ChaptersPresenter extends BasePresenter<ChaptersFragment> {
|
||||
|
||||
|
@ -36,7 +38,6 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> {
|
|||
private Manga manga;
|
||||
private Source source;
|
||||
private List<Chapter> chapters;
|
||||
private boolean isCatalogueManga;
|
||||
private boolean sortOrderAToZ = true;
|
||||
private boolean onlyUnread = true;
|
||||
private boolean onlyDownloaded;
|
||||
|
@ -83,30 +84,33 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> {
|
|||
|
||||
@EventBusHook
|
||||
public void onEventMainThread(Manga manga) {
|
||||
if (this.manga == null) {
|
||||
this.manga = manga;
|
||||
source = sourceManager.get(manga.source);
|
||||
start(DB_CHAPTERS);
|
||||
if (this.manga != null)
|
||||
return;
|
||||
|
||||
add(db.getChapters(manga).createObservable()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.doOnNext(chapters -> {
|
||||
this.chapters = chapters;
|
||||
EventBus.getDefault().postSticky(new ChapterCountEvent(chapters.size()));
|
||||
})
|
||||
.subscribe(chaptersSubject::onNext));
|
||||
this.manga = manga;
|
||||
source = sourceManager.get(manga.source);
|
||||
start(DB_CHAPTERS);
|
||||
|
||||
// Get chapters if it's an online source
|
||||
if (isCatalogueManga) {
|
||||
fetchChapters();
|
||||
}
|
||||
}
|
||||
add(db.getChapters(manga).createObservable()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.doOnNext(chapters -> {
|
||||
this.chapters = chapters;
|
||||
EventBus.getDefault().postSticky(new ChapterCountEvent(chapters.size()));
|
||||
for (Chapter chapter : chapters) {
|
||||
setChapterStatus(chapter);
|
||||
}
|
||||
})
|
||||
.subscribe(chaptersSubject::onNext));
|
||||
}
|
||||
|
||||
public void fetchChapters() {
|
||||
public void fetchChaptersFromSource() {
|
||||
start(FETCH_CHAPTERS);
|
||||
}
|
||||
|
||||
private void refreshChapters() {
|
||||
chaptersSubject.onNext(chapters);
|
||||
}
|
||||
|
||||
private Observable<PostResult> getOnlineChaptersObs() {
|
||||
return source
|
||||
.pullChaptersFromNetwork(manga.url)
|
||||
|
@ -127,8 +131,6 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> {
|
|||
if (onlyUnread) {
|
||||
observable = observable.filter(chapter -> !chapter.read);
|
||||
}
|
||||
|
||||
observable = observable.doOnNext(this::setChapterStatus);
|
||||
if (onlyDownloaded) {
|
||||
observable = observable.filter(chapter -> chapter.status == Download.DOWNLOADED);
|
||||
}
|
||||
|
@ -156,6 +158,17 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> {
|
|||
}
|
||||
}
|
||||
|
||||
public void updateChapterStatus(DownloadStatusEvent event) {
|
||||
for (Chapter chapter : chapters) {
|
||||
if (event.getChapter().id.equals(chapter.id)) {
|
||||
chapter.status = event.getStatus();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (onlyDownloaded && event.getStatus() == Download.DOWNLOADED)
|
||||
refreshChapters();
|
||||
}
|
||||
|
||||
public void onOpenChapter(Chapter chapter) {
|
||||
EventBus.getDefault().postSticky(new ReaderEvent(source, manga, chapter));
|
||||
}
|
||||
|
@ -190,30 +203,33 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> {
|
|||
public void deleteChapters(Observable<Chapter> selectedChapters) {
|
||||
add(selectedChapters
|
||||
.subscribe(chapter -> {
|
||||
// Somehow I can't delete files on Schedulers.io()
|
||||
downloadManager.deleteChapter(source, manga, chapter);
|
||||
downloadManager.getQueue().remove(chapter);
|
||||
chapter.status = Download.NOT_DOWNLOADED;
|
||||
}, error -> {
|
||||
Timber.e(error.getMessage());
|
||||
}, () -> {
|
||||
if (onlyDownloaded)
|
||||
refreshChapters();
|
||||
}));
|
||||
}
|
||||
|
||||
public void revertSortOrder() {
|
||||
//TODO manga.chapter_order
|
||||
sortOrderAToZ = !sortOrderAToZ;
|
||||
chaptersSubject.onNext(chapters);
|
||||
refreshChapters();
|
||||
}
|
||||
|
||||
public void setReadFilter(boolean onlyUnread) {
|
||||
//TODO do we need save filter for manga?
|
||||
this.onlyUnread = onlyUnread;
|
||||
chaptersSubject.onNext(chapters);
|
||||
refreshChapters();
|
||||
}
|
||||
|
||||
public void setDownloadedFilter(boolean onlyDownloaded) {
|
||||
this.onlyDownloaded = onlyDownloaded;
|
||||
chaptersSubject.onNext(chapters);
|
||||
}
|
||||
|
||||
public void setIsCatalogueManga(boolean value) {
|
||||
isCatalogueManga = value;
|
||||
refreshChapters();
|
||||
}
|
||||
|
||||
public boolean getSortOrder() {
|
||||
|
|
Reference in a new issue