Enable downloading of files.
authorSoren Stoutner <soren@stoutner.com>
Wed, 2 Dec 2015 22:05:01 +0000 (15:05 -0700)
committerSoren Stoutner <soren@stoutner.com>
Wed, 2 Dec 2015 22:05:01 +0000 (15:05 -0700)
app/src/main/AndroidManifest.xml
app/src/main/java/com/stoutner/privacybrowser/Webview.java
app/src/main/res/menu/menu_webview.xml
app/src/main/res/values/strings.xml

index 1f558d1..1f1aed5 100644 (file)
@@ -3,9 +3,6 @@
     package="com.stoutner.privacybrowser" >
 
     <uses-permission android:name="android.permission.INTERNET" />
-    <!-- READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE are required to download files. -->
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
     <application
         android:allowBackup="false"
@@ -14,8 +11,8 @@
         android:label="@string/privacy_browser"
         android:theme="@style/AppTheme" >
 
-        <!-- configChanges orientation and screenSize makes the app not reload when the orientation changes. -->
-        <!-- windowSoftInputMode stateAlwaysHidden hides the keyboard when the app starts. -->
+        <!-- android:configChanges="orientation|screenSize" makes the app not reload when the orientation changes. -->
+        <!-- android:windowSoftInputMode="stateAlwaysHidden" hides the keyboard when the app starts. -->
         <activity
             android:name=".Webview"
             android:configChanges="orientation|screenSize"
@@ -26,7 +23,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
 
-            <!-- android.intent.action.VIEW with the schemes enables processing of web intents. -->
+            <!-- android.intent.action.VIEW with the two schemes enables processing of web intents. -->
             <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
                 <category android:name="android.intent.category.BROWSABLE" />
index 0de84bf..116360d 100644 (file)
@@ -1,16 +1,22 @@
 package com.stoutner.privacybrowser;
 
+import android.Manifest;
 import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
 import android.app.Activity;
+import android.app.DownloadManager;
 import android.content.ClipData;
 import android.content.ClipboardManager;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Environment;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AppCompatActivity;
 import android.util.Patterns;
@@ -19,6 +25,7 @@ import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
+import android.webkit.DownloadListener;
 import android.webkit.WebChromeClient;
 import android.webkit.WebResourceError;
 import android.webkit.WebResourceRequest;
@@ -29,6 +36,7 @@ import android.widget.ImageView;
 import android.widget.ProgressBar;
 import android.widget.Toast;
 
+import java.io.File;
 import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -90,7 +98,7 @@ public class Webview extends AppCompatActivity {
             }
 
             public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
-                Toast.makeText(mainWebViewActivity, "Error loading " + request + "   Error: " + error, Toast.LENGTH_SHORT).show();
+                Toast.makeText(mainWebViewActivity, "Error loading " + request + "   Error: " + error, Toast.LENGTH_LONG).show();
             }
 
             // Update the URL in urlTextBox when the page starts to load.
@@ -141,6 +149,26 @@ public class Webview extends AppCompatActivity {
             }
         });
 
+        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 if the API is 11 or greater.
+                if (Build.VERSION.SDK_INT >= 11) {
+                    requestUri.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+                }
+
+                downloadManager.enqueue(requestUri);
+                Toast.makeText(mainWebViewActivity, "Download started", Toast.LENGTH_SHORT).show();
+            }
+        });
+
         // Allow pinch to zoom.
         mainWebView.getSettings().setBuiltInZoomControls(true);
 
@@ -240,6 +268,15 @@ public class Webview extends AppCompatActivity {
                     startActivity(Intent.createChooser(shareIntent, "Share URL"));
                 }
                 break;
+
+            case R.id.downloads:
+                // Launch the system Download Manager.
+                Intent downloadManangerIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
+
+                // Launch as a new task so that Download Manager and Privacy Browser show as separate windows in the recent tasks list.
+                downloadManangerIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+                startActivity(downloadManangerIntent);
         }
 
         return super.onOptionsItemSelected(menuItem);
index 57346e8..a1cf47d 100644 (file)
@@ -7,27 +7,27 @@
     <item
         android:id="@+id/home"
         android:title="@string/home"
-        android:orderInCategory="100"
+        android:orderInCategory="10"
         android:icon="@drawable/ic_home_black_24dp"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/refresh"
         android:title="@string/refresh"
-        android:orderInCategory="200"
+        android:orderInCategory="20"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/back"
         android:title="@string/back"
-        android:orderInCategory="200"
+        android:orderInCategory="30"
         android:icon="@drawable/ic_back"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/forward"
         android:title="@string/forward"
-        android:orderInCategory="300"
+        android:orderInCategory="40"
         android:icon="@drawable/ic_forward"
         app:showAsAction="never" />
 
@@ -35,7 +35,7 @@
     <item
         android:id="@+id/copyURL"
         android:title="@string/copyURL"
-        android:orderInCategory="400"
+        android:orderInCategory="50"
         tools:targetApi="11"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/pasteURL"
         android:title="@string/pasteURL"
-        android:orderInCategory="500"
+        android:orderInCategory="60"
         tools:targetApi="11"
         app:showAsAction="never" />
 
     <item
         android:id="@+id/shareURL"
         android:title="@string/shareURL"
-        android:orderInCategory="600"
+        android:orderInCategory="70"
+        app:showAsAction="never" />
+
+    <item
+        android:id="@+id/downloads"
+        android:title="@string/downloads"
+        android:orderInCategory="80"
         app:showAsAction="never" />
 </menu>
index 2e838ee..1afee76 100644 (file)
@@ -13,4 +13,5 @@
     <string name="copyURL">Copy URL</string>
     <string name="pasteURL">Paste URL</string>
     <string name="shareURL">Share URL</string>
+    <string name="downloads">Downloads</string>
 </resources>