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=5044b27df449d0b498d681e477211042bd142932;hp=ea94571aa834a6924e4d79b7f1b6c40fe2b789d4;hb=0cc9b798d6daa99959e33ff94a707516d6db8122;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..5044b27d 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/views/NestedScrollWebView.java +++ b/app/src/main/java/com/stoutner/privacybrowser/views/NestedScrollWebView.java @@ -36,6 +36,9 @@ public class NestedScrollWebView extends WebView implements NestedScrollingChild // The previous Y position needs to be tracked between motion events. private int previousYPosition; + // Track if domain settings are applied to this nested scroll WebView and, if so, the database ID. + private boolean domainSettingsApplied; + private int domainSettingsDatabaseId; // Basic constructor. public NestedScrollWebView(Context context) { @@ -61,6 +64,25 @@ public class NestedScrollWebView extends WebView implements NestedScrollingChild nestedScrollingChildHelper.setNestedScrollingEnabled(true); } + public void setDomainSettingsApplied(boolean applied) { + // Store the domain settings applied status. + domainSettingsApplied = applied; + } + + public boolean getDomainSettingsApplied() { + // Return the domain settings applied status. + return domainSettingsApplied; + } + + public void setDomainSettingsDatabaseId(int databaseId) { + // Store the domain settings database ID. + domainSettingsDatabaseId = databaseId; + } + + public int getDomainSettingsDatabaseId() { + // Return the domain settings database ID. + return domainSettingsDatabaseId; + } @Override public boolean onTouchEvent(MotionEvent motionEvent) { @@ -82,19 +104,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; - // Calculate the delta Y. - int deltaY = previousYPosition - currentYPosition; + // Initialize a variable to track how much of the scroll is consumed. + int[] consumedScroll = new int[2]; - // Store the current Y position for use in the next action move. - previousYPosition = currentYPosition; + // Initialize a variable to track the offset in the window. + int[] offsetInWindow = new int[2]; - // Dispatch the nested pre-school. - dispatchNestedPreScroll(0, deltaY, null, null); + // Get the WebView Y position. + int webViewYPosition = getScrollY(); - // Dispatch the nested scroll. - dispatchNestedScroll(0, deltaY, 0, 0, null); + // Set the scroll delta Y to initially be the same as the pre-scroll delta Y. + int scrollDeltaY = preScrollDeltaY; + + // 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]; + } + + // 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. 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 +155,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