From 7a0d62f0dae28c134be082d1439d6a64897cd547 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 4 Aug 2026 12:13:54 +0200 Subject: [PATCH] check web view for editor Signed-off-by: alperozturk96 --- .../android/ui/activity/EditorWebView.java | 3 ++- .../android/ui/activity/ExternalSiteWebView.java | 16 ++++++++++++++-- .../android/ui/fragment/OCFileListFragment.java | 10 ++++++++-- .../com/owncloud/android/utils/WebViewUtil.kt | 15 +++++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java index 4721bbbe434f..096a05359a95 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java @@ -1,6 +1,7 @@ /* * Nextcloud - Android Client * + * SPDX-FileCopyrightText: 2026 Alper Ozturk * SPDX-FileCopyrightText: 2019 Tobias Kaminsky * SPDX-FileCopyrightText: 2019 Nextcloud GmbH * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only @@ -223,7 +224,7 @@ protected void handleLocalFile(Intent data, int resultCode) { } protected WebView getWebView() { - return binding.webView; + return binding == null ? null : binding.webView; } protected View getRootView() { diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java index fe1107d1b140..96ef2176310c 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java @@ -1,6 +1,7 @@ /* * Nextcloud - Android Client * + * SPDX-FileCopyrightText: 2026 Alper Ozturk * SPDX-FileCopyrightText: 2017 Tobias Kaminsky * SPDX-FileCopyrightText: 2017 Nextcloud GmbH * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only @@ -56,6 +57,14 @@ public class ExternalSiteWebView extends FileActivity { @Override protected final void onCreate(Bundle savedInstanceState) { Log_OC.v(TAG, "onCreate() start"); + + if (!WebViewUtil.available(this)) { + super.onCreate(savedInstanceState); + DisplayUtils.showSnackMessage(this, R.string.webview_not_available); + finish(); + return; + } + bindView(); showToolbar = showToolbarByDefault(); @@ -153,7 +162,10 @@ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request @Override protected void onDestroy() { - getWebView().destroy(); + WebView webView = getWebView(); + if (webView != null) { + webView.destroy(); + } super.onDestroy(); } @@ -232,6 +244,6 @@ public boolean onOptionsItemSelected(MenuItem item) { } protected WebView getWebView() { - return binding.webView; + return binding == null ? null : binding.webView; } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 1ce195ff29b8..87ad1f4aaf0a 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1,6 +1,7 @@ /* * Nextcloud - Android Client * + * SPDX-FileCopyrightText: 2026 Alper Ozturk * SPDX-FileCopyrightText: 2026 Philipp Hasper * SPDX-FileCopyrightText: 2023 TSI-mc * SPDX-FileCopyrightText: 2018-2023 Tobias Kaminsky @@ -121,6 +122,7 @@ import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.utils.MimeTypeUtil; import com.owncloud.android.utils.PermissionUtil; +import com.owncloud.android.utils.WebViewUtil; import com.owncloud.android.utils.overlay.OverlayManager; import com.owncloud.android.utils.theme.ThemeUtils; @@ -1229,15 +1231,19 @@ private void handlePendingDownloadFile(OCFile file) { User account = accountManager.getUser(); OCCapability capability = mContainerActivity.getStorageManager().getCapability(account.getAccountName()); + boolean webViewAvailable = WebViewUtil.available(getContext()); + if (MimeTypeUtil.isVideo(file) && !file.isEncrypted() && mContainerActivity instanceof FileDisplayActivity fda) { setFabVisible(false); fda.startImagePreview(file, true, null); } else if (PreviewMediaActivity.Companion.canBePreviewed(file) && !file.isEncrypted() && mContainerActivity instanceof FileDisplayActivity fda) { setFabVisible(false); fda.startMediaPreview(file, 0, true, true, true, true); - } else if (editorUtils.getEditor(accountManager.getUser(), file.getMimeType()) != null && !file.isEncrypted()) { + } else if (webViewAvailable && + editorUtils.getEditor(accountManager.getUser(), file.getMimeType()) != null && !file.isEncrypted()) { TextEditorWebView.Companion.startTextEditor(file, getContext()); - } else if (capability.getRichDocumentsMimeTypeList() != null && + } else if (webViewAvailable && + capability.getRichDocumentsMimeTypeList() != null && capability.getRichDocumentsMimeTypeList().contains(file.getMimeType()) && capability.getRichDocumentsDirectEditing().isTrue() && !file.isEncrypted()) { mContainerActivity.getFileOperationsHelper().openFileAsRichDocument(file, getContext()); diff --git a/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt b/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt index 2983ab54657c..5badaecd64ba 100644 --- a/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt +++ b/app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt @@ -15,6 +15,7 @@ import android.text.TextUtils import android.util.ArrayMap import android.util.Log import android.webkit.WebView +import androidx.webkit.WebViewCompat import com.owncloud.android.lib.common.OwnCloudClientManagerFactory import java.io.PrintWriter import java.io.StringWriter @@ -80,5 +81,19 @@ class WebViewUtil { companion object { private const val PROXY_TAG = "PROXY" + private const val WEB_VIEW_TAG = "WEB_VIEW" + + @JvmStatic + @Suppress("TooGenericExceptionCaught") + fun available(context: Context?): Boolean { + val context = context ?: return false + + return try { + WebViewCompat.getCurrentWebViewPackage(context) != null + } catch (e: Exception) { + Log.w(WEB_VIEW_TAG, "WebView provider cannot be resolved: ${e.message}") + false + } + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a0f756664301..f4e185883c27 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1528,6 +1528,7 @@ Failed to create conflict dialog Cannot open file chooser + Android System WebView is missing or disabled on this device Send copy to Failed to start action! Action triggered