diff --git a/app/src/main/java/eu/kanade/mangafeed/data/download/DownloadManager.java b/app/src/main/java/eu/kanade/mangafeed/data/download/DownloadManager.java index 5b1825084b..dbf9025dd7 100644 --- a/app/src/main/java/eu/kanade/mangafeed/data/download/DownloadManager.java +++ b/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 getDownloadedImage(final Page page, File chapterDir) { if (page.getImageUrl() == null) { page.setStatus(Page.ERROR); diff --git a/app/src/main/java/eu/kanade/mangafeed/data/download/model/DownloadQueue.java b/app/src/main/java/eu/kanade/mangafeed/data/download/model/DownloadQueue.java index 33d6090b88..b7040d1b12 100644 --- a/app/src/main/java/eu/kanade/mangafeed/data/download/model/DownloadQueue.java +++ b/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) { diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersAdapter.java b/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersAdapter.java index 50fc4f9e7a..78123c0b39 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersAdapter.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersAdapter.java @@ -21,6 +21,7 @@ public class ChaptersAdapter extends FlexibleAdapter { this.fragment = fragment; mItems = new ArrayList<>(); clickListener = (OnItemClickListener) fragment; + setHasStableIds(true); } @Override @@ -38,6 +39,11 @@ public class ChaptersAdapter extends FlexibleAdapter { holder.onSetValues(fragment.getActivity(), chapter); } + @Override + public long getItemId(int position) { + return mItems.get(position).id; + } + public void setItems(List chapters) { mItems = chapters; notifyDataSetChanged(); diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersFragment.java b/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersFragment.java index 7cd422b6ef..43f9bbf0f8 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersFragment.java +++ b/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 implements @@ -51,6 +53,8 @@ public class ChaptersFragment extends BaseRxFragment 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 implemen @Override public void onResume() { super.onResume(); + observeChapterDownloadProgress(); } @Override public void onPause() { + unsubscribeChapterDownloadProgress(); super.onPause(); } @@ -169,16 +175,31 @@ public class ChaptersFragment extends BaseRxFragment 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 implemen adapter.toggleSelection(position, false); int count = adapter.getSelectedItemCount(); - if (count == 0) { actionMode.finish(); } else { diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersHolder.java b/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersHolder.java index 8801e0cc67..b761b9bbe1 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersHolder.java +++ b/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 diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersPresenter.java b/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersPresenter.java index 553020ff84..5193b7d68b 100644 --- a/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersPresenter.java +++ b/app/src/main/java/eu/kanade/mangafeed/ui/manga/chapter/ChaptersPresenter.java @@ -170,6 +170,12 @@ public class ChaptersPresenter extends BasePresenter { refreshChapters(); } + public Observable 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)); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2d8b8bf3c8..ad6efdd330 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -90,6 +90,7 @@ Downloaded Queued Downloading + Downloading (%1$d/%2$d) Error Error while fetching chapters