Support dangerous permission for Android M

Change-Id: I4e2b7dbc229afa52e9693630f95b9f4954f2def0

Conflicts:
	AndroidManifest.xml.jinja2
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 7032029..f6b25f5 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -169,6 +169,18 @@
     }
 
     @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions,
+                                           int[] grantResults) {
+        if (getController().getCurrentWebView() != null) {
+            if (getController().getCurrentWebView().onRequestPermissionsResult(
+                    requestCode, permissions, grantResults)) {
+                return;
+            }
+        }
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+    }
+
+    @Override
     protected void onNewIntent(Intent intent) {
         if (shouldIgnoreIntents()) return;
         EngineInitializer.onNewIntent(BrowserActivity.this, intent);
diff --git a/src/com/android/browser/DownloadSettings.java b/src/com/android/browser/DownloadSettings.java
index 32803de..05e7fe6 100644
--- a/src/com/android/browser/DownloadSettings.java
+++ b/src/com/android/browser/DownloadSettings.java
@@ -52,6 +52,8 @@
 import android.widget.Toast;
 import android.webkit.MimeTypeMap;
 import android.text.TextUtils;
+import android.content.pm.PackageManager;
+import android.Manifest.permission;
 
 import com.android.browser.reflect.ReflectHelper;
 
@@ -86,6 +88,8 @@
     private static final String APK_TYPE="apk";
     private static final String OCTET_STREAM = "application/octet-stream";
 
+    private int nextRequestCode = 2000;
+
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         // initial the DownloadSettings view
@@ -242,15 +246,44 @@
                 return;
             }
 
-            // staring downloading
-            DownloadHandler.startingDownload(DownloadSettings.this,
-                    url, userAgent, contentDisposition,
-                    mimetype, referer, authorization, privateBrowsing, contentLength,
-                    Uri.encode(filename), downloadPath);
-            isDownloadStarted = true;
+            // check for permission
+            if (!hasPermission(permission.WRITE_EXTERNAL_STORAGE)) {
+                requestPermissions(new String[] {permission.WRITE_EXTERNAL_STORAGE},
+                    ++nextRequestCode);
+            } else {
+                download();
+            }
         }
     };
 
+    @Override
+    public void onRequestPermissionsResult(int requestCode,
+        String[] permissions, int[] grantResults) {
+        if (nextRequestCode == requestCode) {
+            if (grantResults.length > 0
+                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                download();
+            } else {
+                finish();
+            }
+        }
+    }
+
+    private void download() {
+        // staring downloading
+        DownloadHandler.startingDownload(DownloadSettings.this,
+                url, userAgent, contentDisposition,
+                mimetype, referer, authorization,
+                privateBrowsing, contentLength,
+                Uri.encode(filename), downloadPath);
+        isDownloadStarted = true;
+    }
+
+    private boolean hasPermission(String permission) {
+        return (checkCallingOrSelfPermission(permission)
+            == PackageManager.PERMISSION_GRANTED);
+    }
+
     private OnClickListener downloadCancelListener = new OnClickListener() {
         @Override
         public void onClick(View v) {
@@ -271,6 +304,9 @@
 
     protected void onResume() {
         super.onResume();
+        if (isDownloadStarted) {
+            finish();
+        }
     }
 
     @Override