mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Update download progress in chapters fragment
This commit is contained in:
		| @@ -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); | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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(); | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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)); | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user