Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.nextcloud.utils.extensions

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.net.Proxy
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

private const val PROXY_TAG = "PROXY"
private const val WEB_VIEW_TAG = "WEB_VIEW"

fun WebView.getProxyHost() = OwnCloudClientManagerFactory.getProxyHost() ?: ""
fun WebView.getProxyPort() = OwnCloudClientManagerFactory.getProxyPort()

/**
* From https://stackoverflow.com/a/18453384
*
* @return
*/
@SuppressLint("PrivateApi", "DiscouragedPrivateApi")
@Suppress("TooGenericExceptionCaught", "NestedBlockDepth")
fun WebView.setProxyKKPlus() {
if (TextUtils.isEmpty(getProxyHost()) || getProxyPort() <= 0) {
return
}

val applicationClassName = "android.app.Application"
Log.d(PROXY_TAG, "Setting proxy with >= 4.4 API.")

val appContext = context.applicationContext

System.setProperty("http.proxyHost", getProxyHost())
System.setProperty("http.proxyPort", getProxyPort().toString())
System.setProperty("https.proxyHost", getProxyHost())
System.setProperty("https.proxyPort", getProxyPort().toString())
try {
val applicationClass = Class.forName(applicationClassName)
val loadedApkField = applicationClass.getField("mLoadedApk")
loadedApkField.isAccessible = true
val loadedApk = loadedApkField[appContext]
val loadedApkCls = Class.forName("android.app.LoadedApk")
val receiversField = loadedApkCls.getDeclaredField("mReceivers")
receiversField.isAccessible = true
val receivers = receiversField[loadedApk] as ArrayMap<*, *>
for (receiverMap in receivers.values) {
for (rec in (receiverMap as ArrayMap<*, *>).keys) {
val clazz: Class<*> = rec.javaClass
if (clazz.name.contains("ProxyChangeListener")) {
val onReceiveMethod = clazz.getDeclaredMethod(
"onReceive",
Context::class.java,
Intent::class.java
)
val intent = Intent(Proxy.PROXY_CHANGE_ACTION)
onReceiveMethod.invoke(rec, appContext, intent)
}
}
}
Log.d(PROXY_TAG, "Setting proxy with >= 4.4 API successful!")
} catch (e: Exception) {
val sw = StringWriter()
e.printStackTrace(PrintWriter(sw))
val exceptionAsString = sw.toString()
e.message?.let { Log.v(PROXY_TAG, it) }
Log.v(PROXY_TAG, exceptionAsString)
}
}

fun WebView.hasProxyConfig(): Boolean = getProxyHost().isNotEmpty()

@Suppress("TooGenericExceptionCaught")
fun Context.isWebViewAvailable(): Boolean = try {
WebViewCompat.getCurrentWebViewPackage(this) != null
} catch (e: Exception) {
Log.w(WEB_VIEW_TAG, "WebView provider cannot be resolved: ${e.message}")
false
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import com.nextcloud.utils.RawResourceReader;
import com.nextcloud.utils.SnackbarUtil;
import com.nextcloud.utils.extensions.BundleExtensionsKt;
import com.nextcloud.utils.extensions.WebViewExtensionsKt;
import com.nextcloud.utils.mdm.MDMConfig;
import com.nextcloud.utils.text.LinkFormatter;
import com.owncloud.android.MainApp;
Expand Down Expand Up @@ -104,7 +105,6 @@
import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener;
import com.owncloud.android.utils.ErrorMessageAdapter;
import com.owncloud.android.utils.PermissionUtil;
import com.owncloud.android.utils.WebViewUtil;
import com.owncloud.android.utils.theme.ViewThemeUtils;

import java.net.URLDecoder;
Expand Down Expand Up @@ -908,7 +908,7 @@ protected void onNewIntent(Intent intent) {
private void initSimpleSignupLogin() {
viewThemeUtils.platform.colorCircularProgressBar(accountSetupWebviewBinding.loginWebviewProgressBar, ColorRole.ON_PRIMARY_CONTAINER);
accountSetupWebviewBinding.loginWebview.setVisibility(View.GONE);
new WebViewUtil().setProxyKKPlus(accountSetupWebviewBinding.loginWebview);
WebViewExtensionsKt.setProxyKKPlus(accountSetupWebviewBinding.loginWebview);

accountSetupWebviewBinding.loginWebview.getSettings().setAllowFileAccess(false);
accountSetupWebviewBinding.loginWebview.getSettings().setJavaScriptEnabled(true);
Expand All @@ -921,7 +921,7 @@ private void initSimpleSignupLogin() {
Map<String, String> headers = new HashMap<>();
headers.put(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE);

new WebViewUtil().setProxyKKPlus(accountSetupWebviewBinding.loginWebview);
WebViewExtensionsKt.setProxyKKPlus(accountSetupWebviewBinding.loginWebview);

accountSetupWebviewBinding.loginWebview.loadUrl(getString(R.string.provider_registration_server), headers);
accountSetupWebviewBinding.loginFlowV2.loginFlowInfoV2.setVisibility(View.GONE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ import com.nextcloud.client.account.User
import com.nextcloud.utils.SnackbarUtil
import com.nextcloud.utils.extensions.getParcelableArgument
import com.nextcloud.utils.extensions.getSmallThumbnail
import com.nextcloud.utils.extensions.hasProxyConfig
import com.nextcloud.utils.extensions.isPNG
import com.nextcloud.utils.extensions.setProxyKKPlus
import com.nextcloud.utils.thumbnail.VideoOverlayGenerator
import com.owncloud.android.R
import com.owncloud.android.databinding.RichdocumentsWebviewBinding
Expand All @@ -36,7 +38,6 @@ import com.owncloud.android.datamodel.SyncedFolderObserver
import com.owncloud.android.ui.asynctasks.TextEditorLoadUrlTask
import com.owncloud.android.utils.MimeTypeUtil
import com.owncloud.android.utils.RichDocumentDownloader
import com.owncloud.android.utils.WebViewUtil
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlin.time.Duration.Companion.seconds
Expand Down Expand Up @@ -84,8 +85,10 @@ abstract class EditorWebView : ExternalSiteWebView() {
}

lifecycleScope.launch {
WebViewUtil().setProxyKKPlus(webView)
delay(ONE_SECOND)
if (webView.hasProxyConfig()) {
webView.setProxyKKPlus()
delay(ONE_SECOND)
}

if (loadedUrl != webView.url) {
webView.loadUrl(loadedUrl)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ import androidx.drawerlayout.widget.DrawerLayout
import com.nextcloud.client.utils.IntentUtil
import com.nextcloud.utils.RawResourceReader
import com.nextcloud.utils.SnackbarUtil
import com.nextcloud.utils.extensions.isWebViewAvailable
import com.nextcloud.utils.extensions.setProxyKKPlus
import com.owncloud.android.MainApp
import com.owncloud.android.R
import com.owncloud.android.databinding.ExternalsiteWebviewBinding
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.ui.NextcloudWebViewClient
import com.owncloud.android.utils.WebViewUtil
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings

/**
Expand All @@ -47,7 +48,7 @@ open class ExternalSiteWebView : FileActivity() {
final override fun onCreate(savedInstanceState: Bundle?) {
Log_OC.v(TAG, "onCreate() start")

if (!WebViewUtil.available(this)) {
if (!this.isWebViewAvailable()) {
super.onCreate(savedInstanceState)
SnackbarUtil.show(this, R.string.webview_not_available)
finish()
Expand Down Expand Up @@ -87,7 +88,7 @@ open class ExternalSiteWebView : FileActivity() {
setupWebSettings(webView.settings)
webView.webViewClient = createWebViewClient()

WebViewUtil().setProxyKKPlus(webView)
webView.setProxyKKPlus()
url?.let { webView.loadUrl(it) }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
import com.nextcloud.utils.extensions.OCFileExtensionsKt;
import com.nextcloud.utils.extensions.OCFileListFragmentExtensionsKt;
import com.nextcloud.utils.extensions.ViewExtensionsKt;
import com.nextcloud.utils.extensions.WebViewExtensionsKt;
import com.nextcloud.utils.fileNameValidator.FileNameValidator;
import com.nextcloud.utils.thumbnail.ThumbnailGenerator;
import com.nextcloud.utils.view.FastScrollUtils;
Expand Down Expand Up @@ -118,7 +119,6 @@
import com.owncloud.android.utils.FileSortOrder;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.PermissionUtil;
import com.owncloud.android.utils.WebViewUtil;
import com.owncloud.android.utils.theme.ThemeUtils;

import org.greenrobot.eventbus.EventBus;
Expand Down Expand Up @@ -1262,7 +1262,7 @@ private void handlePendingDownloadFile(OCFile file) {
return;
}

boolean webViewAvailable = WebViewUtil.available(context);
boolean webViewAvailable = WebViewExtensionsKt.isWebViewAvailable(context);

if (!file.isEncrypted() && mContainerActivity instanceof FileDisplayActivity fda && fda.canPreviewInAudioPlayer(file)) {
setFabVisible(false);
Expand Down
99 changes: 0 additions & 99 deletions app/src/main/java/com/owncloud/android/utils/WebViewUtil.kt

This file was deleted.

Loading