From a3ec0573847e5cd1ee176c8219f24914f0989009 Mon Sep 17 00:00:00 2001
From: inorichi <chibilen@gmail.com>
Date: Sun, 31 Jan 2016 02:40:05 +0100
Subject: [PATCH] Now tap on edges of webtoon reader scrolls by 3/4 screen

---
 .../viewer/pager/PagerReaderFragment.java     |  6 ++---
 .../reader/viewer/webtoon/WebtoonHolder.java  |  2 +-
 .../reader/viewer/webtoon/WebtoonReader.java  | 23 ++++++++++++++++---
 .../SubsamplingScaleImageView.java            | 10 ++++----
 4 files changed, 29 insertions(+), 12 deletions(-)

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 9330f20675..6c3c0b1723 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
@@ -68,7 +68,7 @@ public class PagerReaderFragment extends BaseFragment {
         imageView.setMinimumScaleType(parentFragment.scaleType);
         imageView.setRegionDecoderClass(parentFragment.getRegionDecoderClass());
         imageView.setBitmapDecoderClass(parentFragment.getBitmapDecoderClass());
-        imageView.setVerticalScroll(parentFragment instanceof VerticalReader);
+        imageView.setVerticalScrollingParent(parentFragment instanceof VerticalReader);
         imageView.setOnTouchListener((v, motionEvent) -> parentFragment.onImageTouch(motionEvent));
         imageView.setOnImageEventListener(new SubsamplingScaleImageView.DefaultOnImageEventListener() {
             @Override
@@ -187,8 +187,8 @@ public class PagerReaderFragment extends BaseFragment {
 
         final AtomicInteger currentValue = new AtomicInteger(-1);
 
-        progressSubscription = Observable.interval(75, TimeUnit.MILLISECONDS, Schedulers.newThread())
-                .onBackpressureDrop()
+        progressSubscription = Observable.interval(100, TimeUnit.MILLISECONDS, Schedulers.newThread())
+                .onBackpressureLatest()
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(tick -> {
                     // Refresh UI only if progress change
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 f384d98ffb..51cc392363 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
@@ -38,7 +38,7 @@ public class WebtoonHolder extends RecyclerView.ViewHolder {
         imageView.setMaxScale(10);
         imageView.setRegionDecoderClass(adapter.getReader().getRegionDecoderClass());
         imageView.setBitmapDecoderClass(adapter.getReader().getBitmapDecoderClass());
-        imageView.setVerticalScroll(true);
+        imageView.setVerticalScrollingParent(true);
         imageView.setOnTouchListener(touchListener);
         imageView.setOnImageEventListener(new SubsamplingScaleImageView.DefaultOnImageEventListener() {
             @Override
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonReader.java b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonReader.java
index 4e09dee99c..1879d2fca3 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonReader.java
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonReader.java
@@ -29,11 +29,20 @@ public class WebtoonReader extends BaseReader {
     private Subscription decoderSubscription;
     private GestureDetector gestureDetector;
 
+    private int scrollDistance;
+
+    private static final float LEFT_REGION = 0.33f;
+    private static final float RIGHT_REGION = 0.66f;
+
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
         adapter = new WebtoonAdapter(this);
+
+        int screenHeight = getResources().getDisplayMetrics().heightPixels;
+        scrollDistance = screenHeight * 3 / 4;
+
         layoutManager = new PreCachingLayoutManager(getActivity());
-        layoutManager.setExtraLayoutSpace(getResources().getDisplayMetrics().heightPixels / 2);
+        layoutManager.setExtraLayoutSpace(screenHeight / 2);
 
         recycler = new RecyclerView(getActivity());
         recycler.setLayoutParams(new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
@@ -48,10 +57,18 @@ public class WebtoonReader extends BaseReader {
                 .distinctUntilChanged()
                 .subscribe(v -> recycler.setAdapter(adapter));
 
-        gestureDetector = new GestureDetector(getActivity(), new SimpleOnGestureListener() {
+        gestureDetector = new GestureDetector(recycler.getContext(), new SimpleOnGestureListener() {
             @Override
             public boolean onSingleTapConfirmed(MotionEvent e) {
-                getReaderActivity().onCenterSingleTap();
+                final float positionX = e.getX();
+
+                if (positionX < recycler.getWidth() * LEFT_REGION) {
+                    recycler.smoothScrollBy(0, -scrollDistance);
+                } else if (positionX > recycler.getWidth() * RIGHT_REGION) {
+                    recycler.smoothScrollBy(0, scrollDistance);
+                } else {
+                    getReaderActivity().onCenterSingleTap();
+                }
                 return true;
             }
         });
diff --git a/libs/SubsamplingScaleImageView/src/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.java b/libs/SubsamplingScaleImageView/src/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.java
index a4d559baa7..63fc1a682b 100644
--- a/libs/SubsamplingScaleImageView/src/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.java
+++ b/libs/SubsamplingScaleImageView/src/com/davemorrissey/labs/subscaleview/SubsamplingScaleImageView.java
@@ -206,7 +206,7 @@ public class SubsamplingScaleImageView extends View {
     private int maxBitmapDimensions;
 
     // Vertical pagers/scrollers should enable this
-    private boolean isVerticalScroll;
+    private boolean isVerticalScrollingParent;
 
     // Is two-finger zooming in progress
     private boolean isZooming;
@@ -758,7 +758,7 @@ public class SubsamplingScaleImageView extends View {
                             float lastX = vTranslate.x;
                             float lastY = vTranslate.y;
                             fitToBounds(true);
-                            if (!isVerticalScroll) {
+                            if (!isVerticalScrollingParent) {
                                 boolean atXEdge = lastX != vTranslate.x;
                                 boolean edgeXSwipe = atXEdge && dx > dy && !isPanning;
                                 boolean yPan = lastY == vTranslate.y && dy > 15;
@@ -779,7 +779,7 @@ public class SubsamplingScaleImageView extends View {
                                 if (!edgeYSwipe && (!atYEdge || xPan || isPanning)) {
                                     isPanning = true;
                                 } else if (dy > 5) {
-                                    // Haven't panned the image, and we're at the left or right edge. Switch to page swipe.
+                                    // Haven't panned the image, and we're at the top or bottom edge. Switch to page swipe.
                                     maxTouchCount = 0;
                                     handler.removeMessages(MESSAGE_LONG_CLICK);
                                     getParent().requestDisallowInterceptTouchEvent(false);
@@ -2502,8 +2502,8 @@ public class SubsamplingScaleImageView extends View {
     /**
      * Set vertical scroll mode to fix gestures
      */
-    public void setVerticalScroll(boolean isVerticalScroll) {
-        this.isVerticalScroll = isVerticalScroll;
+    public void setVerticalScrollingParent(boolean isVerticalScrollingParent) {
+        this.isVerticalScrollingParent = isVerticalScrollingParent;
     }
 
     /**