From 84eb6a2e4131163748909a2a890c0db3a2e3ac28 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 18 Aug 2026 15:39:55 +0200 Subject: [PATCH] fix(upload): use supported transports Signed-off-by: alperozturk96 --- .../client/jobs/BackgroundJobManagerImpl.kt | 10 ++-- .../client/network/ConnectivityServiceImpl.kt | 19 ++------ .../network/SupportedNetworkTransports.kt | 46 +++++++++++++++++++ 3 files changed, 52 insertions(+), 23 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 4a28b1715dea..610b3a550742 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt @@ -36,6 +36,7 @@ import com.nextcloud.client.jobs.offlineOperations.OfflineOperationsWorker 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 @@ -490,10 +491,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 request = oneTimeRequestBuilder( jobClass = AutoUploadWorker::class, @@ -633,9 +631,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/ConnectivityServiceImpl.kt b/app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt index 0f59b20edf84..f03fbc73f09b 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 com.nextcloud.client.account.UserAccountManager import com.nextcloud.operations.GetMethod import com.owncloud.android.lib.common.utils.Log_OC @@ -101,7 +100,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 } @@ -155,7 +154,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( @@ -219,21 +218,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 -> { 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) } +}