From f7289be8a5f29893d346b6818c16a6a95529a2ef Mon Sep 17 00:00:00 2001 From: Antoine d'Aligny Date: Sat, 5 Oct 2019 16:00:25 +0200 Subject: [PATCH] Move gesture detectors and listeners in the GestureHelper class/file --- .../grapheneos/pdfviewer/GestureHelper.java | 71 +++++++++++++++++++ .../org/grapheneos/pdfviewer/PdfViewer.java | 56 ++++----------- 2 files changed, 84 insertions(+), 43 deletions(-) create mode 100644 app/src/main/java/org/grapheneos/pdfviewer/GestureHelper.java diff --git a/app/src/main/java/org/grapheneos/pdfviewer/GestureHelper.java b/app/src/main/java/org/grapheneos/pdfviewer/GestureHelper.java new file mode 100644 index 0000000..743a989 --- /dev/null +++ b/app/src/main/java/org/grapheneos/pdfviewer/GestureHelper.java @@ -0,0 +1,71 @@ +package org.grapheneos.pdfviewer; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; +import android.view.View; + +/* + The GestureHelper present a simple gesture api for the PdfViewer +*/ + +class GestureHelper { + public interface GestureListener { + boolean onTapUp(); + // Can be replaced with ratio when supported + void onZoomIn(int steps); + void onZoomOut(int steps); + } + + @SuppressLint("ClickableViewAccessibility") + static void attach(Context context, View gestureView, GestureListener listener) { + + final GestureDetector detector = new GestureDetector(context, + new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onSingleTapUp(MotionEvent motionEvent) { + return listener.onTapUp(); + } + }); + + final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(context, + new ScaleGestureDetector.SimpleOnScaleGestureListener() { + // As the zoom value is discrete we listen to scaling step and not scaling ratio + float SPAN_STEP = 150; + float initialSpan; + int prevNbStep; + + @Override + public boolean onScaleBegin(ScaleGestureDetector detector) { + initialSpan = detector.getCurrentSpan(); + prevNbStep = 0; + return super.onScaleBegin(detector); + } + + @Override + public boolean onScale(ScaleGestureDetector detector) { + float spanDiff = initialSpan - detector.getCurrentSpan(); + int curNbStep = (int) (spanDiff/SPAN_STEP); + if (curNbStep != prevNbStep) { + int stepDiff = curNbStep - prevNbStep; + if (stepDiff > 0) { + listener.onZoomOut(stepDiff); + } else { + listener.onZoomIn(Math.abs(stepDiff)); + } + prevNbStep = curNbStep; + } + return true; + } + }); + + gestureView.setOnTouchListener((view, motionEvent) -> { + detector.onTouchEvent(motionEvent); + scaleDetector.onTouchEvent(motionEvent); + return false; + }); + } + +} diff --git a/app/src/main/java/org/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/org/grapheneos/pdfviewer/PdfViewer.java index 354805a..737786d 100644 --- a/app/src/main/java/org/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/org/grapheneos/pdfviewer/PdfViewer.java @@ -8,13 +8,10 @@ import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.util.Log; -import android.view.GestureDetector; import android.view.Gravity; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.ScaleGestureDetector; import android.view.View; import android.webkit.CookieManager; import android.webkit.JavascriptInterface; @@ -235,10 +232,10 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader showSystemUi(); - final GestureDetector detector = new GestureDetector(PdfViewer.this, - new GestureDetector.SimpleOnGestureListener() { + GestureHelper.attach(PdfViewer.this, mWebView, + new GestureHelper.GestureListener() { @Override - public boolean onSingleTapUp(MotionEvent motionEvent) { + public boolean onTapUp() { if (mUri != null) { mWebView.evaluateJavascript("isTextSelected()", selection -> { if (!Boolean.valueOf(selection)) { @@ -254,49 +251,22 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader } return false; } - }); - - final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(PdfViewer.this, - new ScaleGestureDetector.SimpleOnScaleGestureListener() { - // As the zoom value is discrete we listen to scaling step and not scaling ratio - float SPAN_STEP = 150; - float initialSpan; - int prevNbStep; @Override - public boolean onScaleBegin(ScaleGestureDetector detector) { - initialSpan = detector.getCurrentSpan(); - prevNbStep = 0; - return super.onScaleBegin(detector); - } - - @Override - public boolean onScale(ScaleGestureDetector detector) { - float spanDiff = initialSpan - detector.getCurrentSpan(); - int curNbStep = (int) (spanDiff/SPAN_STEP); - if (curNbStep != prevNbStep) { - int stepDiff = curNbStep - prevNbStep; - if (stepDiff > 0) { - for (int i = prevNbStep; i < curNbStep; i++) { - zoomOut(); - } - } else { - for (int i = prevNbStep; i > curNbStep; i--) { - zoomIn(); - } - } - prevNbStep = curNbStep; + public void onZoomIn(int steps) { + for (int i = 0; i < steps; i++) { + zoomIn(); + } + } + + @Override + public void onZoomOut(int steps) { + for (int i = 0; i < steps; i++) { + zoomOut(); } - return true; } }); - mWebView.setOnTouchListener((view, motionEvent) -> { - detector.onTouchEvent(motionEvent); - scaleDetector.onTouchEvent(motionEvent); - return false; - }); - mTextView = new TextView(this); mTextView.setBackgroundColor(Color.DKGRAY); mTextView.setTextColor(ColorStateList.valueOf(Color.WHITE));