import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
+import android.webkit.HttpAuthHandler;
+import android.webkit.SslErrorHandler;
import android.webkit.WebView;
-import com.stoutner.privacybrowser.R;
-
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.core.view.NestedScrollingChild2;
import androidx.core.view.NestedScrollingChildHelper;
import androidx.core.view.ViewCompat;
+import com.stoutner.privacybrowser.R;
+
import java.util.ArrayList;
import java.util.Date;
// Keep a copy of the WebView fragment ID.
private long webViewFragmentId;
+ // Store the handlers.
+ private SslErrorHandler sslErrorHandler;
+ private HttpAuthHandler httpAuthHandler;
+
// Track if domain settings are applied to this nested scroll WebView and, if so, the database ID.
private boolean domainSettingsApplied;
private int domainSettingsDatabaseId;
// Keep track of when the domain name changes so that domain settings can be reapplied. This should never be null.
private String currentDomainName = "";
+ // Track the status of first-party cookies.
+ private boolean acceptFirstPartyCookies;
+
+ // Track the domain settings JavaScript status. This can be removed once night mode does not require JavaScript.
+ private boolean domainSettingsJavaScriptEnabled;
+
// Track the resource requests.
private ArrayList<String[]> resourceRequests = new ArrayList<>();
private boolean easyListEnabled;
// The ignore pinned domain information tracker. This is set when a user proceeds past a pinned mismatch dialog to prevent the dialog from showing again until after the domain changes.
private boolean ignorePinnedDomainInformation;
+ // Track navigation of history.
+ private boolean navigatingHistory;
+
// The default or favorite icon.
- Bitmap favoriteOrDefaultIcon;
+ private Bitmap favoriteOrDefaultIcon;
+
+ // Track night mode.
+ private boolean nightMode;
+
+ // Track swipe to refresh.
+ private boolean swipeToRefresh;
// The nested scrolling child helper is used throughout the class.
private NestedScrollingChildHelper nestedScrollingChildHelper;
}
+ // SSL error handler.
+ public void setSslErrorHandler(SslErrorHandler sslErrorHandler) {
+ // Store the current SSL error handler.
+ this.sslErrorHandler = sslErrorHandler;
+ }
+
+ public SslErrorHandler getSslErrorHandler() {
+ // Return the current SSL error handler.
+ return sslErrorHandler;
+ }
+
+ public void resetSslErrorHandler() {
+ // Reset the current SSL error handler.
+ sslErrorHandler = null;
+ }
+
+
+ // HTTP authentication handler.
+ public void setHttpAuthHandler(HttpAuthHandler httpAuthHandler) {
+ // Store the current HTTP authentication handler.
+ this.httpAuthHandler = httpAuthHandler;
+ }
+
+ public HttpAuthHandler getHttpAuthHandler() {
+ // Return the current HTTP authentication handler.
+ return httpAuthHandler;
+ }
+
+ public void resetHttpAuthHandler() {
+ // Reset the current HTTP authentication handler.
+ httpAuthHandler = null;
+ }
+
+
// Domain settings.
public void setDomainSettingsApplied(boolean applied) {
// Store the domain settings applied status.
}
+ // First-party cookies.
+ public void setAcceptFirstPartyCookies(boolean status) {
+ // Store the accept first-party cookies status.
+ acceptFirstPartyCookies = status;
+ }
+
+ public boolean getAcceptFirstPartyCookies() {
+ // Return the accept first-party cookies status.
+ return acceptFirstPartyCookies;
+ }
+
+
+ // Domain settings JavaScript enabled. This can be removed once night mode does not require JavaScript.
+ public void setDomainSettingsJavaScriptEnabled(boolean status) {
+ // Store the domain settings JavaScript status.
+ domainSettingsJavaScriptEnabled = status;
+ }
+
+ public boolean getDomainSettingsJavaScriptEnabled() {
+ // Return the domain settings JavaScript status.
+ return domainSettingsJavaScriptEnabled;
+ }
+
+
// Resource requests.
public void addResourceRequest(String[] resourceRequest) {
// Add the resource request to the list.
}
- // Ignore pinned information. The syntax looks better as written, even if it is always inverted.
+ // Ignore pinned information.
+ public void setIgnorePinnedDomainInformation(boolean status) {
+ // Set the status of the ignore pinned domain information tracker.
+ ignorePinnedDomainInformation = status;
+ }
+
+ // The syntax looks better as written, even if it is always inverted.
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean ignorePinnedDomainInformation() {
// Return the status of the ignore pinned domain information tracker.
return ignorePinnedDomainInformation;
}
- public void setIgnorePinnedDomainInformation(boolean status) {
- // Set the status of the ignore pinned domain information tracker.
- ignorePinnedDomainInformation = status;
+
+ // Navigating history.
+ public void setNavigatingHistory(boolean status) {
+ // Set the status of navigating history.
+ navigatingHistory = status;
+ }
+
+ public boolean getNavigatingHistory() {
+ // Return the status of navigating history.
+ return navigatingHistory;
}
}
+ // Night mode.
+ public void setNightMode(boolean status) {
+ // Store the night mode status.
+ nightMode = status;
+ }
+
+ public boolean getNightMode() {
+ // Return the night mode status.
+ return nightMode;
+ }
+
+
+ // Swipe to refresh.
+ public void setSwipeToRefresh(boolean status) {
+ // Store the swipe to refresh status.
+ swipeToRefresh = status;
+ }
+
+ public boolean getSwipeToRefresh() {
+ // Return the swipe to refresh status.
+ return swipeToRefresh;
+ }
+
+
@Override
public boolean onTouchEvent(MotionEvent motionEvent) {
// 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.
+ // There is currently a bug in Android where if scrolling up at a certain slow speed the input can lock the pre scroll and continue to consume it after the app bar is fully displayed.
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.
+ // Stop the nested scroll so that swipe to refresh has complete control. This way releasing the scroll to refresh circle doesn't scroll the WebView at the same time.
stopNestedScroll();
} else { // Swipe to refresh is not being engaged.
// Start the nested scroll so that the app bar can scroll off the screen.