Allow manual retries of images (needs improvement)

This commit is contained in:
inorichi
2015-11-16 16:44:33 +01:00
parent e6c230cbe3
commit b002a125fd
8 changed files with 106 additions and 33 deletions
@@ -15,6 +15,7 @@ import eu.kanade.mangafeed.data.download.DownloadManager;
import eu.kanade.mangafeed.data.preference.PreferencesHelper;
import eu.kanade.mangafeed.data.source.base.Source;
import eu.kanade.mangafeed.data.source.model.Page;
import eu.kanade.mangafeed.event.RetryPageEvent;
import eu.kanade.mangafeed.event.SourceMangaChapterEvent;
import eu.kanade.mangafeed.ui.base.presenter.BasePresenter;
import eu.kanade.mangafeed.util.EventBusHook;
@@ -23,6 +24,7 @@ import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import rx.subjects.PublishSubject;
import timber.log.Timber;
public class ReaderPresenter extends BasePresenter<ReaderActivity> {
@@ -40,21 +42,29 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
private boolean isDownloaded;
@State int currentPage;
private PublishSubject<Page> retryPageSubject;
private Subscription nextChapterSubscription;
private Subscription previousChapterSubscription;
private static final int GET_PAGE_LIST = 1;
private static final int GET_PAGE_IMAGES = 2;
private static final int RETRY_IMAGES = 3;
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
retryPageSubject = PublishSubject.create();
restartableLatestCache(GET_PAGE_LIST,
() -> getPageListObservable()
.doOnNext(pages -> pageList = pages)
.doOnCompleted(this::getAdjacentChapters)
.doOnCompleted(() -> start(GET_PAGE_IMAGES)),
.doOnCompleted(() -> {
getAdjacentChapters();
start(GET_PAGE_IMAGES);
start(RETRY_IMAGES);
}),
(view, pages) -> {
view.onPageListReady(pages);
if (currentPage != 0)
@@ -67,6 +77,10 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
(view, page) -> {},
(view, error) -> Timber.e("An error occurred while downloading an image"));
restartableLatestCache(RETRY_IMAGES,
this::getRetryPageObservable,
(view, page) -> {},
(view, error) -> Timber.e("An error occurred while downloading an image"));
}
@Override
@@ -95,6 +109,14 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
loadChapter(event.getChapter());
}
@EventBusHook
public void onEventMainThread(RetryPageEvent event) {
EventBus.getDefault().removeStickyEvent(event);
Page page = event.getPage();
page.setStatus(Page.QUEUE);
retryPageSubject.onNext(page);
}
private void loadChapter(Chapter chapter) {
this.chapter = chapter;
isDownloaded = isChapterDownloaded(chapter);
@@ -129,9 +151,9 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
Observable<Page> pages;
if (!isDownloaded) {
pages = Observable
.merge(Observable.from(pageList).filter(page -> page.getImageUrl() != null),
source.getRemainingImageUrlsFromPageList(pageList))
pages = Observable.from(pageList)
.filter(page -> page.getImageUrl() != null)
.mergeWith(source.getRemainingImageUrlsFromPageList(pageList))
.flatMap(source::getCachedImage);
} else {
File chapterDir = downloadManager.getAbsoluteChapterDirectory(source, manga, chapter);
@@ -144,8 +166,15 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
.observeOn(AndroidSchedulers.mainThread());
}
public void retryPage(Page page) {
private Observable<Page> getRetryPageObservable() {
return retryPageSubject
.flatMap(page -> {
if (page.getImageUrl() == null)
return source.getImageUrlFromPage(page);
return Observable.just(page);
})
.flatMap(source::getCachedImage)
.subscribeOn(Schedulers.io());
}
public void setCurrentPage(int currentPage) {
@@ -33,10 +33,6 @@ public abstract class BaseReader {
return getCurrentPageIndex(currentPosition);
}
public void retryPage(Page page) {
activity.getPresenter().retryPage(page);
}
public void requestNextChapter() {
activity.getPresenter().setCurrentPage(getCurrentPosition());
activity.getPresenter().loadNextChapter();
@@ -5,6 +5,7 @@ import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
@@ -17,8 +18,11 @@ import java.util.concurrent.atomic.AtomicInteger;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import de.greenrobot.event.EventBus;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.source.model.Page;
import eu.kanade.mangafeed.event.RetryPageEvent;
import eu.kanade.mangafeed.ui.base.fragment.BaseFragment;
import eu.kanade.mangafeed.ui.reader.ReaderActivity;
import rx.Observable;
@@ -34,6 +38,7 @@ public class ViewPagerReaderFragment extends BaseFragment {
@Bind(R.id.progress) ProgressBar progressBar;
@Bind(R.id.progress_text) TextView progressText;
@Bind(R.id.image_error) TextView errorText;
@Bind(R.id.retry_button) Button retryButton;
private Page page;
private Subscription progressSubscription;
@@ -81,6 +86,11 @@ public class ViewPagerReaderFragment extends BaseFragment {
this.page = page;
}
@OnClick(R.id.retry_button)
void retry() {
EventBus.getDefault().postSticky(new RetryPageEvent(page));
}
private void showImage() {
if (page == null || page.getImagePath() == null)
return;
@@ -90,10 +100,12 @@ public class ViewPagerReaderFragment extends BaseFragment {
}
private void showDownloading() {
progressContainer.setVisibility(View.VISIBLE);
progressText.setVisibility(View.VISIBLE);
}
private void showLoading() {
progressContainer.setVisibility(View.VISIBLE);
progressText.setVisibility(View.VISIBLE);
progressText.setText(R.string.downloading);
}
@@ -101,10 +113,19 @@ public class ViewPagerReaderFragment extends BaseFragment {
private void showError() {
progressContainer.setVisibility(View.GONE);
errorText.setVisibility(View.VISIBLE);
retryButton.setVisibility(View.VISIBLE);
}
private void hideError() {
errorText.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE);
}
private void processStatus(int status) {
switch (status) {
case Page.QUEUE:
hideError();
break;
case Page.LOAD_PAGE:
showLoading();
break;