Skip to content

Commit f50eaf4

Browse files
Merge pull request #17501 from nextcloud/fix/network-constraits
fix(upload): use supported transports
2 parents 91d739a + af4df95 commit f50eaf4

3 files changed

Lines changed: 52 additions & 23 deletions

File tree

app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import com.nextcloud.client.jobs.upload.AlbumFileUploadWorker
3939
import com.nextcloud.client.jobs.upload.FileUploadHelper
4040
import com.nextcloud.client.jobs.upload.FileUploadWorker
4141
import com.nextcloud.client.jobs.worker.WorkerFilesPayload
42+
import com.nextcloud.client.network.SupportedNetworkTransports
4243
import com.nextcloud.client.preferences.AppPreferences
4344
import com.nextcloud.utils.extensions.isWorkScheduled
4445
import com.owncloud.android.datamodel.OCFile
@@ -522,10 +523,7 @@ internal class BackgroundJobManagerImpl(
522523
.putLong(AutoUploadWorker.SYNCED_FOLDER_ID, syncedFolderID)
523524
.build()
524525

525-
val constraints = Constraints.Builder()
526-
.setRequiredNetworkType(NetworkType.CONNECTED)
527-
.setRequiresCharging(syncedFolder.isChargingOnly)
528-
.build()
526+
val constraints = SupportedNetworkTransports.getConstraints(requiresCharging = syncedFolder.isChargingOnly)
529527

530528
val requestBuilder = oneTimeRequestBuilder(
531529
jobClass = AutoUploadWorker::class,
@@ -672,9 +670,7 @@ internal class BackgroundJobManagerImpl(
672670
val batches = uploadIds.toList().chunked(batchSize)
673671
val tag = startFileUploadJobTag(user.accountName)
674672

675-
val constraints = Constraints.Builder()
676-
.setRequiredNetworkType(NetworkType.CONNECTED)
677-
.build()
673+
val constraints = SupportedNetworkTransports.getConstraints()
678674

679675
val dataBuilder = Data.Builder()
680676
.putBoolean(

app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import android.content.Context
1010
import android.net.ConnectivityManager
1111
import android.net.Network
1212
import android.net.NetworkCapabilities
13-
import android.os.Build
1413
import android.os.SystemClock
1514
import com.nextcloud.client.account.UserAccountManager
1615
import com.nextcloud.operations.GetMethod
@@ -110,7 +109,7 @@ class ConnectivityServiceImpl(
110109
}
111110

112111
val resolvedCapabilities = resolveNetworkCapabilities()
113-
if (resolvedCapabilities == null || !isSupportedTransport(resolvedCapabilities)) {
112+
if (resolvedCapabilities == null || !SupportedNetworkTransports.isSupportedTransport(resolvedCapabilities)) {
114113
Log_OC.e(TAG, "no usable network transport at check time, treating as walled")
115114
return true
116115
}
@@ -162,7 +161,7 @@ class ConnectivityServiceImpl(
162161
Log_OC.w(TAG, "no network capabilities found, connectivity is disconnected")
163162
Connectivity.DISCONNECTED
164163
} else {
165-
val hasTransport = isSupportedTransport(capabilities)
164+
val hasTransport = SupportedNetworkTransports.isSupportedTransport(capabilities)
166165
val hasInternetCapability = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
167166

168167
Connectivity(
@@ -239,21 +238,9 @@ class ConnectivityServiceImpl(
239238

240239
return connectivityManager.allNetworks
241240
.mapNotNull { connectivityManager.getNetworkCapabilities(it) }
242-
.firstOrNull { isSupportedTransport(it) }
241+
.firstOrNull { SupportedNetworkTransports.isSupportedTransport(it) }
243242
}
244243

245-
private fun isSupportedTransport(capabilities: NetworkCapabilities) =
246-
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
247-
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
248-
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) ||
249-
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) ||
250-
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) ||
251-
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE) ||
252-
(
253-
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
254-
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)
255-
)
256-
257244
private fun getWalledValueFromException(e: Exception): Boolean = when (e) {
258245
is UnknownHostException,
259246
is ConnectException -> {
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
package com.nextcloud.client.network
8+
9+
import android.net.NetworkCapabilities
10+
import android.net.NetworkRequest
11+
import android.os.Build
12+
import androidx.work.Constraints
13+
import androidx.work.NetworkType
14+
15+
object SupportedNetworkTransports {
16+
private val values: List<Int>
17+
get() = buildList {
18+
add(NetworkCapabilities.TRANSPORT_WIFI)
19+
add(NetworkCapabilities.TRANSPORT_CELLULAR)
20+
add(NetworkCapabilities.TRANSPORT_ETHERNET)
21+
add(NetworkCapabilities.TRANSPORT_VPN)
22+
add(NetworkCapabilities.TRANSPORT_BLUETOOTH)
23+
add(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
24+
25+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
26+
add(NetworkCapabilities.TRANSPORT_USB)
27+
}
28+
}
29+
30+
fun getConstraints(requiresCharging: Boolean = false): Constraints {
31+
val networkRequest = NetworkRequest.Builder()
32+
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
33+
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
34+
.apply {
35+
values.forEach { addTransportType(it) }
36+
}
37+
.build()
38+
39+
return Constraints.Builder()
40+
.setRequiredNetworkRequest(networkRequest, NetworkType.CONNECTED)
41+
.setRequiresCharging(requiresCharging)
42+
.build()
43+
}
44+
45+
fun isSupportedTransport(capabilities: NetworkCapabilities) = values.any { capabilities.hasTransport(it) }
46+
}

0 commit comments

Comments
 (0)