android/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java

287 lines
9.9 KiB
Java

/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2019 Tobias Kaminsky <tobias@kaminsky.me>
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
package com.owncloud.android.ui.activity;
import android.app.DownloadManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.net.Uri;
import android.os.Handler;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.Toast;
import com.google.android.material.snackbar.Snackbar;
import com.nextcloud.client.account.User;
import com.nextcloud.utils.extensions.IntentExtensionsKt;
import com.owncloud.android.R;
import com.owncloud.android.databinding.RichdocumentsWebviewBinding;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.datamodel.SyncedFolderProvider;
import com.owncloud.android.datamodel.ThumbnailsCacheManager;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeTypeUtil;
import com.owncloud.android.utils.WebViewUtil;
import java.util.Optional;
import javax.inject.Inject;
public abstract class EditorWebView extends ExternalSiteWebView {
public static final int REQUEST_LOCAL_FILE = 101;
public ValueCallback<Uri[]> uploadMessage;
protected Snackbar loadingSnackbar;
protected String fileName;
RichdocumentsWebviewBinding binding;
@Inject SyncedFolderProvider syncedFolderProvider;
protected void loadUrl(String url) {
onUrlLoaded(url);
}
protected void hideLoading() {
binding.thumbnail.setVisibility(View.GONE);
binding.filename.setVisibility(View.GONE);
binding.progressBar2.setVisibility(View.GONE);
getWebView().setVisibility(View.VISIBLE);
if (loadingSnackbar != null) {
loadingSnackbar.dismiss();
}
}
public void onUrlLoaded(String loadedUrl) {
this.url = loadedUrl;
if (!url.isEmpty()) {
new WebViewUtil(getApplicationContext()).setProxyKKPlus(this.getWebView());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
this.getWebView().loadUrl(url);
new Handler().postDelayed(() -> {
if (this.getWebView().getVisibility() != View.VISIBLE) {
Snackbar snackbar = DisplayUtils.createSnackbar(findViewById(android.R.id.content),
R.string.timeout_richDocuments, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.common_cancel, v -> closeView());
viewThemeUtils.material.themeSnackbar(snackbar);
setLoadingSnackbar(snackbar);
snackbar.show();
}
}, 10 * 1000);
} else {
Toast.makeText(getApplicationContext(),
R.string.richdocuments_failed_to_load_document, Toast.LENGTH_LONG).show();
finish();
}
}
public void closeView() {
getWebView().destroy();
finish();
}
@Override
protected void bindView() {
binding = RichdocumentsWebviewBinding.inflate(getLayoutInflater());
}
@Override
protected void postOnCreate() {
super.postOnCreate();
getWebView().setWebChromeClient(new WebChromeClient() {
final 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(IntentExtensionsKt.getParcelableArgument(getIntent(), ExternalSiteWebView.EXTRA_FILE, OCFile.class));
if (getFile() == null) {
Toast.makeText(getApplicationContext(),
R.string.richdocuments_failed_to_load_document, Toast.LENGTH_LONG).show();
finish();
}
if (getFile() != null) {
fileName = getFile().getFileName();
}
Optional<User> user = getUser();
if (!user.isPresent()) {
finish();
return;
}
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) {
if (requestCode == REQUEST_LOCAL_FILE) {
handleLocalFile(data, resultCode);
}
}
protected void handleLocalFile(Intent data, int resultCode) {
if (uploadMessage == null) {
return;
}
uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
uploadMessage = null;
}
protected WebView getWebView() {
return binding.webView;
}
protected View getRootView() {
return binding.getRoot();
}
protected boolean showToolbarByDefault() {
return false;
}
protected void initLoadingScreen(final User user) {
setThumbnailView(user);
binding.filename.setText(fileName);
}
private void openShareDialog() {
Intent intent = new Intent(this, ShareActivity.class);
intent.putExtra(FileActivity.EXTRA_FILE, getFile());
intent.putExtra(FileActivity.EXTRA_USER, getUser().orElseThrow(RuntimeException::new));
startActivity(intent);
}
protected void setThumbnailView(final User user) {
// Todo minimize: only icon by mimetype
OCFile file = getFile();
if (file.isFolder()) {
boolean isAutoUploadFolder = SyncedFolderProvider.isAutoUploadFolder(syncedFolderProvider, file, user);
Integer overlayIconId = file.getFileOverlayIconId(isAutoUploadFolder);
LayerDrawable drawable = MimeTypeUtil.getFileIcon(preferences.isDarkModeEnabled(), overlayIconId, this, viewThemeUtils);
binding.thumbnail.setImageDrawable(drawable);
} else {
if ((MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file)) && file.getRemoteId() != null) {
// Thumbnail in cache?
Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.getRemoteId());
if (thumbnail != null && !file.isUpdateThumbnailNeeded()) {
if (MimeTypeUtil.isVideo(file)) {
Bitmap withOverlay = ThumbnailsCacheManager.addVideoOverlay(thumbnail, this);
binding.thumbnail.setImageBitmap(withOverlay);
} else {
binding.thumbnail.setImageBitmap(thumbnail);
}
}
if ("image/png".equalsIgnoreCase(file.getMimeType())) {
binding.thumbnail.setBackgroundColor(getResources().getColor(R.color.bg_default, getTheme()));
}
} else {
Drawable icon = MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
file.getFileName(),
getApplicationContext(),
viewThemeUtils);
binding.thumbnail.setImageDrawable(icon);
}
}
}
protected void downloadFile(Uri url) {
DownloadManager downloadmanager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
if (downloadmanager == null) {
DisplayUtils.showSnackMessage(getWebView(), getString(R.string.failed_to_download));
return;
}
DownloadManager.Request request = new DownloadManager.Request(url);
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
downloadmanager.enqueue(request);
}
public void setLoadingSnackbar(Snackbar loadingSnackbar) {
this.loadingSnackbar = loadingSnackbar;
}
public class MobileInterface {
@JavascriptInterface
public void close() {
runOnUiThread(EditorWebView.this::closeView);
}
@JavascriptInterface
public void share() {
openShareDialog();
}
@JavascriptInterface
public void loaded() {
runOnUiThread(EditorWebView.this::hideLoading);
}
}
}