Improve the refresh of chapter filters

This commit is contained in:
inorichi 2015-12-03 12:48:30 +01:00
parent ab216a3608
commit b986309b81
3 changed files with 61 additions and 38 deletions

View File

@ -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() {

View File

@ -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;
}

View File

@ -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() {