From 7aacd0e844f74925ddbd278c567d17da79775a67 Mon Sep 17 00:00:00 2001 From: Soren Stoutner Date: Fri, 11 May 2018 16:40:08 -0700 Subject: [PATCH] Allow uploading of files on API >= 21. Fixes https://redmine.stoutner.com/issues/1 --- app/build.gradle | 1 + .../activities/MainWebViewActivity.java | 36 +++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index a7c204eb..85c0ba70 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,6 +22,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 27 buildToolsVersion '27.0.3' + defaultConfig { minSdkVersion 19 targetSdkVersion 27 diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java index 020df487..0bf8d0d6 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java @@ -88,6 +88,7 @@ import android.view.inputmethod.InputMethodManager; import android.webkit.CookieManager; import android.webkit.HttpAuthHandler; import android.webkit.SslErrorHandler; +import android.webkit.ValueCallback; import android.webkit.WebBackForwardList; import android.webkit.WebChromeClient; import android.webkit.WebResourceResponse; @@ -398,6 +399,9 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook // `oldFolderNameString` is used in `onCreate()` and `onSaveEditBookmarkFolder()`. private String oldFolderNameString; + // `fileChooserCallback` is used in `onCreate()` and `onActivityResult()`. + private ValueCallback fileChooserCallback; + // The download strings are used in `onCreate()` and `onRequestPermissionResult()`. private String downloadUrl; private String downloadContentDisposition; @@ -906,7 +910,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook webViewTitle = title; } - // Enter full screen video + // Enter full screen video. @Override public void onShowCustomView(View view, CustomViewCallback callback) { // Pause the ad if this is the free flavor. @@ -934,7 +938,8 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook fullScreenVideoFrameLayout.setVisibility(View.VISIBLE); } - // Exit full screen video + // Exit full screen video. + @Override public void onHideCustomView() { // Hide `fullScreenVideoFrameLayout`. fullScreenVideoFrameLayout.removeAllViews(); @@ -955,6 +960,23 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook adView = findViewById(R.id.adview); } } + + // Upload files. + @Override + public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) { + // Show the file chooser if the device is running API >= 21. + if (Build.VERSION.SDK_INT >= 21) { + // Store the file path callback. + fileChooserCallback = filePathCallback; + + // Create an intent to open a chooser based ont the file chooser parameters. + Intent fileChooserIntent = fileChooserParams.createIntent(); + + // Open the file chooser. Currently only one `startActivityForResult` exists in this activity, so the request code, used to differentiate them, is simply `0`. + startActivityForResult(fileChooserIntent, 0); + } + return true; + } }); // Register `mainWebView` for a context menu. This is used to see link targets and download images. @@ -2960,6 +2982,16 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook } } + // Process the results of an upload file chooser. Currently there is only one `startActivityForResult` in this activity, so the request code, used to differentiate them, is ignored. + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + // File uploads only work on API >= 21. + if (Build.VERSION.SDK_INT >= 21) { + // Pass the file to the WebView. + fileChooserCallback.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data)); + } + } + private void loadUrlFromTextBox() throws UnsupportedEncodingException { // Get the text from urlTextBox and convert it to a string. trim() removes white spaces from the beginning and end of the string. String unformattedUrlString = urlTextBox.getText().toString().trim(); -- 2.45.2