From 312a3e92360e774c4428ac52b1f41c389015357c Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 19 Nov 2022 20:24:03 +0100 Subject: [PATCH] WebView: improved nested scroll --- .../eu/faircode/email/AdapterMessage.java | 21 +--- .../java/eu/faircode/email/WebViewEx.java | 100 ++++-------------- 2 files changed, 23 insertions(+), 98 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 078dc1be31..a49120eff6 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -590,10 +590,8 @@ public class AdapterMessage extends RecyclerView.Adapter(scrollX, scrollY)); } - @Override - public void onOverScrolled(int scrollX, int scrollY, int dx, int dy, boolean clampedX, boolean clampedY) { - if (clampedY && ((WebViewEx) wvBody).isZoomedY()) { - boolean flinged = false; - try { - if (!webview_legacy && rv != null) - flinged = rv.fling(dx * 10, dy * 10); - } catch (Throwable ex) { - Log.e(ex); - } - if (!flinged) - properties.scrollBy(dx, dy); - } - } - @Override public boolean onOpenLink(String url) { if (parentFragment == null) diff --git a/app/src/main/java/eu/faircode/email/WebViewEx.java b/app/src/main/java/eu/faircode/email/WebViewEx.java index bec8a82899..253f5b5b5a 100644 --- a/app/src/main/java/eu/faircode/email/WebViewEx.java +++ b/app/src/main/java/eu/faircode/email/WebViewEx.java @@ -271,71 +271,6 @@ public class WebViewEx extends WebView implements DownloadListener, View.OnLongC this.intf.onSizeChanged(w, h, ow, oh); } - @Override - protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { - final int overScrollMode = getOverScrollMode(); - final boolean canScrollHorizontal = - computeHorizontalScrollRange() > computeHorizontalScrollExtent(); - final boolean canScrollVertical = - computeVerticalScrollRange() > computeVerticalScrollExtent(); - final boolean overScrollHorizontal = overScrollMode == OVER_SCROLL_ALWAYS || - (overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollHorizontal); - final boolean overScrollVertical = overScrollMode == OVER_SCROLL_ALWAYS || - (overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollVertical); - - int newScrollX = scrollX + deltaX; - if (!overScrollHorizontal) { - maxOverScrollX = 0; - } - - int newScrollY = scrollY + deltaY; - if (!overScrollVertical) { - maxOverScrollY = 0; - } - - // Clamp values if at the limits and record - final int left = -maxOverScrollX; - final int right = maxOverScrollX + scrollRangeX; - final int top = -maxOverScrollY; - final int bottom = maxOverScrollY + scrollRangeY; - - boolean clampedX = false; - if (newScrollX > right) { - newScrollX = right; - clampedX = true; - } else if (newScrollX < left) { - newScrollX = left; - clampedX = true; - } - - boolean clampedY = false; - if (newScrollY > bottom) { - newScrollY = bottom; - clampedY = true; - } else if (newScrollY < top) { - newScrollY = top; - clampedY = true; - } - - Log.i("onOverScrolled" + - " clampedY=" + clampedY + - " scrollY=" + scrollY + - " deltaY=" + deltaY + - " RangeY=" + scrollRangeY + - " maxY=" + maxOverScrollY + - " newY=" + (scrollY + deltaY) + "/" + newScrollY + - " dy=" + deltaY + - " top=" + top + - " bottom=" + bottom); - - if (Math.abs(deltaY) > bottom - top) - deltaY = (deltaY > 0 ? 1 : -1) * (bottom - top); - - intf.onOverScrolled(scrollX, scrollY, deltaX, deltaY, clampedX, clampedY); - - return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); - } - @Override public void onDownloadStart( String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { @@ -374,19 +309,28 @@ public class WebViewEx extends WebView implements DownloadListener, View.OnLongC return super.onGenericMotionEvent(event); } - public boolean isZoomedY() { -/* - DisplayMetrics dm = getResources().getDisplayMetrics(); - int ch = Math.round(getContentHeight() * dm.density); - int dp6 = Math.round(6 * dm.density); - return (ch - dp6 > getHeight()); -*/ - int ytend = computeVerticalScrollExtent(); - if (ytend == 0) - return false; + private float lastY; - float yscale = computeVerticalScrollRange() / (float) ytend; - return (yscale > 1.01); + @Override + public boolean onTouchEvent(MotionEvent event) { + boolean intercept = false; + if (event.getAction() == MotionEvent.ACTION_DOWN) + intercept = true; // Prevent ACTION_CANCEL on fling + else if (event.getAction() == MotionEvent.ACTION_MOVE) { + int range = computeVerticalScrollRange(); + int extend = computeVerticalScrollExtent(); + boolean canScrollVertical = (range > extend); + if (canScrollVertical) { + int bottom = range - extend; + int off = computeVerticalScrollOffset(); + float dy = lastY - event.getY(); + intercept = (off > 0 || dy >= 0) && (off < bottom || dy <= 0); + } + } + getParent().requestDisallowInterceptTouchEvent(intercept); + + lastY = event.getY(); + return super.onTouchEvent(event); } public static boolean isFeatureSupported(Context context, String feature) { @@ -464,8 +408,6 @@ public class WebViewEx extends WebView implements DownloadListener, View.OnLongC void onScrollChange(int scrollX, int scrollY); - void onOverScrolled(int scrollX, int scrollY, int dx, int dy, boolean clampedX, boolean clampedY); - boolean onOpenLink(String url); } }