Skip to content

Commit 2a5e233

Browse files
committed
Do not apply network constraint if "io.element.disable_network_constraint" is set to true in .well-known file.
1 parent 842aeb7 commit 2a5e233

File tree

6 files changed

+44
-16
lines changed

6 files changed

+44
-16
lines changed

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/di/WorkManagerProvider.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ import androidx.work.WorkRequest
2929
import kotlinx.coroutines.CoroutineScope
3030
import kotlinx.coroutines.launch
3131
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
32+
import org.matrix.android.sdk.api.extensions.orFalse
3233
import org.matrix.android.sdk.internal.session.SessionScope
34+
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
3335
import org.matrix.android.sdk.internal.worker.MatrixWorkerFactory
3436
import java.util.concurrent.TimeUnit
3537
import javax.inject.Inject
@@ -102,12 +104,14 @@ internal class WorkManagerProvider @Inject constructor(
102104
companion object {
103105
private const val MATRIX_SDK_TAG_PREFIX = "MatrixSDK-"
104106

105-
/**
106-
* Default constraints: connected network.
107-
*/
108-
val workConstraints = Constraints.Builder()
109-
.setRequiredNetworkType(NetworkType.CONNECTED)
110-
.build()
107+
fun getWorkConstraints(
108+
homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
109+
): Constraints {
110+
val withNetworkConstraint = homeServerCapabilitiesDataSource.getHomeServerCapabilities()?.disableNetworkConstraint.orFalse().not()
111+
return Constraints.Builder()
112+
.apply { if (withNetworkConstraint) setRequiredNetworkType(NetworkType.CONNECTED) }
113+
.build()
114+
}
111115

112116
// Use min value, smaller value will be ignored
113117
const val BACKOFF_DELAY_MILLIS = WorkRequest.MIN_BACKOFF_MILLIS

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/DefaultPushersService.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.matrix.android.sdk.internal.database.query.where
2727
import org.matrix.android.sdk.internal.di.SessionDatabase
2828
import org.matrix.android.sdk.internal.di.SessionId
2929
import org.matrix.android.sdk.internal.di.WorkManagerProvider
30+
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
3031
import org.matrix.android.sdk.internal.session.pushers.gateway.PushGatewayNotifyTask
3132
import org.matrix.android.sdk.internal.task.TaskExecutor
3233
import org.matrix.android.sdk.internal.task.configureWith
@@ -44,7 +45,8 @@ internal class DefaultPushersService @Inject constructor(
4445
private val addPusherTask: AddPusherTask,
4546
private val togglePusherTask: TogglePusherTask,
4647
private val removePusherTask: RemovePusherTask,
47-
private val taskExecutor: TaskExecutor
48+
private val taskExecutor: TaskExecutor,
49+
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
4850
) : PushersService {
4951

5052
override suspend fun testPush(
@@ -130,7 +132,7 @@ internal class DefaultPushersService @Inject constructor(
130132
private fun enqueueAddPusher(pusher: JsonPusher): UUID {
131133
val params = AddPusherWorker.Params(sessionId, pusher)
132134
val request = workManagerProvider.matrixOneTimeWorkRequestBuilder<AddPusherWorker>()
133-
.setConstraints(WorkManagerProvider.workConstraints)
135+
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
134136
.setInputData(WorkerParamsFactory.toData(params))
135137
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)
136138
.build()

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/DefaultSendService.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import org.matrix.android.sdk.internal.crypto.store.IMXCommonCryptoStore
5353
import org.matrix.android.sdk.internal.di.SessionId
5454
import org.matrix.android.sdk.internal.di.WorkManagerProvider
5555
import org.matrix.android.sdk.internal.session.content.UploadContentWorker
56+
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
5657
import org.matrix.android.sdk.internal.session.room.send.queue.EventSenderProcessor
5758
import org.matrix.android.sdk.internal.task.TaskExecutor
5859
import org.matrix.android.sdk.internal.util.CancelableWork
@@ -73,7 +74,8 @@ internal class DefaultSendService @AssistedInject constructor(
7374
private val taskExecutor: TaskExecutor,
7475
private val localEchoRepository: LocalEchoRepository,
7576
private val eventSenderProcessor: EventSenderProcessor,
76-
private val cancelSendTracker: CancelSendTracker
77+
private val cancelSendTracker: CancelSendTracker,
78+
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
7779
) : SendService {
7880

7981
@AssistedFactory
@@ -373,7 +375,7 @@ internal class DefaultSendService @AssistedInject constructor(
373375
val uploadWorkData = WorkerParamsFactory.toData(uploadMediaWorkerParams)
374376

375377
return workManagerProvider.matrixOneTimeWorkRequestBuilder<UploadContentWorker>()
376-
.setConstraints(WorkManagerProvider.workConstraints)
378+
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
377379
.startChain(true)
378380
.setInputData(uploadWorkData)
379381
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineSendEventWorkCommon.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.work.ListenableWorker
2222
import androidx.work.OneTimeWorkRequest
2323
import org.matrix.android.sdk.api.util.Cancelable
2424
import org.matrix.android.sdk.internal.di.WorkManagerProvider
25+
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
2526
import org.matrix.android.sdk.internal.util.CancelableWork
2627
import org.matrix.android.sdk.internal.worker.startChain
2728
import java.util.concurrent.TimeUnit
@@ -34,7 +35,8 @@ import javax.inject.Inject
3435
* if not the chain will be doomed in failed state.
3536
*/
3637
internal class TimelineSendEventWorkCommon @Inject constructor(
37-
private val workManagerProvider: WorkManagerProvider
38+
private val workManagerProvider: WorkManagerProvider,
39+
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
3840
) {
3941

4042
fun postWork(roomId: String, workRequest: OneTimeWorkRequest, policy: ExistingWorkPolicy = ExistingWorkPolicy.APPEND_OR_REPLACE): Cancelable {
@@ -47,7 +49,7 @@ internal class TimelineSendEventWorkCommon @Inject constructor(
4749

4850
inline fun <reified W : ListenableWorker> createWork(data: Data, startChain: Boolean): OneTimeWorkRequest {
4951
return workManagerProvider.matrixOneTimeWorkRequestBuilder<W>()
50-
.setConstraints(WorkManagerProvider.workConstraints)
52+
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
5153
.startChain(startChain)
5254
.setInputData(data)
5355
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/DefaultSyncService.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.matrix.android.sdk.api.session.sync.SyncService
2020
import org.matrix.android.sdk.internal.di.SessionId
2121
import org.matrix.android.sdk.internal.di.WorkManagerProvider
2222
import org.matrix.android.sdk.internal.session.SessionState
23+
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
2324
import org.matrix.android.sdk.internal.session.sync.job.SyncThread
2425
import org.matrix.android.sdk.internal.session.sync.job.SyncWorker
2526
import timber.log.Timber
@@ -33,15 +34,26 @@ internal class DefaultSyncService @Inject constructor(
3334
private val syncTokenStore: SyncTokenStore,
3435
private val syncRequestStateTracker: SyncRequestStateTracker,
3536
private val sessionState: SessionState,
37+
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
3638
) : SyncService {
3739
private var syncThread: SyncThread? = null
3840

3941
override fun requireBackgroundSync() {
40-
SyncWorker.requireBackgroundSync(workManagerProvider, sessionId)
42+
SyncWorker.requireBackgroundSync(
43+
workManagerProvider = workManagerProvider,
44+
sessionId = sessionId,
45+
homeServerCapabilitiesDataSource = homeServerCapabilitiesDataSource,
46+
)
4147
}
4248

4349
override fun startAutomaticBackgroundSync(timeOutInSeconds: Long, repeatDelayInSeconds: Long) {
44-
SyncWorker.automaticallyBackgroundSync(workManagerProvider, sessionId, timeOutInSeconds, repeatDelayInSeconds)
50+
SyncWorker.automaticallyBackgroundSync(
51+
workManagerProvider = workManagerProvider,
52+
sessionId = sessionId,
53+
homeServerCapabilitiesDataSource = homeServerCapabilitiesDataSource,
54+
serverTimeoutInSeconds = timeOutInSeconds,
55+
delayInSeconds = repeatDelayInSeconds,
56+
)
4557
}
4658

4759
override fun stopAnyBackgroundSync() {

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncWorker.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import org.matrix.android.sdk.api.failure.isTokenError
2525
import org.matrix.android.sdk.internal.SessionManager
2626
import org.matrix.android.sdk.internal.di.WorkManagerProvider
2727
import org.matrix.android.sdk.internal.session.SessionComponent
28+
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
2829
import org.matrix.android.sdk.internal.session.sync.SyncPresence
2930
import org.matrix.android.sdk.internal.session.sync.SyncTask
3031
import org.matrix.android.sdk.internal.worker.SessionSafeCoroutineWorker
@@ -59,6 +60,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
5960

6061
@Inject lateinit var syncTask: SyncTask
6162
@Inject lateinit var workManagerProvider: WorkManagerProvider
63+
@Inject lateinit var homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource
6264

6365
override fun injectWith(injector: SessionComponent) {
6466
injector.inject(this)
@@ -77,6 +79,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
7779
automaticallyBackgroundSync(
7880
workManagerProvider = workManagerProvider,
7981
sessionId = params.sessionId,
82+
homeServerCapabilitiesDataSource = homeServerCapabilitiesDataSource,
8083
serverTimeoutInSeconds = params.timeout,
8184
delayInSeconds = params.delay,
8285
forceImmediate = hasToDeviceEvents
@@ -86,6 +89,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
8689
requireBackgroundSync(
8790
workManagerProvider = workManagerProvider,
8891
sessionId = params.sessionId,
92+
homeServerCapabilitiesDataSource = homeServerCapabilitiesDataSource,
8993
serverTimeoutInSeconds = 0
9094
)
9195
}
@@ -123,6 +127,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
123127
fun requireBackgroundSync(
124128
workManagerProvider: WorkManagerProvider,
125129
sessionId: String,
130+
homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
126131
serverTimeoutInSeconds: Long = 0
127132
) {
128133
val data = WorkerParamsFactory.toData(
@@ -134,7 +139,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
134139
)
135140
)
136141
val workRequest = workManagerProvider.matrixOneTimeWorkRequestBuilder<SyncWorker>()
137-
.setConstraints(WorkManagerProvider.workConstraints)
142+
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
138143
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)
139144
.setInputData(data)
140145
.startChain(true)
@@ -146,6 +151,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
146151
fun automaticallyBackgroundSync(
147152
workManagerProvider: WorkManagerProvider,
148153
sessionId: String,
154+
homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
149155
serverTimeoutInSeconds: Long = 0,
150156
delayInSeconds: Long = 30,
151157
forceImmediate: Boolean = false
@@ -160,7 +166,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
160166
)
161167
)
162168
val workRequest = workManagerProvider.matrixOneTimeWorkRequestBuilder<SyncWorker>()
163-
.setConstraints(WorkManagerProvider.workConstraints)
169+
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
164170
.setInputData(data)
165171
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)
166172
.setInitialDelay(if (forceImmediate) 0 else delayInSeconds, TimeUnit.SECONDS)

0 commit comments

Comments
 (0)