mirror of
https://github.com/nextcloud/android.git
synced 2024-11-26 07:05:49 +03:00
fix(EditorWebView): Move local image upload to the editor web view
This makes sure that direct editing apps like text can also use regular upload image methods through file input elements in the webview fixes #11215 fixes #10744 Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
parent
bbedbc973a
commit
23d3dc22b5
2 changed files with 71 additions and 59 deletions
|
@ -23,6 +23,7 @@
|
||||||
package com.owncloud.android.ui.activity;
|
package com.owncloud.android.ui.activity;
|
||||||
|
|
||||||
import android.app.DownloadManager;
|
import android.app.DownloadManager;
|
||||||
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
@ -31,6 +32,8 @@ import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.webkit.JavascriptInterface;
|
import android.webkit.JavascriptInterface;
|
||||||
|
import android.webkit.ValueCallback;
|
||||||
|
import android.webkit.WebChromeClient;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
@ -45,6 +48,8 @@ import com.owncloud.android.utils.DisplayUtils;
|
||||||
import com.owncloud.android.utils.MimeTypeUtil;
|
import com.owncloud.android.utils.MimeTypeUtil;
|
||||||
|
|
||||||
public abstract class EditorWebView extends ExternalSiteWebView {
|
public abstract class EditorWebView extends ExternalSiteWebView {
|
||||||
|
public static final int REQUEST_LOCAL_FILE = 101;
|
||||||
|
public ValueCallback<Uri[]> uploadMessage;
|
||||||
protected Snackbar loadingSnackbar;
|
protected Snackbar loadingSnackbar;
|
||||||
|
|
||||||
protected String fileName;
|
protected String fileName;
|
||||||
|
@ -104,6 +109,34 @@ public abstract class EditorWebView extends ExternalSiteWebView {
|
||||||
protected void postOnCreate() {
|
protected void postOnCreate() {
|
||||||
super.postOnCreate();
|
super.postOnCreate();
|
||||||
|
|
||||||
|
getWebView().setWebChromeClient(new WebChromeClient() {
|
||||||
|
EditorWebView activity = EditorWebView.this;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
|
||||||
|
FileChooserParams fileChooserParams) {
|
||||||
|
if (uploadMessage != null) {
|
||||||
|
uploadMessage.onReceiveValue(null);
|
||||||
|
uploadMessage = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
activity.uploadMessage = filePathCallback;
|
||||||
|
|
||||||
|
Intent intent = fileChooserParams.createIntent();
|
||||||
|
intent.setType("image/*");
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
|
try {
|
||||||
|
activity.startActivityForResult(intent, REQUEST_LOCAL_FILE);
|
||||||
|
} catch (ActivityNotFoundException e) {
|
||||||
|
uploadMessage = null;
|
||||||
|
Toast.makeText(getBaseContext(), "Cannot open file chooser", Toast.LENGTH_LONG).show();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
setFile(getIntent().getParcelableExtra(ExternalSiteWebView.EXTRA_FILE));
|
setFile(getIntent().getParcelableExtra(ExternalSiteWebView.EXTRA_FILE));
|
||||||
|
|
||||||
if (getFile() == null) {
|
if (getFile() == null) {
|
||||||
|
@ -124,6 +157,42 @@ public abstract class EditorWebView extends ExternalSiteWebView {
|
||||||
initLoadingScreen(user.get());
|
initLoadingScreen(user.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
if (RESULT_OK != resultCode) {
|
||||||
|
if (requestCode == REQUEST_LOCAL_FILE) {
|
||||||
|
this.uploadMessage.onReceiveValue(null);
|
||||||
|
this.uploadMessage = null;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
handleActivityResult(requestCode, resultCode, data);
|
||||||
|
|
||||||
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void handleActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
switch (requestCode) {
|
||||||
|
case REQUEST_LOCAL_FILE:
|
||||||
|
handleLocalFile(data, resultCode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// unexpected, do nothing
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void handleLocalFile(Intent data, int resultCode) {
|
||||||
|
if (uploadMessage == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
|
||||||
|
uploadMessage = null;
|
||||||
|
}
|
||||||
|
|
||||||
protected WebView getWebView() {
|
protected WebView getWebView() {
|
||||||
return binding.webView;
|
return binding.webView;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
|
|
||||||
package com.owncloud.android.ui.activity;
|
package com.owncloud.android.ui.activity;
|
||||||
|
|
||||||
import android.content.ActivityNotFoundException;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
@ -32,10 +31,6 @@ import android.os.Bundle;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.webkit.JavascriptInterface;
|
import android.webkit.JavascriptInterface;
|
||||||
import android.webkit.ValueCallback;
|
|
||||||
import android.webkit.WebChromeClient;
|
|
||||||
import android.webkit.WebView;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import com.nextcloud.client.account.CurrentAccountProvider;
|
import com.nextcloud.client.account.CurrentAccountProvider;
|
||||||
import com.nextcloud.client.account.User;
|
import com.nextcloud.client.account.User;
|
||||||
|
@ -67,7 +62,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||||
* Opens document for editing via Richdocuments app in a web view
|
* Opens document for editing via Richdocuments app in a web view
|
||||||
*/
|
*/
|
||||||
public class RichDocumentsEditorWebView extends EditorWebView {
|
public class RichDocumentsEditorWebView extends EditorWebView {
|
||||||
public static final int REQUEST_LOCAL_FILE = 101;
|
|
||||||
private static final int REQUEST_REMOTE_FILE = 100;
|
private static final int REQUEST_REMOTE_FILE = 100;
|
||||||
private static final String URL = "URL";
|
private static final String URL = "URL";
|
||||||
private static final String HYPERLINK = "Url";
|
private static final String HYPERLINK = "Url";
|
||||||
|
@ -76,8 +70,6 @@ public class RichDocumentsEditorWebView extends EditorWebView {
|
||||||
private static final String SLIDESHOW = "slideshow";
|
private static final String SLIDESHOW = "slideshow";
|
||||||
private static final String NEW_NAME = "NewName";
|
private static final String NEW_NAME = "NewName";
|
||||||
|
|
||||||
public ValueCallback<Uri[]> uploadMessage;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
protected CurrentAccountProvider currentAccountProvider;
|
protected CurrentAccountProvider currentAccountProvider;
|
||||||
|
|
||||||
|
@ -91,34 +83,6 @@ public class RichDocumentsEditorWebView extends EditorWebView {
|
||||||
|
|
||||||
getWebView().addJavascriptInterface(new RichDocumentsMobileInterface(), "RichDocumentsMobileInterface");
|
getWebView().addJavascriptInterface(new RichDocumentsMobileInterface(), "RichDocumentsMobileInterface");
|
||||||
|
|
||||||
getWebView().setWebChromeClient(new WebChromeClient() {
|
|
||||||
RichDocumentsEditorWebView activity = RichDocumentsEditorWebView.this;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
|
|
||||||
FileChooserParams fileChooserParams) {
|
|
||||||
if (uploadMessage != null) {
|
|
||||||
uploadMessage.onReceiveValue(null);
|
|
||||||
uploadMessage = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
activity.uploadMessage = filePathCallback;
|
|
||||||
|
|
||||||
Intent intent = fileChooserParams.createIntent();
|
|
||||||
intent.setType("image/*");
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
|
||||||
try {
|
|
||||||
activity.startActivityForResult(intent, REQUEST_LOCAL_FILE);
|
|
||||||
} catch (ActivityNotFoundException e) {
|
|
||||||
uploadMessage = null;
|
|
||||||
Toast.makeText(getBaseContext(), "Cannot open file chooser", Toast.LENGTH_LONG).show();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// load url in background
|
// load url in background
|
||||||
loadUrl(getIntent().getStringExtra(EXTRA_URL));
|
loadUrl(getIntent().getStringExtra(EXTRA_URL));
|
||||||
}
|
}
|
||||||
|
@ -135,20 +99,8 @@ public class RichDocumentsEditorWebView extends EditorWebView {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
protected void handleActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
if (RESULT_OK != resultCode) {
|
|
||||||
if (requestCode == REQUEST_LOCAL_FILE) {
|
|
||||||
this.uploadMessage.onReceiveValue(null);
|
|
||||||
this.uploadMessage = null;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (requestCode) {
|
switch (requestCode) {
|
||||||
case REQUEST_LOCAL_FILE:
|
|
||||||
handleLocalFile(data, resultCode);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case REQUEST_REMOTE_FILE:
|
case REQUEST_REMOTE_FILE:
|
||||||
handleRemoteFile(data);
|
handleRemoteFile(data);
|
||||||
break;
|
break;
|
||||||
|
@ -158,16 +110,7 @@ public class RichDocumentsEditorWebView extends EditorWebView {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
super.handleActivityResult(requestCode, resultCode, data);
|
||||||
}
|
|
||||||
|
|
||||||
private void handleLocalFile(Intent data, int resultCode) {
|
|
||||||
if (uploadMessage == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
|
|
||||||
uploadMessage = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleRemoteFile(Intent data) {
|
private void handleRemoteFile(Intent data) {
|
||||||
|
|
Loading…
Reference in a new issue