From 68e5efb02b7998be47337115c90497e52538ae0b Mon Sep 17 00:00:00 2001
From: inorichi <chibilen@gmail.com>
Date: Tue, 27 Oct 2015 17:12:16 +0100
Subject: [PATCH] Better error handling for images

---
 .../eu/kanade/mangafeed/data/models/Page.java | 13 +++++
 .../mangafeed/presenter/ReaderPresenter.java  | 13 ++---
 .../kanade/mangafeed/sources/base/Source.java |  7 ++-
 .../mangafeed/ui/activity/ReaderActivity.java |  7 ++-
 .../ui/adapter/ReaderPageAdapter.java         |  2 +-
 .../ui/fragment/ReaderPageFragment.java       | 47 ++++++++++---------
 .../mangafeed/ui/viewer/VerticalViewer.java   |  2 +-
 .../mangafeed/ui/viewer/WebtoonViewer.java    |  2 +-
 .../mangafeed/ui/viewer/base/BaseViewer.java  |  2 +-
 .../ui/viewer/base/ViewPagerViewer.java       |  2 +-
 app/src/main/res/layout/fragment_page.xml     | 11 ++++-
 11 files changed, 69 insertions(+), 39 deletions(-)

diff --git a/app/src/main/java/eu/kanade/mangafeed/data/models/Page.java b/app/src/main/java/eu/kanade/mangafeed/data/models/Page.java
index 2ac2b4f48..076bc33ca 100644
--- a/app/src/main/java/eu/kanade/mangafeed/data/models/Page.java
+++ b/app/src/main/java/eu/kanade/mangafeed/data/models/Page.java
@@ -6,6 +6,11 @@ public class Page {
     private String url;
     private String imageUrl;
     private String imagePath;
+    private int status;
+
+    public static final int DOWNLOAD = 0;
+    public static final int READY = 1;
+    public static final int ERROR = 2;
 
     public Page(int pageNumber, String url, String imageUrl, String imagePath) {
         this.pageNumber = pageNumber;
@@ -42,6 +47,14 @@ public class Page {
         this.imagePath = imagePath;
     }
 
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
     @Override
     public String toString() {
         return "Page{" +
diff --git a/app/src/main/java/eu/kanade/mangafeed/presenter/ReaderPresenter.java b/app/src/main/java/eu/kanade/mangafeed/presenter/ReaderPresenter.java
index 1b916e86e..74037f8a3 100644
--- a/app/src/main/java/eu/kanade/mangafeed/presenter/ReaderPresenter.java
+++ b/app/src/main/java/eu/kanade/mangafeed/presenter/ReaderPresenter.java
@@ -52,7 +52,7 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
         restartableReplay(GET_PAGE_IMAGES,
                 this::getPageImagesObservable,
                 (view, page) -> {
-                    view.onImageReady(page);
+                    view.onNextPage(page);
                     if (page.getPageNumber() == savedSelectedPage) {
                         view.setCurrentPage(savedSelectedPage);
                     }
@@ -100,9 +100,10 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
 
     private Observable<Page> getPageImagesObservable() {
         return Observable.merge(
-                Observable.from(pageList).filter(page -> page.getImageUrl() != null),
-                source.getRemainingImageUrlsFromPageList(pageList)
-                        .doOnNext(this::replacePageUrl))
+                    Observable.from(pageList).filter(page -> page.getImageUrl() != null),
+                    source.getRemainingImageUrlsFromPageList(pageList)
+                         .doOnNext(this::replacePageUrl)
+                )
                 .flatMap(this::downloadImage)
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread());
@@ -115,9 +116,9 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
         try {
             File cacheFile = future.get();
             page.setImagePath(cacheFile.getCanonicalPath());
-
+            page.setStatus(Page.READY);
         } catch (Exception e) {
-            e.printStackTrace();
+            page.setStatus(Page.ERROR);
         }
 
         return Observable.just(page);
diff --git a/app/src/main/java/eu/kanade/mangafeed/sources/base/Source.java b/app/src/main/java/eu/kanade/mangafeed/sources/base/Source.java
index 0ddc3b884..0c43b47f8 100644
--- a/app/src/main/java/eu/kanade/mangafeed/sources/base/Source.java
+++ b/app/src/main/java/eu/kanade/mangafeed/sources/base/Source.java
@@ -80,9 +80,10 @@ public abstract class Source extends BaseSource {
     public Observable<Page> getRemainingImageUrlsFromPageList(final List<Page> pages) {
         return Observable.from(pages)
                 .filter(page -> page.getImageUrl() == null)
+                .doOnNext(page -> page.setStatus(Page.DOWNLOAD))
                 .window(overrideNumberOfConcurrentPageDownloads())
                 .concatMap(batchedPages ->
-                        batchedPages.concatMap(this::getImageUrlFromPage)
+                                batchedPages.concatMap(this::getImageUrlFromPage)
                 );
     }
 
@@ -90,6 +91,10 @@ public abstract class Source extends BaseSource {
         return mNetworkService
                 .getStringResponse(overrideRemainingPagesUrl(page.getUrl()), mRequestHeaders, null)
                 .flatMap(unparsedHtml -> Observable.just(parseHtmlToImageUrl(unparsedHtml)))
+                .onErrorResumeNext(e -> {
+                    page.setStatus(Page.ERROR);
+                    return Observable.just(null);
+                })
                 .flatMap(imageUrl -> {
                     page.setImageUrl(imageUrl);
                     return Observable.just(page);
diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/activity/ReaderActivity.java b/app/src/main/java/eu/kanade/mangafeed/ui/activity/ReaderActivity.java
index fa3681a7b..704b354de 100644
--- a/app/src/main/java/eu/kanade/mangafeed/ui/activity/ReaderActivity.java
+++ b/app/src/main/java/eu/kanade/mangafeed/ui/activity/ReaderActivity.java
@@ -71,8 +71,8 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
         viewer.onPageListReady(pages);
     }
 
-    public void onImageReady(Page page) {
-        viewer.onImageReady(page);
+    public void onNextPage(Page page) {
+        viewer.onNextPage(page);
     }
 
     public void onPageChanged(int currentPage, int totalPages) {
@@ -101,8 +101,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
     }
 
     private BaseViewer getViewer() {
-        int prefsViewer = prefs.getDefaultViewer();
-        switch (prefsViewer) {
+        switch (prefs.getDefaultViewer()) {
             case LEFT_TO_RIGHT:
                 return new LeftToRightViewer(this, container);
             case RIGHT_TO_LEFT:
diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/adapter/ReaderPageAdapter.java b/app/src/main/java/eu/kanade/mangafeed/ui/adapter/ReaderPageAdapter.java
index 522a0f1bc..2deb8f5fe 100644
--- a/app/src/main/java/eu/kanade/mangafeed/ui/adapter/ReaderPageAdapter.java
+++ b/app/src/main/java/eu/kanade/mangafeed/ui/adapter/ReaderPageAdapter.java
@@ -43,7 +43,7 @@ public class ReaderPageAdapter extends SmartFragmentStatePagerAdapter {
 
         ReaderPageFragment fragment = (ReaderPageFragment)getRegisteredFragment(position);
         if (fragment != null) {
-            fragment.setPage(page);
+            fragment.replacePage(page);
         }
     }
 
diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/fragment/ReaderPageFragment.java b/app/src/main/java/eu/kanade/mangafeed/ui/fragment/ReaderPageFragment.java
index 1ff2e1248..9354175b4 100644
--- a/app/src/main/java/eu/kanade/mangafeed/ui/fragment/ReaderPageFragment.java
+++ b/app/src/main/java/eu/kanade/mangafeed/ui/fragment/ReaderPageFragment.java
@@ -7,6 +7,7 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ProgressBar;
+import android.widget.TextView;
 
 import com.davemorrissey.labs.subscaleview.ImageSource;
 import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
@@ -18,19 +19,17 @@ import eu.kanade.mangafeed.data.models.Page;
 import eu.kanade.mangafeed.ui.activity.ReaderActivity;
 
 public class ReaderPageFragment extends Fragment {
-    public static final String URL_ARGUMENT_KEY = "UrlArgumentKey";
 
     @Bind(R.id.page_image_view) SubsamplingScaleImageView imageView;
     @Bind(R.id.progress) ProgressBar progressBar;
+    @Bind(R.id.image_error) TextView errorText;
 
-    private String imagePath;
+    private Page page;
 
     public static ReaderPageFragment newInstance(Page page) {
-        ReaderPageFragment newInstance = new ReaderPageFragment();
-        Bundle arguments = new Bundle();
-        arguments.putString(URL_ARGUMENT_KEY, page.getImagePath());
-        newInstance.setArguments(arguments);
-        return newInstance;
+        ReaderPageFragment fragment = new ReaderPageFragment();
+        fragment.setPage(page);
+        return fragment;
     }
 
     @Override
@@ -38,26 +37,32 @@ public class ReaderPageFragment extends Fragment {
         super.onCreate(savedInstanceState);
 
         setRetainInstance(true);
+    }
 
-        Bundle arguments = getArguments();
-        if (arguments != null) {
-            if (arguments.containsKey(URL_ARGUMENT_KEY)) {
-                imagePath = arguments.getString(URL_ARGUMENT_KEY);
-            }
-        }
+    public void replacePage(Page page) {
+        this.page = page;
+        loadImage();
     }
 
     public void setPage(Page page) {
-        if (!page.getImageUrl().equals(imagePath)) {
-            imagePath = page.getImagePath();
-            loadImage();
-        }
+        this.page = page;
     }
 
     private void loadImage() {
-        if (imagePath != null) {
-            progressBar.setVisibility(View.GONE);
-            imageView.setImage(ImageSource.uri(imagePath).tilingDisabled());
+        if (page == null)
+            return;
+
+        switch (page.getStatus()) {
+            case (Page.READY):
+                imageView.setImage(ImageSource.uri(page.getImagePath()).tilingDisabled());
+                progressBar.setVisibility(View.GONE);
+                break;
+            case (Page.DOWNLOAD):
+                progressBar.setVisibility(View.VISIBLE);
+                break;
+            case (Page.ERROR):
+                progressBar.setVisibility(View.GONE);
+                errorText.setVisibility(View.VISIBLE);
         }
 
     }
@@ -73,8 +78,6 @@ public class ReaderPageFragment extends Fragment {
         imageView.setOnTouchListener((v, motionEvent) ->
                 ((ReaderActivity) getActivity()).onImageTouch(motionEvent));
 
-        progressBar.setVisibility(View.VISIBLE);
-
         loadImage();
 
         return view;
diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/viewer/VerticalViewer.java b/app/src/main/java/eu/kanade/mangafeed/ui/viewer/VerticalViewer.java
index 4c5b652d1..cda338966 100644
--- a/app/src/main/java/eu/kanade/mangafeed/ui/viewer/VerticalViewer.java
+++ b/app/src/main/java/eu/kanade/mangafeed/ui/viewer/VerticalViewer.java
@@ -59,7 +59,7 @@ public class VerticalViewer extends BaseViewer {
     }
 
     @Override
-    public void onImageReady(Page page) {
+    public void onNextPage(Page page) {
         adapter.replacePage(getPosFromPage(page), page);
     }
 
diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/viewer/WebtoonViewer.java b/app/src/main/java/eu/kanade/mangafeed/ui/viewer/WebtoonViewer.java
index 97159b110..574061134 100644
--- a/app/src/main/java/eu/kanade/mangafeed/ui/viewer/WebtoonViewer.java
+++ b/app/src/main/java/eu/kanade/mangafeed/ui/viewer/WebtoonViewer.java
@@ -34,7 +34,7 @@ public class WebtoonViewer extends BaseViewer {
     }
 
     @Override
-    public void onImageReady(Page page) {
+    public void onNextPage(Page page) {
         adapter.setPage(getPosFromPage(page), page);
     }
 
diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/BaseViewer.java b/app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/BaseViewer.java
index e8d899286..d3b89a710 100644
--- a/app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/BaseViewer.java
+++ b/app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/BaseViewer.java
@@ -33,6 +33,6 @@ public abstract class BaseViewer {
 
     public abstract int getTotalPages();
     public abstract void onPageListReady(List<Page> pages);
-    public abstract void onImageReady(Page page);
+    public abstract void onNextPage(Page page);
     public abstract boolean onImageTouch(MotionEvent motionEvent);
 }
diff --git a/app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/ViewPagerViewer.java b/app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/ViewPagerViewer.java
index 34245bbda..21cac584b 100644
--- a/app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/ViewPagerViewer.java
+++ b/app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/ViewPagerViewer.java
@@ -72,7 +72,7 @@ public abstract class ViewPagerViewer extends BaseViewer {
     }
 
     @Override
-    public void onImageReady(Page page) {
+    public void onNextPage(Page page) {
         adapter.replacePage(getPosFromPage(page), page);
     }
 
diff --git a/app/src/main/res/layout/fragment_page.xml b/app/src/main/res/layout/fragment_page.xml
index 5f48d4f04..14945aebd 100644
--- a/app/src/main/res/layout/fragment_page.xml
+++ b/app/src/main/res/layout/fragment_page.xml
@@ -13,6 +13,15 @@
         android:layout_gravity="center_vertical|center_horizontal"
         android:visibility="gone" />
 
-        <include layout="@layout/chapter_image"/>
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/image_error"
+        android:text=":("
+        android:layout_gravity="center"
+        android:textSize="32sp"
+        android:visibility="gone"/>
+
+    <include layout="@layout/chapter_image"/>
 
 </FrameLayout>
\ No newline at end of file