From a3cc1743dfd764dfa0315d815610c7f9b3ba0037 Mon Sep 17 00:00:00 2001 From: Matt Van Hest Date: Thu, 15 Aug 2024 19:57:32 +1000 Subject: [PATCH 1/3] Added in swipe to change pdf page. --- .../grapheneos/pdfviewer/GestureHelper.java | 18 ++++++++++- .../app/grapheneos/pdfviewer/PdfViewer.java | 32 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/app/grapheneos/pdfviewer/GestureHelper.java b/app/src/main/java/app/grapheneos/pdfviewer/GestureHelper.java index 2a291cdde..75f81f6b6 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/GestureHelper.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/GestureHelper.java @@ -7,6 +7,9 @@ import android.view.ScaleGestureDetector; import android.view.View; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + /* The GestureHelper present a simple gesture api for the PdfViewer */ @@ -14,6 +17,8 @@ class GestureHelper { public interface GestureListener { boolean onTapUp(); + boolean onFling(@Nullable MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY); + boolean onDown(); // Can be replaced with ratio when supported void onZoomIn(float value); void onZoomOut(float value); @@ -26,9 +31,20 @@ static void attach(Context context, View gestureView, GestureListener listener) final GestureDetector detector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override - public boolean onSingleTapUp(MotionEvent motionEvent) { + public boolean onSingleTapUp(@NonNull MotionEvent motionEvent) { return listener.onTapUp(); } + + @Override + public boolean onFling(@Nullable MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY) { + return listener.onFling(e1, e2, velocityX, velocityY); + } + + @Override + public boolean onDown(@NonNull MotionEvent motionEvent){ + return listener.onDown(); + } + }); final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(context, diff --git a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java index 49dd35a80..d0d3d4700 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java @@ -13,6 +13,7 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.webkit.CookieManager; @@ -28,6 +29,7 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; @@ -347,6 +349,7 @@ public void onPageFinished(WebView view, String url) { new GestureHelper.GestureListener() { @Override public boolean onTapUp() { + Log.d("Tap Up", "The onTapUp method has been called"); if (mUri != null) { binding.webview.evaluateJavascript("isTextSelected()", selection -> { if (!Boolean.parseBoolean(selection)) { @@ -362,6 +365,35 @@ public boolean onTapUp() { return false; } + // investigate more into the onFlight method for gestures in android. The interface will also be required to link in with the listener and gestures + @Override + public boolean onFling(@Nullable MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY) { + float deltaX = e2.getX() - e1.getX(); + float deltaY = e2.getY() - e1.getY(); + + if (Math.abs(deltaX) > Math.abs(deltaY)){ + if (deltaX > 0) { + Log.d("Horizontal", "Right movement Position"); + onJumpToPageInDocument(mPage - 1); + } else { + Log.d("Horizontal", "Left movement Position"); + onJumpToPageInDocument(mPage + 1); + } + } else { + if (deltaY > 0) { + Log.d("Vertical", "Down movement Position"); + } else { + Log.d("Horizontal", "Up movement Position"); + } + } + return true; + } + + @Override + public boolean onDown() { + return true; + } + @Override public void onZoomIn(float value) { zoomIn(value, false); From 30f96137a19ce6a0f0460ebdd458f9763b02c88b Mon Sep 17 00:00:00 2001 From: Matt Van Hest Date: Thu, 15 Aug 2024 19:59:59 +1000 Subject: [PATCH 2/3] Removed unnecessary log message. --- app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java index d0d3d4700..f0112b18f 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java @@ -349,7 +349,6 @@ public void onPageFinished(WebView view, String url) { new GestureHelper.GestureListener() { @Override public boolean onTapUp() { - Log.d("Tap Up", "The onTapUp method has been called"); if (mUri != null) { binding.webview.evaluateJavascript("isTextSelected()", selection -> { if (!Boolean.parseBoolean(selection)) { From 1c8b93a0e9a8089db0f979ea1f1d317e55059a2d Mon Sep 17 00:00:00 2001 From: Matt Van Hest Date: Tue, 14 Jan 2025 19:44:06 +1100 Subject: [PATCH 3/3] Constrained the velocity of the gesture to stop inadvertent page scrolling. Reading a file while zoomed in does not cause unnecessary page changes. --- .../java/app/grapheneos/pdfviewer/PdfViewer.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java index f0112b18f..d088d7eef 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java @@ -364,26 +364,21 @@ public boolean onTapUp() { return false; } - // investigate more into the onFlight method for gestures in android. The interface will also be required to link in with the listener and gestures @Override public boolean onFling(@Nullable MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY) { + assert e1 != null; + float maxXVelocity = 4000; float deltaX = e2.getX() - e1.getX(); float deltaY = e2.getY() - e1.getY(); if (Math.abs(deltaX) > Math.abs(deltaY)){ - if (deltaX > 0) { + if ((deltaX > 0) & (Math.abs(velocityX) > maxXVelocity)) { Log.d("Horizontal", "Right movement Position"); onJumpToPageInDocument(mPage - 1); - } else { + } else if ((Math.abs(velocityX) > maxXVelocity)) { Log.d("Horizontal", "Left movement Position"); onJumpToPageInDocument(mPage + 1); } - } else { - if (deltaY > 0) { - Log.d("Vertical", "Down movement Position"); - } else { - Log.d("Horizontal", "Up movement Position"); - } } return true; }