Browse Source

Improve the refresh of chapter filters

inorichi 9 years ago
parent
commit
b986309b81

+ 0 - 1
app/src/main/java/eu/kanade/mangafeed/data/download/DownloadManager.java

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

+ 18 - 10
app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersFragment.java

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

+ 45 - 29
app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersPresenter.java

@@ -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);
-
-            add(db.getChapters(manga).createObservable()
-                    .subscribeOn(Schedulers.io())
-                    .doOnNext(chapters -> {
-                        this.chapters = chapters;
-                        EventBus.getDefault().postSticky(new ChapterCountEvent(chapters.size()));
-                    })
-                    .subscribe(chaptersSubject::onNext));
-
-            // Get chapters if it's an online source
-            if (isCatalogueManga) {
-                fetchChapters();
-            }
-        }
+        if (this.manga != null)
+            return;
+
+        this.manga = manga;
+        source = sourceManager.get(manga.source);
+        start(DB_CHAPTERS);
+
+        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() {