Fix a crash when attempting to download a file or image that does not have an HTTP...
authorSoren Stoutner <soren@stoutner.com>
Tue, 24 Jan 2017 23:10:09 +0000 (16:10 -0700)
committerSoren Stoutner <soren@stoutner.com>
Tue, 24 Jan 2017 23:10:09 +0000 (16:10 -0700)
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebView.java
app/src/main/res/values/strings.xml

index 542a1baf0e296159b4d8b303b117764c13359063..83246d0227aca14eb62f783d005a72d119256328 100644 (file)
@@ -144,7 +144,7 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
     // `swipeRefreshLayout` is used in `onCreate()`, `onPrepareOptionsMenu`, and `onRestart()`.
     private SwipeRefreshLayout swipeRefreshLayout;
 
     // `swipeRefreshLayout` is used in `onCreate()`, `onPrepareOptionsMenu`, and `onRestart()`.
     private SwipeRefreshLayout swipeRefreshLayout;
 
-    // `cookieManager` is used in `onCreate()`, `onOptionsItemSelected()`, and `onNavigationItemSelected()`, and `onRestart()`.
+    // `cookieManager` is used in `onCreate()`, `onOptionsItemSelected()`, and `onNavigationItemSelected()`, `onDownloadImage()`, `onDownloadFile()`, and `onRestart()`.
     private CookieManager cookieManager;
 
     // `customHeader` is used in `onCreate()`, `onOptionsItemSelected()`, `onCreateContextMenu()`, and `loadUrlFromTextBox()`.
     private CookieManager cookieManager;
 
     // `customHeader` is used in `onCreate()`, `onOptionsItemSelected()`, `onCreateContextMenu()`, and `loadUrlFromTextBox()`.
@@ -157,7 +157,7 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
     // `firstPartyCookiesEnabled` is used in `onCreate()`, `onCreateOptionsMenu()`, `onPrepareOptionsMenu()`, `onOptionsItemSelected()`, `onDownloadImage()`, `onDownloadFile()`, and `applySettings()`.
     private boolean firstPartyCookiesEnabled;
 
     // `firstPartyCookiesEnabled` is used in `onCreate()`, `onCreateOptionsMenu()`, `onPrepareOptionsMenu()`, `onOptionsItemSelected()`, `onDownloadImage()`, `onDownloadFile()`, and `applySettings()`.
     private boolean firstPartyCookiesEnabled;
 
-    // `thirdPartyCookiesEnabled` used in `onCreate()`, `onCreateOptionsMenu()`, `onPrepareOptionsMenu()`, `onOptionsItemSelected()`, `onDownloadImage()`, `onDownloadFile()`, and `applySettings()`.
+    // `thirdPartyCookiesEnabled` used in `onCreate()`, `onCreateOptionsMenu()`, `onPrepareOptionsMenu()`, `onOptionsItemSelected()`, and `applySettings()`.
     private boolean thirdPartyCookiesEnabled;
 
     // `domStorageEnabled` is used in `onCreate()`, `onCreateOptionsMenu()`, `onOptionsItemSelected()`, and `applySettings()`.
     private boolean thirdPartyCookiesEnabled;
 
     // `domStorageEnabled` is used in `onCreate()`, `onCreateOptionsMenu()`, `onOptionsItemSelected()`, and `applySettings()`.
@@ -1478,80 +1478,95 @@ public class MainWebView extends AppCompatActivity implements NavigationView.OnN
 
     @Override
     public void onDownloadImage(AppCompatDialogFragment dialogFragment, String imageUrl) {
 
     @Override
     public void onDownloadImage(AppCompatDialogFragment dialogFragment, String imageUrl) {
-        // Get a handle for the system `DOWNLOAD_SERVICE`.
-        DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
+        // Download the image if it has an HTTP or HTTPS URI.
+        if (imageUrl.startsWith("http")) {
+            // Get a handle for the system `DOWNLOAD_SERVICE`.
+            DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
 
 
-        // Parse `imageUrl`.
-        DownloadManager.Request downloadRequest = new DownloadManager.Request(Uri.parse(imageUrl));
+            // Parse `imageUrl`.
+            DownloadManager.Request downloadRequest = new DownloadManager.Request(Uri.parse(imageUrl));
 
 
-        // Pass cookies to download manager if cookies are enabled.  This is required to download item from websites that require a login.
-        if (firstPartyCookiesEnabled) {
-            String cookies = cookieManager.getCookie(imageUrl);
-            // In the HTTP request header, cookies are named `Cookie`.
-            downloadRequest.addRequestHeader("Cookie", cookies);
-        }
+            // Pass cookies to download manager if cookies are enabled.  This is required to download images from websites that require a login.
+            if (firstPartyCookiesEnabled) {
+                // Get the cookies for `imageUrl`.
+                String cookies = cookieManager.getCookie(imageUrl);
 
 
-        // Get the file name from `dialogFragment`.
-        EditText downloadImageNameEditText = (EditText) dialogFragment.getDialog().findViewById(R.id.download_image_name);
-        String imageName = downloadImageNameEditText.getText().toString();
+                // Add the cookies to `downloadRequest`.  In the HTTP request header, cookies are named `Cookie`.
+                downloadRequest.addRequestHeader("Cookie", cookies);
+            }
 
 
-        // Once we have `WRITE_EXTERNAL_STORAGE` permissions we can use `setDestinationInExternalPublicDir`.
-        if (Build.VERSION.SDK_INT >= 23) { // If API >= 23, set the download save in the the `DIRECTORY_DOWNLOADS` using `imageName`.
-            downloadRequest.setDestinationInExternalFilesDir(this, "/", imageName);
-        } else { // Only set the title using `imageName`.
-            downloadRequest.setTitle(imageName);
-        }
+            // Get the file name from `dialogFragment`.
+            EditText downloadImageNameEditText = (EditText) dialogFragment.getDialog().findViewById(R.id.download_image_name);
+            String imageName = downloadImageNameEditText.getText().toString();
 
 
-        // Allow `MediaScanner` to index the download if it is a media file.
-        downloadRequest.allowScanningByMediaScanner();
+            // Once we have `WRITE_EXTERNAL_STORAGE` permissions we can use `setDestinationInExternalPublicDir`.
+            if (Build.VERSION.SDK_INT >= 23) { // If API >= 23, set the download save in the the `DIRECTORY_DOWNLOADS` using `imageName`.
+                downloadRequest.setDestinationInExternalFilesDir(this, "/", imageName);
+            } else { // Only set the title using `imageName`.
+                downloadRequest.setTitle(imageName);
+            }
 
 
-        // Add the URL as the description for the download.
-        downloadRequest.setDescription(imageUrl);
+            // Allow `MediaScanner` to index the download if it is a media file.
+            downloadRequest.allowScanningByMediaScanner();
 
 
-        // Show the download notification after the download is completed.
-        downloadRequest.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+            // Add the URL as the description for the download.
+            downloadRequest.setDescription(imageUrl);
 
 
-        // Initiate the download.
-        downloadManager.enqueue(downloadRequest);
+            // Show the download notification after the download is completed.
+            downloadRequest.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+
+            // Initiate the download.
+            downloadManager.enqueue(downloadRequest);
+        } else {  // The image is not an HTTP or HTTPS URI.
+            Snackbar.make(mainWebView, R.string.cannot_download_image, Snackbar.LENGTH_INDEFINITE).show();
+        }
     }
 
     @Override
     public void onDownloadFile(AppCompatDialogFragment dialogFragment, String downloadUrl) {
     }
 
     @Override
     public void onDownloadFile(AppCompatDialogFragment dialogFragment, String downloadUrl) {
-        // Get a handle for the system `DOWNLOAD_SERVICE`.
-        DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
+        // Download the file if it has an HTTP or HTTPS URI.
+        if (downloadUrl.startsWith("http")) {
 
 
-        // Parse `downloadUrl`.
-        DownloadManager.Request downloadRequest = new DownloadManager.Request(Uri.parse(downloadUrl));
+            // Get a handle for the system `DOWNLOAD_SERVICE`.
+            DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
 
 
-        // Pass cookies to download manager if cookies are enabled.  This is required to download item from websites that require a login.
-        if (firstPartyCookiesEnabled) {
-            String cookies = cookieManager.getCookie(downloadUrl);
-            // In the HTTP request header, cookies are named `Cookie`.
-            downloadRequest.addRequestHeader("Cookie", cookies);
-        }
+            // Parse `downloadUrl`.
+            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();
+            // Pass cookies to download manager if cookies are enabled.  This is required to download files from websites that require a login.
+            if (firstPartyCookiesEnabled) {
+                // Get the cookies for `downloadUrl`.
+                String cookies = cookieManager.getCookie(downloadUrl);
 
 
-        // Once we have `WRITE_EXTERNAL_STORAGE` permissions we can use `setDestinationInExternalPublicDir`.
-        if (Build.VERSION.SDK_INT >= 23) { // If API >= 23, set the download location to `/sdcard/Android/data/com.stoutner.privacybrowser.standard/files` named `fileName`.
-            downloadRequest.setDestinationInExternalFilesDir(this, "/", fileName);
-        } else { // Only set the title using `fileName`.
-            downloadRequest.setTitle(fileName);
-        }
+                // Add the cookies to `downloadRequest`.  In the HTTP request header, cookies are named `Cookie`.
+                downloadRequest.addRequestHeader("Cookie", cookies);
+            }
+
+            // Get the file name from `dialogFragment`.
+            EditText downloadFileNameEditText = (EditText) dialogFragment.getDialog().findViewById(R.id.download_file_name);
+            String fileName = downloadFileNameEditText.getText().toString();
 
 
-        // Allow `MediaScanner` to index the download if it is a media file.
-        downloadRequest.allowScanningByMediaScanner();
+            // Once we have `WRITE_EXTERNAL_STORAGE` permissions we can use `setDestinationInExternalPublicDir`.
+            if (Build.VERSION.SDK_INT >= 23) { // If API >= 23, set the download location to `/sdcard/Android/data/com.stoutner.privacybrowser.standard/files` named `fileName`.
+                downloadRequest.setDestinationInExternalFilesDir(this, "/", fileName);
+            } else { // Only set the title using `fileName`.
+                downloadRequest.setTitle(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);
+            // 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);
+            // Show the download notification after the download is completed.
+            downloadRequest.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
 
 
-        // Initiate the download.
-        downloadManager.enqueue(downloadRequest);
+            // Initiate the download.
+            downloadManager.enqueue(downloadRequest);
+        } else {  // The download is not an HTTP or HTTPS URI.
+            Snackbar.make(mainWebView, R.string.cannot_download_file, Snackbar.LENGTH_INDEFINITE).show();
+        }
     }
 
     public void viewSslCertificate(View view) {
     }
 
     public void viewSslCertificate(View view) {
index b92ba9c00a308aa5b96b2ee9199915f05dde2bba..a473f6a235e9744230ec9f8f7585f5deb4ddbc13 100644 (file)
@@ -53,6 +53,8 @@
     <string name="image_name">Image name</string>
     <string name="unknown_size">unknown size</string>
     <string name="download">Download</string>
     <string name="image_name">Image name</string>
     <string name="unknown_size">unknown size</string>
     <string name="download">Download</string>
+    <string name="cannot_download_file">This file cannot be downloaded because it does not have an HTTP or HTTPS URI.</string>
+    <string name="cannot_download_image">This image cannot be downloaded because it does not have an HTTP or HTTPS URI.</string>
 
     <!-- Custom App Bar. -->
     <string name="favorite_icon">Favorite Icon</string>
 
     <!-- Custom App Bar. -->
     <string name="favorite_icon">Favorite Icon</string>