From 2b83d960d29ea56b97b3cfe2cc0ad1368da07eca Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 18 Aug 2026 15:39:55 +0200 Subject: [PATCH 1/2] fix(upload): use supported transports Signed-off-by: alperozturk96 # Conflicts: # app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt --- .../client/jobs/BackgroundJobManagerImpl.kt | 10 ++-- .../network/SupportedNetworkTransports.kt | 46 +++++++++++++++++++ 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/client/network/SupportedNetworkTransports.kt diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt index d913d32fc104..12b6ffc52ced 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt @@ -39,6 +39,7 @@ import com.nextcloud.client.jobs.upload.AlbumFileUploadWorker import com.nextcloud.client.jobs.upload.FileUploadHelper import com.nextcloud.client.jobs.upload.FileUploadWorker import com.nextcloud.client.jobs.worker.WorkerFilesPayload +import com.nextcloud.client.network.SupportedNetworkTransports import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.utils.extensions.isWorkScheduled import com.owncloud.android.datamodel.OCFile @@ -522,10 +523,7 @@ internal class BackgroundJobManagerImpl( .putLong(AutoUploadWorker.SYNCED_FOLDER_ID, syncedFolderID) .build() - val constraints = Constraints.Builder() - .setRequiredNetworkType(NetworkType.CONNECTED) - .setRequiresCharging(syncedFolder.isChargingOnly) - .build() + val constraints = SupportedNetworkTransports.getConstraints(requiresCharging = syncedFolder.isChargingOnly) val requestBuilder = oneTimeRequestBuilder( jobClass = AutoUploadWorker::class, @@ -672,9 +670,7 @@ internal class BackgroundJobManagerImpl( val batches = uploadIds.toList().chunked(batchSize) val tag = startFileUploadJobTag(user.accountName) - val constraints = Constraints.Builder() - .setRequiredNetworkType(NetworkType.CONNECTED) - .build() + val constraints = SupportedNetworkTransports.getConstraints() val dataBuilder = Data.Builder() .putBoolean( diff --git a/app/src/main/java/com/nextcloud/client/network/SupportedNetworkTransports.kt b/app/src/main/java/com/nextcloud/client/network/SupportedNetworkTransports.kt new file mode 100644 index 000000000000..72db24a15702 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/network/SupportedNetworkTransports.kt @@ -0,0 +1,46 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +package com.nextcloud.client.network + +import android.net.NetworkCapabilities +import android.net.NetworkRequest +import android.os.Build +import androidx.work.Constraints +import androidx.work.NetworkType + +object SupportedNetworkTransports { + private val values: List + get() = buildList { + add(NetworkCapabilities.TRANSPORT_WIFI) + add(NetworkCapabilities.TRANSPORT_CELLULAR) + add(NetworkCapabilities.TRANSPORT_ETHERNET) + add(NetworkCapabilities.TRANSPORT_VPN) + add(NetworkCapabilities.TRANSPORT_BLUETOOTH) + add(NetworkCapabilities.TRANSPORT_WIFI_AWARE) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + add(NetworkCapabilities.TRANSPORT_USB) + } + } + + fun getConstraints(requiresCharging: Boolean = false): Constraints { + val networkRequest = NetworkRequest.Builder() + .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) + .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) + .apply { + values.forEach { addTransportType(it) } + } + .build() + + return Constraints.Builder() + .setRequiredNetworkRequest(networkRequest, NetworkType.CONNECTED) + .setRequiresCharging(requiresCharging) + .build() + } + + fun isSupportedTransport(capabilities: NetworkCapabilities) = values.any { capabilities.hasTransport(it) } +} From af4df951213bc8f92e5a2b1dba72d96bdafa8669 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 15 Sep 2026 13:32:10 +0200 Subject: [PATCH 2/2] wip Signed-off-by: alperozturk96 --- .../client/network/ConnectivityServiceImpl.kt | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt b/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt index bd9ea8c79fae..fb2cf8c8ef6b 100644 --- a/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt +++ b/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt @@ -10,7 +10,6 @@ import android.content.Context import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities -import android.os.Build import android.os.SystemClock import com.nextcloud.client.account.UserAccountManager import com.nextcloud.operations.GetMethod @@ -110,7 +109,7 @@ class ConnectivityServiceImpl( } val resolvedCapabilities = resolveNetworkCapabilities() - if (resolvedCapabilities == null || !isSupportedTransport(resolvedCapabilities)) { + if (resolvedCapabilities == null || !SupportedNetworkTransports.isSupportedTransport(resolvedCapabilities)) { Log_OC.e(TAG, "no usable network transport at check time, treating as walled") return true } @@ -162,7 +161,7 @@ class ConnectivityServiceImpl( Log_OC.w(TAG, "no network capabilities found, connectivity is disconnected") Connectivity.DISCONNECTED } else { - val hasTransport = isSupportedTransport(capabilities) + val hasTransport = SupportedNetworkTransports.isSupportedTransport(capabilities) val hasInternetCapability = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) Connectivity( @@ -239,21 +238,9 @@ class ConnectivityServiceImpl( return connectivityManager.allNetworks .mapNotNull { connectivityManager.getNetworkCapabilities(it) } - .firstOrNull { isSupportedTransport(it) } + .firstOrNull { SupportedNetworkTransports.isSupportedTransport(it) } } - private fun isSupportedTransport(capabilities: NetworkCapabilities) = - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) || - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) || - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) || - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE) || - ( - Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && - capabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB) - ) - private fun getWalledValueFromException(e: Exception): Boolean = when (e) { is UnknownHostException, is ConnectException -> {