X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fviews%2FNestedScrollWebView.java;h=44bc9ef105bb20649110ad4866f4cdcaf8f9c799;hp=ea94571aa834a6924e4d79b7f1b6c40fe2b789d4;hb=be5c6472390dd054ffb15593388bc103944a99e4;hpb=ba40295dffd761ccdc95d3b46ca7acbad1f00d5e diff --git a/app/src/main/java/com/stoutner/privacybrowser/views/NestedScrollWebView.java b/app/src/main/java/com/stoutner/privacybrowser/views/NestedScrollWebView.java index ea94571a..44bc9ef1 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/views/NestedScrollWebView.java +++ b/app/src/main/java/com/stoutner/privacybrowser/views/NestedScrollWebView.java @@ -36,7 +36,6 @@ public class NestedScrollWebView extends WebView implements NestedScrollingChild // The previous Y position needs to be tracked between motion events. private int previousYPosition; - // Basic constructor. public NestedScrollWebView(Context context) { // Roll up to the next constructor. @@ -61,7 +60,6 @@ public class NestedScrollWebView extends WebView implements NestedScrollingChild nestedScrollingChildHelper.setNestedScrollingEnabled(true); } - @Override public boolean onTouchEvent(MotionEvent motionEvent) { // Initialize a tracker to return if this motion event is handled. @@ -82,19 +80,43 @@ public class NestedScrollWebView extends WebView implements NestedScrollingChild case MotionEvent.ACTION_MOVE: // Get the current Y position. - int currentYPosition = (int) motionEvent.getY(); + int currentYMotionPosition = (int) motionEvent.getY(); + + // Calculate the pre-scroll delta Y. + int preScrollDeltaY = previousYPosition - currentYMotionPosition; + + // Initialize a variable to track how much of the scroll is consumed. + int[] consumedScroll = new int[2]; + + // Initialize a variable to track the offset in the window. + int[] offsetInWindow = new int[2]; + + // Get the WebView Y position. + int webViewYPosition = getScrollY(); - // Calculate the delta Y. - int deltaY = previousYPosition - currentYPosition; + // Set the scroll delta Y to initially be the same as the pre-scroll delta Y. + int scrollDeltaY = preScrollDeltaY; - // Store the current Y position for use in the next action move. - previousYPosition = currentYPosition; + // Dispatch the nested pre-school. This scrolls the app bar if it needs it. `offsetInWindow` will be returned with an updated value. + if (dispatchNestedPreScroll(0, preScrollDeltaY, consumedScroll, offsetInWindow)) { + // Update the scroll delta Y if some of it was consumed. + scrollDeltaY = preScrollDeltaY - consumedScroll[1]; + } - // Dispatch the nested pre-school. - dispatchNestedPreScroll(0, deltaY, null, null); + // Check to see if the WebView is at the top and and the scroll action is downward. + if ((webViewYPosition == 0) && (scrollDeltaY < 0)) { // Swipe to refresh is being engaged. + // Stop the nested scroll so that swipe to refresh has complete control. + stopNestedScroll(); + } else { // Swipe to refresh is not being engaged. + // Start the nested scroll so that the app bar can scroll off the screen. + startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL); - // Dispatch the nested scroll. - dispatchNestedScroll(0, deltaY, 0, 0, null); + // Dispatch the nested scroll. This scrolls the WebView. The delta Y unconsumed normally controls the swipe refresh layout, but that is handled with the `if` statement above. + dispatchNestedScroll(0, scrollDeltaY, 0, 0, offsetInWindow); + + // Store the current Y position for use in the next action move. + previousYPosition = previousYPosition - scrollDeltaY; + } // Run the default commands. motionEventHandled = super.onTouchEvent(motionEvent); @@ -109,10 +131,19 @@ public class NestedScrollWebView extends WebView implements NestedScrollingChild motionEventHandled = super.onTouchEvent(motionEvent); } + // Perform a click. This is required by the Android accessibility guidelines. + performClick(); + // Return the status of the motion event. return motionEventHandled; } + // The Android accessibility guidelines require overriding `performClick()` and calling it from `onTouchEvent()`. + @Override + public boolean performClick() { + return super.performClick(); + } + // Method from NestedScrollingChild. @Override