mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Add minor improvements and retry button to webtoon reader.
This commit is contained in:
		| @@ -51,7 +51,7 @@ public class PagerReaderFragment extends BaseFragment { | ||||
|  | ||||
|     @Override | ||||
|     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { | ||||
|         View view = inflater.inflate(R.layout.fragment_page, container, false); | ||||
|         View view = inflater.inflate(R.layout.item_pager_reader, container, false); | ||||
|         ButterKnife.bind(this, view); | ||||
|         ReaderActivity activity = (ReaderActivity) getActivity(); | ||||
|  | ||||
|   | ||||
| @@ -4,31 +4,23 @@ import android.support.v7.widget.RecyclerView; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.view.animation.Animation; | ||||
| import android.view.animation.AnimationUtils; | ||||
| import android.widget.ProgressBar; | ||||
|  | ||||
| import com.davemorrissey.labs.subscaleview.ImageSource; | ||||
| import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import butterknife.Bind; | ||||
| import butterknife.ButterKnife; | ||||
| import eu.kanade.mangafeed.R; | ||||
| import eu.kanade.mangafeed.data.source.model.Page; | ||||
|  | ||||
| public class WebtoonAdapter extends RecyclerView.Adapter<WebtoonAdapter.ImageHolder> { | ||||
| public class WebtoonAdapter extends RecyclerView.Adapter<WebtoonHolder> { | ||||
|  | ||||
|     private List<Page> pages; | ||||
|     private WebtoonReader fragment; | ||||
|     private View.OnTouchListener listener; | ||||
|     private List<Page> pages; | ||||
|     private View.OnTouchListener touchListener; | ||||
|  | ||||
|     public WebtoonAdapter(WebtoonReader fragment) { | ||||
|         this.fragment = fragment; | ||||
|         pages = new ArrayList<>(); | ||||
|         listener = (v, event) -> fragment.onImageTouch(event); | ||||
|         touchListener = (v, event) -> fragment.onImageTouch(event); | ||||
|     } | ||||
|  | ||||
|     public Page getItem(int position) { | ||||
| @@ -36,14 +28,14 @@ public class WebtoonAdapter extends RecyclerView.Adapter<WebtoonAdapter.ImageHol | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public ImageHolder onCreateViewHolder(ViewGroup parent, int viewType) { | ||||
|     public WebtoonHolder onCreateViewHolder(ViewGroup parent, int viewType) { | ||||
|         LayoutInflater inflater = fragment.getActivity().getLayoutInflater(); | ||||
|         View v = inflater.inflate(R.layout.item_webtoon_reader, parent, false); | ||||
|         return new ImageHolder(v, listener); | ||||
|         return new WebtoonHolder(v, this, touchListener); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onBindViewHolder(ImageHolder holder, int position) { | ||||
|     public void onBindViewHolder(WebtoonHolder holder, int position) { | ||||
|         final Page page = getItem(position); | ||||
|         holder.onSetValues(page); | ||||
|     } | ||||
| @@ -53,9 +45,9 @@ public class WebtoonAdapter extends RecyclerView.Adapter<WebtoonAdapter.ImageHol | ||||
|         return pages.size(); | ||||
|     } | ||||
|  | ||||
|     public void addPage(Page page) { | ||||
|         pages.add(page); | ||||
|         notifyItemInserted(page.getPageNumber()); | ||||
|     public void setPages(List<Page> pages) { | ||||
|         this.pages = pages; | ||||
|         notifyDataSetChanged(); | ||||
|     } | ||||
|  | ||||
|     public void clear() { | ||||
| @@ -65,41 +57,8 @@ public class WebtoonAdapter extends RecyclerView.Adapter<WebtoonAdapter.ImageHol | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static class ImageHolder extends RecyclerView.ViewHolder { | ||||
|  | ||||
|         @Bind(R.id.page_image_view) SubsamplingScaleImageView imageView; | ||||
|         @Bind(R.id.progress) ProgressBar progressBar; | ||||
|  | ||||
|         private Animation fadeInAnimation; | ||||
|  | ||||
|         public ImageHolder(View view, View.OnTouchListener listener) { | ||||
|             super(view); | ||||
|             ButterKnife.bind(this, view); | ||||
|  | ||||
|             fadeInAnimation = AnimationUtils.loadAnimation(view.getContext(), R.anim.fade_in); | ||||
|  | ||||
|             imageView.setParallelLoadingEnabled(true); | ||||
|             imageView.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_FIXED); | ||||
|             imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE); | ||||
|             imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_INSIDE); | ||||
|             imageView.setOnTouchListener(listener); | ||||
|             imageView.setOnImageEventListener(new SubsamplingScaleImageView.DefaultOnImageEventListener() { | ||||
|                 @Override | ||||
|                 public void onImageLoaded() { | ||||
|                     imageView.startAnimation(fadeInAnimation); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         public void onSetValues(Page page) { | ||||
|             if (page.getImagePath() != null) { | ||||
|                 imageView.setVisibility(View.VISIBLE); | ||||
|                 imageView.setImage(ImageSource.uri(page.getImagePath())); | ||||
|                 progressBar.setVisibility(View.GONE); | ||||
|             } else { | ||||
|                 imageView.setVisibility(View.GONE); | ||||
|                 progressBar.setVisibility(View.VISIBLE); | ||||
|             } | ||||
|         } | ||||
|     public void retryPage(Page page) { | ||||
|         fragment.getReaderActivity().getPresenter().retryPage(page); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,117 @@ | ||||
| package eu.kanade.mangafeed.ui.reader.viewer.webtoon; | ||||
|  | ||||
| import android.support.v7.widget.RecyclerView; | ||||
| import android.view.MotionEvent; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.view.animation.Animation; | ||||
| import android.view.animation.AnimationUtils; | ||||
| import android.widget.Button; | ||||
| import android.widget.ProgressBar; | ||||
|  | ||||
| import com.davemorrissey.labs.subscaleview.ImageSource; | ||||
| import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; | ||||
|  | ||||
| import butterknife.Bind; | ||||
| import butterknife.ButterKnife; | ||||
| import eu.kanade.mangafeed.R; | ||||
| import eu.kanade.mangafeed.data.source.model.Page; | ||||
|  | ||||
| public class WebtoonHolder extends RecyclerView.ViewHolder { | ||||
|  | ||||
|     @Bind(R.id.page_image_view) SubsamplingScaleImageView imageView; | ||||
|     @Bind(R.id.frame_container) ViewGroup container; | ||||
|     @Bind(R.id.progress) ProgressBar progressBar; | ||||
|     @Bind(R.id.retry_button) Button retryButton; | ||||
|  | ||||
|     private Animation fadeInAnimation; | ||||
|     private Page page; | ||||
|  | ||||
|     public WebtoonHolder(View view, WebtoonAdapter adapter, View.OnTouchListener touchListener) { | ||||
|         super(view); | ||||
|         ButterKnife.bind(this, view); | ||||
|  | ||||
|         fadeInAnimation = AnimationUtils.loadAnimation(view.getContext(), R.anim.fade_in); | ||||
|  | ||||
|         imageView.setParallelLoadingEnabled(true); | ||||
|         imageView.setDoubleTapZoomStyle(SubsamplingScaleImageView.ZOOM_FOCUS_FIXED); | ||||
|         imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE); | ||||
|         imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_INSIDE); | ||||
|         imageView.setOnTouchListener(touchListener); | ||||
|         imageView.setOnImageEventListener(new SubsamplingScaleImageView.DefaultOnImageEventListener() { | ||||
|             @Override | ||||
|             public void onImageLoaded() { | ||||
|                 imageView.startAnimation(fadeInAnimation); | ||||
|             } | ||||
|         }); | ||||
|         progressBar.setMinimumHeight(view.getResources().getDisplayMetrics().heightPixels); | ||||
|  | ||||
|         container.setOnTouchListener(touchListener); | ||||
|         retryButton.setOnTouchListener((v, event) -> { | ||||
|             if (event.getAction() == MotionEvent.ACTION_UP) { | ||||
|                 if (page != null) | ||||
|                     adapter.retryPage(page); | ||||
|                 return true; | ||||
|             } | ||||
|             return true; | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public void onSetValues(Page page) { | ||||
|         this.page = page; | ||||
|         switch (page.getStatus()) { | ||||
|             case Page.QUEUE: | ||||
|                 onQueue(); | ||||
|                 break; | ||||
|             case Page.LOAD_PAGE: | ||||
|                 onLoading(); | ||||
|                 break; | ||||
|             case Page.DOWNLOAD_IMAGE: | ||||
|                 onLoading(); | ||||
|                 break; | ||||
|             case Page.READY: | ||||
|                 onReady(); | ||||
|                 break; | ||||
|             case Page.ERROR: | ||||
|                 onError(); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void onLoading() { | ||||
|         setErrorButtonVisible(false); | ||||
|         setImageVisible(false); | ||||
|         setProgressVisible(true); | ||||
|     } | ||||
|  | ||||
|     private void onReady() { | ||||
|         setErrorButtonVisible(false); | ||||
|         setProgressVisible(false); | ||||
|         setImageVisible(true); | ||||
|         imageView.setImage(ImageSource.uri(page.getImagePath())); | ||||
|     } | ||||
|  | ||||
|     private void onError() { | ||||
|         setImageVisible(false); | ||||
|         setProgressVisible(false); | ||||
|         setErrorButtonVisible(true); | ||||
|     } | ||||
|  | ||||
|     private void onQueue() { | ||||
|         setImageVisible(false); | ||||
|         setErrorButtonVisible(false); | ||||
|         setProgressVisible(false); | ||||
|     } | ||||
|  | ||||
|     private void setProgressVisible(boolean visible) { | ||||
|         progressBar.setVisibility(visible ? View.VISIBLE : View.GONE); | ||||
|     } | ||||
|  | ||||
|     private void setImageVisible(boolean visible) { | ||||
|         imageView.setVisibility(visible ? View.VISIBLE : View.GONE); | ||||
|     } | ||||
|  | ||||
|     private void setErrorButtonVisible(boolean visible) { | ||||
|         retryButton.setVisibility(visible ? View.VISIBLE : View.GONE); | ||||
|     } | ||||
| } | ||||
| @@ -25,6 +25,7 @@ public class WebtoonReader extends BaseReader { | ||||
|  | ||||
|     private WebtoonAdapter adapter; | ||||
|     private RecyclerView recycler; | ||||
|     private PreCachingLayoutManager layoutManager; | ||||
|     private Subscription subscription; | ||||
|     private GestureDetector gestureDetector; | ||||
|  | ||||
| @@ -32,7 +33,7 @@ public class WebtoonReader extends BaseReader { | ||||
|     @Override | ||||
|     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { | ||||
|         adapter = new WebtoonAdapter(this); | ||||
|         PreCachingLayoutManager layoutManager = new PreCachingLayoutManager(getActivity()); | ||||
|         layoutManager = new PreCachingLayoutManager(getActivity()); | ||||
|         layoutManager.setExtraLayoutSpace(getResources().getDisplayMetrics().heightPixels); | ||||
|  | ||||
|         recycler = new RecyclerView(getActivity()); | ||||
| @@ -40,15 +41,6 @@ public class WebtoonReader extends BaseReader { | ||||
|         recycler.setLayoutManager(layoutManager); | ||||
|         recycler.setItemAnimator(null); | ||||
|         recycler.setAdapter(adapter); | ||||
|         recycler.addOnScrollListener(new RecyclerView.OnScrollListener() { | ||||
|             @Override | ||||
|             public void onScrolled(RecyclerView recyclerView, int dx, int dy) { | ||||
|                 super.onScrolled(recyclerView, dx, dy); | ||||
|  | ||||
|                 currentPage = layoutManager.findLastVisibleItemPosition(); | ||||
|                 updatePageNumber(); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         gestureDetector = new GestureDetector(getActivity(), new SimpleOnGestureListener() { | ||||
|             @Override | ||||
| @@ -100,11 +92,27 @@ public class WebtoonReader extends BaseReader { | ||||
|     private void setPages() { | ||||
|         if (pages != null) { | ||||
|             unsubscribeStatus(); | ||||
|             recycler.clearOnScrollListeners(); | ||||
|             adapter.clear(); | ||||
|             recycler.scrollTo(0, 0); | ||||
|             adapter.setPages(pages); | ||||
|             setScrollListener(); | ||||
|             observeStatus(0); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void setScrollListener() { | ||||
|         recycler.addOnScrollListener(new RecyclerView.OnScrollListener() { | ||||
|             @Override | ||||
|             public void onScrolled(RecyclerView recyclerView, int dx, int dy) { | ||||
|                 super.onScrolled(recyclerView, dx, dy); | ||||
|  | ||||
|                 currentPage = layoutManager.findLastVisibleItemPosition(); | ||||
|                 updatePageNumber(); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onImageTouch(MotionEvent motionEvent) { | ||||
|         return gestureDetector.onTouchEvent(motionEvent); | ||||
| @@ -115,7 +123,6 @@ public class WebtoonReader extends BaseReader { | ||||
|             return; | ||||
|  | ||||
|         final Page page = pages.get(position); | ||||
|         adapter.addPage(page); | ||||
|  | ||||
|         PublishSubject<Integer> statusSubject = PublishSubject.create(); | ||||
|         page.setStatusSubject(statusSubject); | ||||
| @@ -130,17 +137,9 @@ public class WebtoonReader extends BaseReader { | ||||
|     } | ||||
|  | ||||
|     private void processStatus(int position, int status) { | ||||
|         switch (status) { | ||||
|             case Page.LOAD_PAGE: | ||||
|                 break; | ||||
|             case Page.DOWNLOAD_IMAGE: | ||||
|                 break; | ||||
|             case Page.READY: | ||||
|                 adapter.notifyItemChanged(position); | ||||
|                 observeStatus(position + 1); | ||||
|                 break; | ||||
|             case Page.ERROR: | ||||
|                 break; | ||||
|         adapter.notifyItemChanged(position); | ||||
|         if (status == Page.READY) { | ||||
|             observeStatus(position + 1); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user