Browse Source

Update download progress in chapters fragment

inorichi 9 years ago
parent
commit
a304ccaaea

+ 8 - 6
app/src/main/java/eu/kanade/mangafeed/data/download/DownloadManager.java

@@ -192,7 +192,7 @@ public class DownloadManager {
                 // Do after download completes
                 .doOnCompleted(() -> onDownloadCompleted(download))
                 .toList()
-                .flatMap(pages -> Observable.just(download))
+                .map(pages -> download)
                 // If the page list threw, it will resume here
                 .onErrorResumeNext(error -> {
                     download.setStatus(Download.ERROR);
@@ -222,10 +222,12 @@ public class DownloadManager {
                     download.downloadedImages++;
                     page.setStatus(Page.READY);
                 })
-                // If the download fails, mark this page as error
-                .doOnError(e -> page.setStatus(Page.ERROR))
-                // Allow to download the remaining images
-                .onErrorResumeNext(e -> Observable.just(page));
+                // Mark this page as error and allow to download the remaining
+                .onErrorResumeNext(e -> {
+                    page.setProgress(0);
+                    page.setStatus(Page.ERROR);
+                    return Observable.just(page);
+                });
     }
 
     // Save image on disk
@@ -242,7 +244,7 @@ public class DownloadManager {
                 });
     }
 
-    // Public method to get the image from the filesystem. It does NOT provide any way to download the iamge
+    // Public method to get the image from the filesystem. It does NOT provide any way to download the image
     public Observable<Page> getDownloadedImage(final Page page, File chapterDir) {
         if (page.getImageUrl() == null) {
             page.setStatus(Page.ERROR);

+ 1 - 1
app/src/main/java/eu/kanade/mangafeed/data/download/model/DownloadQueue.java

@@ -68,7 +68,7 @@ public class DownloadQueue {
                         setPagesSubject(download.pages, pageStatusSubject);
                         return pageStatusSubject
                                 .filter(status -> status == Page.READY)
-                                .flatMap(status -> Observable.just(download));
+                                .map(status -> download);
 
                     } else if (download.getStatus() == Download.DOWNLOADED ||
                             download.getStatus() == Download.ERROR) {

+ 6 - 0
app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersAdapter.java

@@ -21,6 +21,7 @@ public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
         this.fragment = fragment;
         mItems = new ArrayList<>();
         clickListener = (OnItemClickListener) fragment;
+        setHasStableIds(true);
     }
 
     @Override
@@ -38,6 +39,11 @@ public class ChaptersAdapter extends FlexibleAdapter<ChaptersHolder, Chapter> {
         holder.onSetValues(fragment.getActivity(), chapter);
     }
 
+    @Override
+    public long getItemId(int position) {
+        return mItems.get(position).id;
+    }
+
     public void setItems(List<Chapter> chapters) {
         mItems = chapters;
         notifyDataSetChanged();

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

@@ -2,6 +2,7 @@ package eu.kanade.mangafeed.ui.manga.chapter;
 
 import android.content.Intent;
 import android.os.Bundle;
+import android.support.annotation.Nullable;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.view.ActionMode;
@@ -33,6 +34,7 @@ import eu.kanade.mangafeed.ui.reader.ReaderActivity;
 import eu.kanade.mangafeed.util.ToastUtil;
 import nucleus.factory.RequiresPresenter;
 import rx.Observable;
+import rx.Subscription;
 
 @RequiresPresenter(ChaptersPresenter.class)
 public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implements
@@ -51,6 +53,8 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
     private LinearLayoutManager linearLayout;
     private ActionMode actionMode;
 
+    private Subscription downloadProgressSubscription;
+
     public static ChaptersFragment newInstance() {
         return new ChaptersFragment();
     }
@@ -105,10 +109,12 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
     @Override
     public void onResume() {
         super.onResume();
+        observeChapterDownloadProgress();
     }
 
     @Override
     public void onPause() {
+        unsubscribeChapterDownloadProgress();
         super.onPause();
     }
 
@@ -169,16 +175,31 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
         startActivity(intent);
     }
 
+    private void observeChapterDownloadProgress() {
+        downloadProgressSubscription = getPresenter().getDownloadProgressObs()
+                .subscribe(this::onDownloadProgressChange);
+    }
+
+    private void unsubscribeChapterDownloadProgress() {
+        if (downloadProgressSubscription != null)
+            downloadProgressSubscription.unsubscribe();
+    }
+
+    private void onDownloadProgressChange(Download download) {
+        ChaptersHolder holder = getHolder(download.chapter);
+        if (holder != null)
+            holder.onProgressChange(getContext(), download.downloadedImages, download.pages.size());
+    }
+
     public void onChapterStatusChange(Download download) {
-        Chapter chapter;
-        for (int i = linearLayout.findFirstVisibleItemPosition(); i < linearLayout.findLastVisibleItemPosition(); i++) {
-            int pos = recyclerView.getChildAdapterPosition(linearLayout.findViewByPosition(i));
-            chapter = adapter.getItem(pos);
-            if (chapter != null && download.chapter.id.equals(chapter.id)) {
-                adapter.notifyItemChanged(i);
-                break;
-            }
-        }
+        ChaptersHolder holder = getHolder(download.chapter);
+        if (holder != null)
+            holder.onStatusChange(download.getStatus());
+    }
+
+    @Nullable
+    private ChaptersHolder getHolder(Chapter chapter) {
+        return (ChaptersHolder) recyclerView.findViewHolderForItemId(chapter.id);
     }
 
     @Override
@@ -280,7 +301,6 @@ public class ChaptersFragment extends BaseRxFragment<ChaptersPresenter> implemen
         adapter.toggleSelection(position, false);
 
         int count = adapter.getSelectedItemCount();
-
         if (count == 0) {
             actionMode.finish();
         } else {

+ 15 - 6
app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersHolder.java

@@ -62,7 +62,18 @@ public class ChaptersHolder extends RecyclerView.ViewHolder implements
             pages.setText("");
         }
 
-        switch (chapter.status) {
+        onStatusChange(chapter.status);
+        date.setText(sdf.format(new Date(chapter.date_upload)));
+
+        toggleActivation();
+    }
+
+    private void toggleActivation() {
+        itemView.setActivated(adapter.isSelected(getAdapterPosition()));
+    }
+
+    public void onStatusChange(int status) {
+        switch (status) {
             case Download.QUEUE:
                 downloadText.setText(R.string.chapter_queued); break;
             case Download.DOWNLOADING:
@@ -74,13 +85,11 @@ public class ChaptersHolder extends RecyclerView.ViewHolder implements
             default:
                 downloadText.setText(""); break;
         }
-
-        date.setText(sdf.format(new Date(chapter.date_upload)));
-        toggleActivation();
     }
 
-    private void toggleActivation() {
-        itemView.setActivated(adapter.isSelected(getAdapterPosition()));
+    public void onProgressChange(Context context, int downloaded, int total) {
+        downloadText.setText(context.getString(
+                R.string.chapter_downloading_progress, downloaded, total));
     }
 
     @Override

+ 6 - 0
app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersPresenter.java

@@ -170,6 +170,12 @@ public class ChaptersPresenter extends BasePresenter<ChaptersFragment> {
             refreshChapters();
     }
 
+    public Observable<Download> getDownloadProgressObs() {
+        return downloadManager.getQueue().getProgressObservable()
+                .filter(download -> download.manga.id.equals(manga.id))
+                .observeOn(AndroidSchedulers.mainThread());
+    }
+
     public void onOpenChapter(Chapter chapter) {
         EventBus.getDefault().postSticky(new ReaderEvent(source, manga, chapter));
     }

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -90,6 +90,7 @@
     <string name="chapter_downloaded">Downloaded</string>
     <string name="chapter_queued">Queued</string>
     <string name="chapter_downloading">Downloading</string>
+    <string name="chapter_downloading_progress">Downloading (%1$d/%2$d)</string>
     <string name="chapter_error">Error</string>
     <string name="fetch_chapters_error">Error while fetching chapters</string>