package app.grapheneos.pdfviewer; import android.annotation.SuppressLint; import android.content.Context; import android.view.ScaleGestureDetector; import android.view.View; /* The GestureHelper present a simple gesture api for the PdfViewer */ class GestureHelper { public interface GestureListener { // Can be replaced with ratio when supported void onZoomIn(float value); void onZoomOut(float value); void onZoomEnd(); } @SuppressLint("ClickableViewAccessibility") static void attach(Context context, View gestureView, GestureListener listener) { final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(context, new ScaleGestureDetector.SimpleOnScaleGestureListener() { final float SPAN_RATIO = 600; float initialSpan; float prevNbStep; @Override public boolean onScaleBegin(ScaleGestureDetector detector) { initialSpan = detector.getCurrentSpan(); prevNbStep = 0; return true; } @Override public boolean onScale(ScaleGestureDetector detector) { float spanDiff = initialSpan - detector.getCurrentSpan(); float curNbStep = spanDiff / SPAN_RATIO; float stepDiff = curNbStep - prevNbStep; if (stepDiff > 0) { listener.onZoomOut(stepDiff); } else { listener.onZoomIn(Math.abs(stepDiff)); } prevNbStep = curNbStep; return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { listener.onZoomEnd(); } }); gestureView.setOnTouchListener((view, motionEvent) -> { scaleDetector.onTouchEvent(motionEvent); return false; }); } }