diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.java b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.java index dbfb5bf2d4..e6daa24e67 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.java +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.java @@ -13,6 +13,7 @@ import java.util.List; import javax.inject.Inject; +import eu.kanade.tachiyomi.data.cache.ChapterCache; import eu.kanade.tachiyomi.data.database.DatabaseHelper; import eu.kanade.tachiyomi.data.database.models.Chapter; import eu.kanade.tachiyomi.data.database.models.Manga; @@ -43,6 +44,7 @@ public class ReaderPresenter extends BasePresenter { @Inject DownloadManager downloadManager; @Inject MangaSyncManager syncManager; @Inject SourceManager sourceManager; + @Inject ChapterCache chapterCache; @State Manga manga; @State Chapter activeChapter; @@ -288,8 +290,14 @@ public class ReaderPresenter extends BasePresenter { } public void retryPage(Page page) { - page.setStatus(Page.QUEUE); - retryPageSubject.onNext(page); + if (page != null) { + page.setStatus(Page.QUEUE); + if (page.getImagePath() != null) { + File file = new File(page.getImagePath()); + chapterCache.removeFileFromCache(file.getName()); + } + retryPageSubject.onNext(page); + } } // Called before loading another chapter or leaving the reader. It allows to do operations diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/base/PageDecodeErrorLayout.java b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/base/PageDecodeErrorLayout.java new file mode 100644 index 0000000000..6469d9c864 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/base/PageDecodeErrorLayout.java @@ -0,0 +1,67 @@ +package eu.kanade.tachiyomi.ui.reader.viewer.base; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.support.v4.content.ContextCompat; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; + +import eu.kanade.tachiyomi.R; +import eu.kanade.tachiyomi.data.source.model.Page; +import eu.kanade.tachiyomi.ui.reader.ReaderActivity; +import rx.functions.Action0; + +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; + +public class PageDecodeErrorLayout extends LinearLayout { + + private final int lightGreyColor; + private final int blackColor; + + public PageDecodeErrorLayout(Context context) { + super(context); + setOrientation(LinearLayout.VERTICAL); + setGravity(Gravity.CENTER); + + lightGreyColor = ContextCompat.getColor(context, R.color.light_grey); + blackColor = ContextCompat.getColor(context, R.color.primary_text); + } + + public PageDecodeErrorLayout(Context context, Page page, int theme, Action0 retryListener) { + this(context); + + TextView errorText = new TextView(context); + errorText.setGravity(Gravity.CENTER); + errorText.setText(R.string.decode_image_error); + errorText.setTextColor(theme == ReaderActivity.BLACK_THEME ? lightGreyColor : blackColor); + + Button retryButton = new Button(context); + retryButton.setLayoutParams(new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)); + retryButton.setText(R.string.action_retry); + retryButton.setOnClickListener((v) -> { + removeAllViews(); + retryListener.call(); + }); + + Button openInBrowserButton = new Button(context); + openInBrowserButton.setLayoutParams(new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)); + openInBrowserButton.setText(R.string.action_open_in_browser); + openInBrowserButton.setOnClickListener((v) -> { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(page.getImageUrl())); + context.startActivity(intent); + }); + + if (page.getImageUrl() == null) { + openInBrowserButton.setVisibility(View.GONE); + } + + addView(errorText); + addView(retryButton); + addView(openInBrowserButton); + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReader.java b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReader.java index 13fa738506..7e953948ef 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReader.java +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReader.java @@ -65,21 +65,21 @@ public abstract class PagerReader extends BaseReader { .doOnNext(this::setDecoderClass) .skip(1) .distinctUntilChanged() - .subscribe(v -> pager.setAdapter(adapter))); + .subscribe(v -> refreshPages())); subscriptions.add(preferences.imageScaleType() .asObservable() .doOnNext(this::setImageScaleType) .skip(1) .distinctUntilChanged() - .subscribe(v -> pager.setAdapter(adapter))); + .subscribe(v -> refreshPages())); subscriptions.add(preferences.zoomStart() .asObservable() .doOnNext(this::setZoomStart) .skip(1) .distinctUntilChanged() - .subscribe(v -> pager.setAdapter(adapter))); + .subscribe(v -> refreshPages())); subscriptions.add(preferences.enableTransitions() .asObservable() @@ -147,6 +147,11 @@ public abstract class PagerReader extends BaseReader { pager.setCurrentItem(pageNumber, false); } + private void refreshPages() { + pager.setAdapter(adapter); + pager.setCurrentItem(currentPage, false); + } + protected void onLeftSideTap() { moveToPrevious(); } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReaderFragment.java b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReaderFragment.java index 1d8c32875b..a4872f7d2e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReaderFragment.java +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReaderFragment.java @@ -4,7 +4,6 @@ import android.graphics.PointF; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -27,6 +26,7 @@ import eu.kanade.tachiyomi.R; import eu.kanade.tachiyomi.data.source.model.Page; import eu.kanade.tachiyomi.ui.base.fragment.BaseFragment; import eu.kanade.tachiyomi.ui.reader.ReaderActivity; +import eu.kanade.tachiyomi.ui.reader.viewer.base.PageDecodeErrorLayout; import eu.kanade.tachiyomi.ui.reader.viewer.pager.horizontal.RightToLeftReader; import eu.kanade.tachiyomi.ui.reader.viewer.pager.vertical.VerticalReader; import rx.Observable; @@ -103,14 +103,13 @@ public class PagerReaderFragment extends BaseFragment { @Override public void onImageLoadError(Exception e) { - showImageLoadError(); + showImageDecodeError(); } }); retryButton.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_UP) { - if (page != null) - activity.getPresenter().retryPage(page); + activity.getPresenter().retryPage(page); } return true; }); @@ -175,18 +174,16 @@ public class PagerReaderFragment extends BaseFragment { retryButton.setVisibility(View.GONE); } - private void showImageLoadError() { + private void showImageDecodeError() { ViewGroup view = (ViewGroup) getView(); if (view == null) return; - TextView errorText = new TextView(getContext()); - errorText.setGravity(Gravity.CENTER); - errorText.setText(R.string.decode_image_error); - errorText.setTextColor(getReaderActivity().getReaderTheme() == ReaderActivity.BLACK_THEME ? - lightGreyColor : blackColor); + LinearLayout errorLayout = new PageDecodeErrorLayout(getContext(), page, + getReaderActivity().getReaderTheme(), + () -> getReaderActivity().getPresenter().retryPage(page)); - view.addView(errorText); + view.addView(errorLayout); } private void processStatus(int status) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonHolder.java b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonHolder.java index f0d52b496a..9e5d8ee60f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonHolder.java +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonHolder.java @@ -62,8 +62,7 @@ public class WebtoonHolder extends RecyclerView.ViewHolder { container.setOnTouchListener(touchListener); retryButton.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_UP) { - if (page != null) - adapter.retryPage(page); + adapter.retryPage(page); } return true; }); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0d12cfe8a5..d84d3286c0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -41,6 +41,7 @@ Previous chapter Next chapter Retry + Open in browser Change display mode @@ -211,7 +212,7 @@ Chapter %1$s Next chapter not found Previous chapter not found - Image could not be loaded.\nTry changing the image decoder + Image could not be loaded.\nTry changing the image decoder or with one of the options below Update last chapter read in enabled services to %1$d?