diff --git a/app/src/main/java/app/grapheneos/pdfviewer/GestureHelper.java b/app/src/main/java/app/grapheneos/pdfviewer/GestureHelper.java index e87590f1..62f62e62 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,11 @@ 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); void onZoom(float scaleFactor, float focusX, float focusY); void onZoomEnd(); } @@ -24,9 +32,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 cb4baf2e..5fefe84a 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.webkit.CookieManager; import android.webkit.JavascriptInterface; @@ -29,6 +30,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.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; @@ -452,8 +454,41 @@ public boolean onTapUp() { } @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) & (Math.abs(velocityX) > maxXVelocity)) { + Log.d("Horizontal", "Right movement Position"); + onJumpToPageInDocument(mPage - 1); + } else if ((Math.abs(velocityX) > maxXVelocity)) { + Log.d("Horizontal", "Left movement Position"); + onJumpToPageInDocument(mPage + 1); + } + } + return true; + } + + @Override + public boolean onDown() { + return true; + } + + @Override + public void onZoomIn(float value) { + zoomIn(value, false); + } + + @Override + public void onZoomOut(float value) { + zoomOut(value, false); + public void onZoom(float scaleFactor, float focusX, float focusY) { - zoom(scaleFactor, focusX, focusY, false); + zoom(scaleFactor, focusX, focusY, false); } @Override