X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2FMainWebViewActivity.java;h=4433cf386ed82e30037aa660848c5950a5b2ee42;hp=a48fa3780d25da29a395e17b4084a8138ab5b449;hb=e29020961c70d97a06c810aaff28ef1fd6af4ae7;hpb=e4e45c521ade9eb2f87a97eecffed7e852b09df7 diff --git a/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java b/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java index a48fa378..4433cf38 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java @@ -72,7 +72,8 @@ import java.util.HashMap; import java.util.Map; // We need to use AppCompatActivity from android.support.v7.app.AppCompatActivity to have access to the SupportActionBar until the minimum API is >= 21. -public class MainWebViewActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, CreateHomeScreenShortcut.CreateHomeScreenSchortcutListener, SslCertificateError.SslCertificateErrorListener { +public class MainWebViewActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, CreateHomeScreenShortcut.CreateHomeScreenSchortcutListener, + SslCertificateError.SslCertificateErrorListener, DownloadFile.DownloadFileListener { // `favoriteIcon` is public static so it can be accessed from `CreateHomeScreenShortcut`, `BookmarksActivity`, `CreateBookmark`, `CreateBookmarkFolder`, and `EditBookmark`. // It is also used in `onCreate()` and `onCreateHomeScreenShortcutCreate()`. public static Bitmap favoriteIcon; @@ -103,7 +104,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // It is also used in `onCreate()`, `onCreateOptionsMenu()`, `onPrepareOptionsMenu()`, and `onOptionsItemSelected()`. public static boolean firstPartyCookiesEnabled; - // `thridPartyCookiesEnables` is public static so it can be accessed from `SettingsFragment`. + // `thirdPartyCookiesEnables` is public static so it can be accessed from `SettingsFragment`. // It is also used in `onCreate()`, `onCreateOptionsMenu()`, `onPrepareOptionsMenu()`, and `onOptionsItemSelected()`. public static boolean thirdPartyCookiesEnabled; @@ -128,7 +129,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // `swipeToRefreshEnabled` is public static so it can be accessed from `SettingsFragment`. It is also used in `onCreate()`. public static boolean swipeToRefreshEnabled; - // `customHeader` is public static so it can be accessed from `BookmarksActivity`. It is also used in `onCreate()` and `loadUrlFromTextBox()`. + // `customHeader` is public static so it can be accessed from `BookmarksActivity`. It is also used in `onCreate()`, `onOptionsItemSelected()`, and `loadUrlFromTextBox()`. public static Map customHeaders = new HashMap(); @@ -148,6 +149,9 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // `sslErrorHandler` is used in `onCreate()`, `onSslErrorCancel()`, and `onSslErrorProceed`. private SslErrorHandler sslErrorHandler; + // `sharedPreferences` is used in `onCreate()` and `onCreateOptionsMenu()`. + SharedPreferences sharedPreferences; + @Override // Remove Android Studio's warning about the dangers of using SetJavaScriptEnabled. The whole premise of Privacy Browser is built around an understanding of these dangers. @SuppressLint("SetJavaScriptEnabled") @@ -219,9 +223,6 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // drawerToggle creates the hamburger icon at the start of the AppBar. drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, supportAppBar, R.string.open_navigation, R.string.close_navigation); - // Replace the header that `WebView` creates for `X-Requested-With` with a null value. The default value is the application ID (com.stoutner.privacybrowser.standard). - customHeaders.put("X-Requested-With", ""); - mainWebView.setWebViewClient(new WebViewClient() { // shouldOverrideUrlLoading makes this `WebView` the default handler for URLs inside the app, so that links are not kicked out to other apps. @Override @@ -344,21 +345,11 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // Allow the downloading of files. mainWebView.setDownloadListener(new DownloadListener() { - // Launch the Android download manager when a link leads to a download. @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { - DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); - DownloadManager.Request requestUri = new DownloadManager.Request(Uri.parse(url)); - - // Add the URL as the description for the download. - requestUri.setDescription(url); - - // Show the download notification after the download is completed. - requestUri.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); - - // Initiate the download and display a Snackbar. - downloadManager.enqueue(requestUri); - Snackbar.make(findViewById(R.id.mainWebView), R.string.download_started, Snackbar.LENGTH_SHORT).show(); + // Show the `DownloadFile` `AlertDialog` and name this instance `@string/download`. + DialogFragment downloadFileDialogFragment = DownloadFile.fromUrl(url, contentDisposition, contentLength); + downloadFileDialogFragment.show(getFragmentManager(), getResources().getString(R.string.file_download)); } }); @@ -373,35 +364,35 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation PreferenceManager.setDefaultValues(this, R.xml.preferences, false); // Get the shared preference values. - SharedPreferences savedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); // Set JavaScript initial status. The default value is false. - javaScriptEnabled = savedPreferences.getBoolean("javascript_enabled", false); + javaScriptEnabled = sharedPreferences.getBoolean("javascript_enabled", false); mainWebView.getSettings().setJavaScriptEnabled(javaScriptEnabled); // Initialize cookieManager. cookieManager = CookieManager.getInstance(); // Set cookies initial status. The default value is false. - firstPartyCookiesEnabled = savedPreferences.getBoolean("first_party_cookies_enabled", false); + firstPartyCookiesEnabled = sharedPreferences.getBoolean("first_party_cookies_enabled", false); cookieManager.setAcceptCookie(firstPartyCookiesEnabled); // Set third-party cookies initial status if API >= 21. The default value is false. if (Build.VERSION.SDK_INT >= 21) { - thirdPartyCookiesEnabled = savedPreferences.getBoolean("third_party_cookies_enabled", false); + thirdPartyCookiesEnabled = sharedPreferences.getBoolean("third_party_cookies_enabled", false); cookieManager.setAcceptThirdPartyCookies(mainWebView, thirdPartyCookiesEnabled); } // Set DOM storage initial status. The default value is false. - domStorageEnabled = savedPreferences.getBoolean("dom_storage_enabled", false); + domStorageEnabled = sharedPreferences.getBoolean("dom_storage_enabled", false); mainWebView.getSettings().setDomStorageEnabled(domStorageEnabled); // Set the saved form data initial status. The default is false. - saveFormDataEnabled = savedPreferences.getBoolean("save_form_data_enabled", false); + saveFormDataEnabled = sharedPreferences.getBoolean("save_form_data_enabled", false); mainWebView.getSettings().setSaveFormData(saveFormDataEnabled); // Set the user agent initial status. - String userAgentString = savedPreferences.getString("user_agent", "Default user agent"); + String userAgentString = sharedPreferences.getString("user_agent", "Default user agent"); switch (userAgentString) { case "Default user agent": // Do nothing. @@ -409,46 +400,55 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation case "Custom user agent": // Set the custom user agent on mainWebView, The default is "PrivacyBrowser/1.0". - mainWebView.getSettings().setUserAgentString(savedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0")); + mainWebView.getSettings().setUserAgentString(sharedPreferences.getString("custom_user_agent", "PrivacyBrowser/1.0")); break; default: // Set the selected user agent on mainWebView. The default is "PrivacyBrowser/1.0". - mainWebView.getSettings().setUserAgentString(savedPreferences.getString("user_agent", "PrivacyBrowser/1.0")); + mainWebView.getSettings().setUserAgentString(sharedPreferences.getString("user_agent", "PrivacyBrowser/1.0")); break; } // Set the initial string for JavaScript disabled search. - if (savedPreferences.getString("javascript_disabled_search", "https://duckduckgo.com/html/?q=").equals("Custom URL")) { + if (sharedPreferences.getString("javascript_disabled_search", "https://duckduckgo.com/html/?q=").equals("Custom URL")) { // Get the custom URL string. The default is "". - javaScriptDisabledSearchURL = savedPreferences.getString("javascript_disabled_search_custom_url", ""); + javaScriptDisabledSearchURL = sharedPreferences.getString("javascript_disabled_search_custom_url", ""); } else { // Use the string from javascript_disabled_search. - javaScriptDisabledSearchURL = savedPreferences.getString("javascript_disabled_search", "https://duckduckgo.com/html/?q="); + javaScriptDisabledSearchURL = sharedPreferences.getString("javascript_disabled_search", "https://duckduckgo.com/html/?q="); } // Set the initial string for JavaScript enabled search. - if (savedPreferences.getString("javascript_enabled_search", "https://duckduckgo.com/?q=").equals("Custom URL")) { + if (sharedPreferences.getString("javascript_enabled_search", "https://duckduckgo.com/?q=").equals("Custom URL")) { // Get the custom URL string. The default is "". - javaScriptEnabledSearchURL = savedPreferences.getString("javascript_enabled_search_custom_url", ""); + javaScriptEnabledSearchURL = sharedPreferences.getString("javascript_enabled_search_custom_url", ""); } else { // Use the string from javascript_enabled_search. - javaScriptEnabledSearchURL = savedPreferences.getString("javascript_enabled_search", "https://duckduckgo.com/?q="); + javaScriptEnabledSearchURL = sharedPreferences.getString("javascript_enabled_search", "https://duckduckgo.com/?q="); } // Set the homepage initial status. The default value is `https://www.duckduckgo.com`. - homepage = savedPreferences.getString("homepage", "https://www.duckduckgo.com"); + homepage = sharedPreferences.getString("homepage", "https://www.duckduckgo.com"); // Set the font size initial status. the default value is `100`. - String defaultFontSizeString = savedPreferences.getString("default_font_size", "100"); + String defaultFontSizeString = sharedPreferences.getString("default_font_size", "100"); mainWebView.getSettings().setTextZoom(Integer.valueOf(defaultFontSizeString)); // Set the swipe to refresh initial status. The default is `true`. - swipeToRefreshEnabled = savedPreferences.getBoolean("swipe_to_refresh_enabled", true); + swipeToRefreshEnabled = sharedPreferences.getBoolean("swipe_to_refresh_enabled", true); swipeToRefresh.setEnabled(swipeToRefreshEnabled); + // Replace the header that `WebView` creates for `X-Requested-With` with a null value. The default value is the application ID (com.stoutner.privacybrowser.standard). + customHeaders.put("X-Requested-With", ""); + + // Set Do Not Track. The default is true. + if (sharedPreferences.getBoolean("do_not_track", true)) { + customHeaders.put("DNT", "1"); + } + + // Get the intent information that started the app. final Intent intent = getIntent(); @@ -514,7 +514,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // Set the initial status of the privacy icon. updatePrivacyIcons(privacyBrowserActivity); - // Get MenuItems for checkable menu items. + // Get handles for the menu items. MenuItem toggleFirstPartyCookies = menu.findItem(R.id.toggleFirstPartyCookies); MenuItem toggleThirdPartyCookies = menu.findItem(R.id.toggleThirdPartyCookies); MenuItem toggleDomStorage = menu.findItem(R.id.toggleDomStorage); @@ -526,6 +526,17 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation toggleDomStorage.setChecked(domStorageEnabled); toggleSaveFormData.setChecked(saveFormDataEnabled); + // Set the status of the additional app bar icons. The default is `false`. + if (sharedPreferences.getBoolean("display_additional_app_bar_icons", false)) { + toggleFirstPartyCookies.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + toggleDomStorage.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + toggleSaveFormData.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + } else { //Do not display the additional icons. + toggleFirstPartyCookies.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + toggleDomStorage.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + toggleSaveFormData.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + } + return true; } @@ -806,7 +817,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation DialogFragment createHomeScreenShortcutDialogFragment = new CreateHomeScreenShortcut(); createHomeScreenShortcutDialogFragment.show(getFragmentManager(), getResources().getString(R.string.create_shortcut)); - //Everything else will be handled by CreateHomeScreenShortcut and the associated listeners below. + //Everything else will be handled by `CreateHomeScreenShortcut` and the associated listener below. return true; case R.id.refresh: @@ -904,6 +915,9 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // Clear `formattedUrlString`. formattedUrlString = null; + // Clear `customHeaders`. + customHeaders.clear(); + // Destroy the internal state of the webview. mainWebView.destroy(); @@ -946,11 +960,6 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation invalidateOptionsMenu(); } - @Override - public void onCancelCreateHomeScreenShortcut(DialogFragment dialogFragment) { - // Do nothing because the user selected "Cancel". - } - @Override public void onCreateHomeScreenShortcut(DialogFragment dialogFragment) { // Get shortcutNameEditText from the alert dialog. @@ -970,6 +979,32 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation sendBroadcast(placeBookmarkShortcut); } + @Override + public void onDownloadFile(DialogFragment dialogFragment, String downloadUrl) { + DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + DownloadManager.Request downloadRequest = new DownloadManager.Request(Uri.parse(downloadUrl)); + + // Get the file name from `dialogFragment`. + EditText downloadFileNameEditText = (EditText) dialogFragment.getDialog().findViewById(R.id.download_file_name); + String fileName = downloadFileNameEditText.getText().toString(); + + // Set the download save in the the `DIRECTORY_DOWNLOADS`using `fileName`. + // Once we have `WRITE_EXTERNAL_STORAGE` permissions we can use `setDestinationInExternalPublicDir`. + downloadRequest.setDestinationInExternalFilesDir(this, "/", fileName); + + // Allow `MediaScanner` to index the download if it is a media file. + downloadRequest.allowScanningByMediaScanner(); + + // Add the URL as the description for the download. + downloadRequest.setDescription(downloadUrl); + + // Show the download notification after the download is completed. + downloadRequest.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + + // Initiate the download and display a Snackbar. + downloadManager.enqueue(downloadRequest); + } + public void viewSslCertificate(View view) { // Show the `ViewSslCertificate` `AlertDialog` and name this instance `@string/view_ssl_certificate`. DialogFragment viewSslCertificateDialogFragment = new ViewSslCertificate(); @@ -1075,62 +1110,38 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // Get handles for the icons. MenuItem privacyIcon = mainMenu.findItem(R.id.toggleJavaScript); MenuItem firstPartyCookiesIcon = mainMenu.findItem(R.id.toggleFirstPartyCookies); - MenuItem thirdPartyCookiesIcon = mainMenu.findItem(R.id.toggleThirdPartyCookies); MenuItem domStorageIcon = mainMenu.findItem(R.id.toggleDomStorage); MenuItem formDataIcon = mainMenu.findItem(R.id.toggleSaveFormData); // Update `privacyIcon`. - if (javaScriptEnabled) { - // `JavaScript` is enabled. + if (javaScriptEnabled) { // JavaScript is enabled. privacyIcon.setIcon(R.drawable.javascript_enabled); - } else { - if (firstPartyCookiesEnabled) { - // `JavaScript` is disabled but cookies are enabled. - privacyIcon.setIcon(R.drawable.warning); - } else { - // All the dangerous features are disabled. - privacyIcon.setIcon(R.drawable.privacy_mode); - } + } else if (firstPartyCookiesEnabled) { // JavaScript is disabled but cookies are enabled. + privacyIcon.setIcon(R.drawable.warning); + } else { // All the dangerous features are disabled. + privacyIcon.setIcon(R.drawable.privacy_mode); } // Update `firstPartyCookiesIcon`. - if (firstPartyCookiesEnabled) { - // First-party cookies are enabled. - firstPartyCookiesIcon.setIcon(R.drawable.cookies_warning); - } else { - // First-party cookies are disabled. + if (firstPartyCookiesEnabled) { // First-party cookies are enabled. + firstPartyCookiesIcon.setIcon(R.drawable.cookies_enabled); + } else { // First-party cookies are disabled. firstPartyCookiesIcon.setIcon(R.drawable.cookies_disabled); } - // Update `thirdPartyCookiesIcon`. - if (firstPartyCookiesEnabled) { - if (thirdPartyCookiesEnabled) { - // Third-party cookies are enabled. Bad! - thirdPartyCookiesIcon.setIcon(R.drawable.cookies_critical); - } else { - // Third-party cookies are disabled. - thirdPartyCookiesIcon.setIcon(R.drawable.cookies_disabled); - } - } else { - // First-party cookies are disabled, so third-party cookies are ghosted. - thirdPartyCookiesIcon.setIcon(R.drawable.cookies_ghosted); - } - // Update `domStorageIcon`. - if (javaScriptEnabled) { - if (domStorageEnabled) { - domStorageIcon.setIcon(R.drawable.dom_storage_enabled); - } else { - domStorageIcon.setIcon(R.drawable.dom_storage_disabled); - } - } else { + if (javaScriptEnabled && domStorageEnabled) { // Both JavaScript and DOM storage is enabled. + domStorageIcon.setIcon(R.drawable.dom_storage_enabled); + } else if (javaScriptEnabled){ // JavaScript is enabled but DOM storage is disabled. + domStorageIcon.setIcon(R.drawable.dom_storage_disabled); + } else { // JavaScript is disabled, so DOM storage is ghosted. domStorageIcon.setIcon(R.drawable.dom_storage_ghosted); } // Update `formDataIcon`. - if (saveFormDataEnabled) { + if (saveFormDataEnabled) { // Form data is enabled. formDataIcon.setIcon(R.drawable.form_data_enabled); - } else { + } else { // Form data is disabled. formDataIcon.setIcon(R.drawable.form_data_disabled); }