X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FMainWebViewActivity.java;h=e7d7c66184203bdf289349e6ece38aba6650fcdc;hp=933de06a1a5afe846a4bc574f6dc025e2dc61812;hb=bc45b14cfda10249800a6ccfdb8247d2ce9b32a9;hpb=337aebc73ea8d43fd912198e1eff9fe9f8f8f536 diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java index 933de06a..e7d7c661 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java @@ -154,10 +154,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook HttpAuthenticationDialog.HttpAuthenticationListener, NavigationView.OnNavigationItemSelectedListener, PinnedSslCertificateMismatchDialog.PinnedSslCertificateMismatchListener, SslCertificateErrorDialog.SslCertificateErrorListener, UrlHistoryDialog.UrlHistoryListener { - // `darkTheme` is public static so it can be accessed from `AboutActivity`, `GuideActivity`, `AddDomainDialog`, `SettingsActivity`, `DomainsActivity`, `DomainsListFragment`, `BookmarksActivity`, - // `BookmarksDatabaseViewActivity`, `CreateBookmarkDialog`, `CreateBookmarkFolderDialog`, `DownloadFileDialog`, `DownloadImageDialog`, `EditBookmarkDialog`, `EditBookmarkFolderDialog`, - // `EditBookmarkDatabaseViewDialog`, `HttpAuthenticationDialog`, `MoveToFolderDialog`, `SslCertificateErrorDialog`, `UrlHistoryDialog`, `ViewSslCertificateDialog`, `CreateHomeScreenShortcutDialog`, - // and `OrbotProxyHelper`. It is also used in `onCreate()`, `applyAppSettings()`, `applyDomainSettings()`, and `updatePrivacyIcons()`. + // `darkTheme` is public static so it can be accessed from everywhere. public static boolean darkTheme; // `allowScreenshots` is public static so it can be accessed from everywhere. It is also used in `onCreate()`. @@ -200,6 +197,44 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook public static String fanboyAnnoyanceVersion; public static String fanboySocialVersion; + // The request items are public static so they can be accessed by `BlockListHelper`, `RequestsArrayAdapter`, and `ViewRequestsDialog`. They are also used in `onCreate()`. + public static List resourceRequests; + public static String[] whiteListResultStringArray; + public final static int REQUEST_DISPOSITION = 0; + public final static int REQUEST_URL = 1; + public final static int REQUEST_BLOCKLIST = 2; + public final static int REQUEST_SUBLIST = 3; + public final static int REQUEST_BLOCKLIST_ENTRIES = 4; + public final static int REQUEST_BLOCKLIST_ORIGINAL_ENTRY = 5; + + public final static int REQUEST_DEFAULT = 0; + public final static int REQUEST_ALLOWED = 1; + public final static int REQUEST_BLOCKED = 2; + + public final static int MAIN_WHITELIST = 1; + public final static int FINAL_WHITELIST = 2; + public final static int DOMAIN_WHITELIST = 3; + public final static int DOMAIN_INITIAL_WHITELIST = 4; + public final static int DOMAIN_FINAL_WHITELIST = 5; + public final static int THIRD_PARTY_WHITELIST = 6; + public final static int THIRD_PARTY_DOMAIN_WHITELIST = 7; + public final static int THIRD_PARTY_DOMAIN_INITIAL_WHITELIST = 8; + + public final static int MAIN_BLACKLIST = 9; + public final static int INITIAL_BLACKLIST = 10; + public final static int FINAL_BLACKLIST = 11; + public final static int DOMAIN_BLACKLIST = 12; + public final static int DOMAIN_INITIAL_BLACKLIST = 13; + public final static int DOMAIN_FINAL_BLACKLIST = 14; + public final static int DOMAIN_REGULAR_EXPRESSION_BLACKLIST = 15; + public final static int THIRD_PARTY_BLACKLIST = 16; + public final static int THIRD_PARTY_INITIAL_BLACKLIST = 17; + public final static int THIRD_PARTY_DOMAIN_BLACKLIST = 18; + public final static int THIRD_PARTY_DOMAIN_INITIAL_BLACKLIST = 19; + public final static int THIRD_PARTY_REGULAR_EXPRESSION_BLACKLIST = 20; + public final static int THIRD_PARTY_DOMAIN_REGULAR_EXPRESSION_BLACKLIST = 21; + public final static int REGULAR_EXPRESSION_BLACKLIST = 22; + // `currentBookmarksFolder` is public static so it can be accessed from `BookmarksActivity`. It is also used in `onCreate()`, `onBackPressed()`, `onCreateBookmark()`, `onCreateBookmarkFolder()`, // `onSaveEditBookmark()`, `onSaveEditBookmarkFolder()`, and `loadBookmarksFolder()`. public static String currentBookmarksFolder; @@ -754,6 +789,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook final MenuItem navigationBackMenuItem = navigationMenu.getItem(1); final MenuItem navigationForwardMenuItem = navigationMenu.getItem(2); final MenuItem navigationHistoryMenuItem = navigationMenu.getItem(3); + final MenuItem navigationRequestsMenuItem = navigationMenu.getItem(4); // Initialize the bookmarks database helper. `this` specifies the context. The two `nulls` do not specify the database name or a `CursorFactory`. // The `0` specifies a database version, but that is ignored and set instead using a constant in `BookmarksDatabaseHelper`. @@ -816,7 +852,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook return true; }); - // The `DrawerListener` allows us to update the Navigation Menu. + // The `DrawerListener` is used to update the Navigation Menu. drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { @Override public void onDrawerSlide(@NonNull View drawerView, float slideOffset) { @@ -833,10 +869,21 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook @Override public void onDrawerStateChanged(int newState) { if ((newState == DrawerLayout.STATE_SETTLING) || (newState == DrawerLayout.STATE_DRAGGING)) { // The drawer is opening or closing. - // Update the `Back`, `Forward`, and `History` menu items. + // Initialize a the blocked requests counter. + int blockedRequests = 0; + + // Count the number of blocked requests. + for (int i = 0; i < resourceRequests.size(); i++) { + if (Integer.valueOf(resourceRequests.get(i)[REQUEST_DISPOSITION]) == REQUEST_BLOCKED) { + blockedRequests++; + } + } + + // Update the back, forward, history, and requests menu items. navigationBackMenuItem.setEnabled(mainWebView.canGoBack()); navigationForwardMenuItem.setEnabled(mainWebView.canGoForward()); navigationHistoryMenuItem.setEnabled((mainWebView.canGoBack() || mainWebView.canGoForward())); + navigationRequestsMenuItem.setTitle(getResources().getString(R.string.requests) + " - " + blockedRequests); // Hide the keyboard (if displayed) so we can see the navigation menu. `0` indicates no additional flags. inputMethodManager.hideSoftInputFromWindow(mainWebView.getWindowToken(), 0); @@ -1103,6 +1150,9 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Instantiate the block list helper. BlockListHelper blockListHelper = new BlockListHelper(); + // Initialize the list of resource requests. + resourceRequests = new ArrayList<>(); + // Parse the block lists. final ArrayList> easyList = blockListHelper.parseBlockList(getAssets(), "blocklists/easylist.txt"); final ArrayList> easyPrivacy = blockListHelper.parseBlockList(getAssets(), "blocklists/easyprivacy.txt"); @@ -1122,10 +1172,10 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("http")) { // Load the URL in Privacy Browser. - // Apply the domain settings for the new URL. + // Apply the domain settings for the new URL. `applyDomainSettings` doesn't do anything if the domain has not changed. applyDomainSettings(url, true, false); - // Returning false causes the current `WebView` to handle the URL and prevents it from adding redirects to the history list. + // Returning false causes the current WebView to handle the URL and prevents it from adding redirects to the history list. return false; } else if (url.startsWith("mailto:")) { // Load the email address in an external email program. // Use `ACTION_SENDTO` instead of `ACTION_SEND` so that only email programs are launched. @@ -1182,13 +1232,16 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook } } - // Check requests against the block lists. The deprecated `shouldInterceptRequest` must be used until minimum API >= 21. + // Check requests against the block lists. The deprecated `shouldInterceptRequest()` must be used until minimum API >= 21. @SuppressWarnings("deprecation") @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url){ // Create an empty web resource response to be used if the resource request is blocked. WebResourceResponse emptyWebResourceResponse = new WebResourceResponse("text/plain", "utf8", new ByteArrayInputStream("".getBytes())); + // Reset `whiteListResultStringArray`. + whiteListResultStringArray = null; + // Check EasyList if it is enabled. if (easyListEnabled) { if (blockListHelper.isBlocked(formattedUrlString, url, easyList)) { @@ -1218,6 +1271,13 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook } } + // Add the request to the log. + if (whiteListResultStringArray != null ) { // The request was processed by a whitelist. + resourceRequests.add(whiteListResultStringArray); + } else { // The request didn't match any blocklist entry. Log it as a defult request. + resourceRequests.add(new String[]{String.valueOf(REQUEST_DEFAULT), url}); + } + // The resource request has not been blocked. `return null` loads the requested resource. return null; } @@ -1235,7 +1295,11 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Update the URL in urlTextBox when the page starts to load. @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) {// If night mode is enabled, hide `mainWebView` until after the night mode CSS is applied. + public void onPageStarted(WebView view, String url, Bitmap favicon) { + // Reset the list of resource requests. + resourceRequests.clear(); + + // If night mode is enabled, hide `mainWebView` until after the night mode CSS is applied. if (nightMode) { mainWebView.setVisibility(View.INVISIBLE); } @@ -1243,7 +1307,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Hide the keyboard. `0` indicates no additional flags. inputMethodManager.hideSoftInputFromWindow(mainWebView.getWindowToken(), 0); - // Check to see if we are waiting on Orbot. + // Check to see if Privacy Browser is waiting on Orbot. if (!waitingForOrbot) { // We are not waiting on Orbot, so we need to process the URL. // We need to update `formattedUrlString` at the beginning of the load, so that if the user toggles JavaScript during the load the new website is reloaded. formattedUrlString = url; @@ -2178,6 +2242,12 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook urlHistoryDialogFragment.show(getSupportFragmentManager(), getString(R.string.history)); break; + case R.id.requests: + // Launch the requests activity. + Intent requestsIntent = new Intent(this, RequestsActivity.class); + startActivity(requestsIntent); + break; + case R.id.downloads: // Launch the system Download Manager. Intent downloadManagerIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS); @@ -2193,7 +2263,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook reapplyDomainSettingsOnRestart = true; currentDomainName = ""; - // Launch `DomainsActivity`. + // Launch the domains activity. Intent domainsIntent = new Intent(this, DomainsActivity.class); startActivity(domainsIntent); break; @@ -2206,7 +2276,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook reapplyDomainSettingsOnRestart = true; currentDomainName = ""; - // Launch `SettingsActivity`. + // Launch the settings activity. Intent settingsIntent = new Intent(this, SettingsActivity.class); startActivity(settingsIntent); break; @@ -3094,7 +3164,10 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Decode `formattedUri` as a `String` in `UTF-8`. formattedUrlString = URLDecoder.decode(formattedUri.build().toString(), "UTF-8"); - } else { + } else if (unformattedUrlString.isEmpty()){ // Load a blank web site. + // Load a blank string. + formattedUrlString = ""; + } else { // Search for the contents of the URL box. // Sanitize the search input and convert it to a search. final String encodedUrlString = URLEncoder.encode(unformattedUrlString, "UTF-8"); @@ -3105,19 +3178,18 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // Clear the focus from the URL text box. Otherwise, proximate typing in the box will retain the colorized formatting instead of being reset during refocus. urlTextBox.clearFocus(); + // Make it so. loadUrl(formattedUrlString); } - - private void loadUrl(String url) { - // Apply any custom domain settings. + private void loadUrl(String url) {// Apply any custom domain settings. applyDomainSettings(url, true, false); - // Load the URL. - mainWebView.loadUrl(url, customHeaders); - // Set `urlIsLoading` to prevent changes in the user agent on websites with redirects from reloading the current website. urlIsLoading = true; + + // Load the URL. + mainWebView.loadUrl(url, customHeaders); } public void findPreviousOnPage(View view) { @@ -3321,6 +3393,11 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook loadingNewDomainName = !hostName.equals(currentDomainName); } + // Strings don't like to be null. + if (hostName == null) { + hostName = ""; + } + // Only apply the domain settings if a new domain is being loaded. This allows the user to set temporary settings for JavaScript, cookies, DOM storage, etc. if (loadingNewDomainName) { // Set the new `hostname` as the `currentDomainName`. @@ -3370,20 +3447,22 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook domainNameInDatabase = hostName; } - // If `hostName` is not `null`, check all the subdomains of `hostName` against wildcard domains in `domainCursor`. - if (hostName != null) { - while (hostName.contains(".") && !domainSettingsApplied) { // Stop checking if we run out of `.` or if we already know that `domainSettingsApplied` is `true`. - if (domainSettingsSet.contains("*." + hostName)) { // Check the host name prepended by `*.`. - domainSettingsApplied = true; - domainNameInDatabase = "*." + hostName; - } + // Check all the subdomains of the host name against wildcard domains in the domain cursor. + while (!domainSettingsApplied && hostName.contains(".")) { // Stop checking if domain settings are already applied or there are no more `.` in the host name. + if (domainSettingsSet.contains("*." + hostName)) { // Check the host name prepended by `*.`. + // Apply the domain settings. + domainSettingsApplied = true; - // Strip out the lowest subdomain of `host`. - hostName = hostName.substring(hostName.indexOf(".") + 1); + // Store the applied domain names as it appears in the database. + domainNameInDatabase = "*." + hostName; } + + // Strip out the lowest subdomain of of the host name. + hostName = hostName.substring(hostName.indexOf(".") + 1); } - // Get a handle for the shared preference. `this` references the current context. + + // Get a handle for the shared preference. SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); // Store the general preference information. @@ -3554,7 +3633,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook } else { urlAppBarRelativeLayout.setBackground(getResources().getDrawable(R.drawable.url_bar_background_light_green)); } - } else { // The URL we are loading does not have custom domain settings. Load the defaults. + } else { // The new URL does not have custom domain settings. Load the defaults. // Store the values from `sharedPreferences` in variables. javaScriptEnabled = sharedPreferences.getBoolean("javascript_enabled", false); firstPartyCookiesEnabled = sharedPreferences.getBoolean("first_party_cookies_enabled", false); @@ -3647,11 +3726,11 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook if (mainMenu != null) { updatePrivacyIcons(true); } + } - // Reload the website if returning from the Domains activity. - if (reloadWebsite) { - mainWebView.reload(); - } + // Reload the website if returning from the Domains activity. + if (reloadWebsite) { + mainWebView.reload(); } }