mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Allow to retry image when decoding fails or open in the browser. Fixes #177 and fixes #120. Also fix a bug where the current page was not restored when changing settings.
This commit is contained in:
		| @@ -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<ReaderActivity> { | ||||
|     @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<ReaderActivity> { | ||||
|     } | ||||
|  | ||||
|     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 | ||||
|   | ||||
| @@ -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); | ||||
|     } | ||||
| } | ||||
| @@ -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(); | ||||
|     } | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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; | ||||
|         }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user