]> gitweb.stoutner.com Git - PrivacyBrowserAndroid.git/blobdiff - app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java
Remove the third-party cookies icon from the list of additional icons to display...
[PrivacyBrowserAndroid.git] / app / src / main / java / com / stoutner / privacybrowser / MainWebViewActivity.java
index d604a2e1f14bec7b4cb39094d8c0ae7203772ee1..4433cf386ed82e30037aa660848c5950a5b2ee42 100644 (file)
@@ -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<String, String> customHeaders = new HashMap<String, String>();
 
 
@@ -222,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
@@ -347,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));
             }
         });
 
@@ -452,6 +440,15 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
         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();
 
@@ -532,12 +529,10 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
         // 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);
-            toggleThirdPartyCookies.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);
-            toggleThirdPartyCookies.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
             toggleDomStorage.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
             toggleSaveFormData.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
         }
@@ -822,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:
@@ -920,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();
 
@@ -962,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.
@@ -986,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();
@@ -1091,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);
         }