Skip to content

Commit d4c6a46

Browse files
committed
Parse "io.element.disable_network_constraint" from login response, to ensure that the config is retrieved.
The add pusher worker can be configured before the .well-known config is retrieved.
1 parent 9732468 commit d4c6a46

File tree

13 files changed

+141
-26
lines changed

13 files changed

+141
-26
lines changed

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/DiscoveryInformation.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,11 @@ data class DiscoveryInformation(
3636
* Note: matrix.org does not send this field
3737
*/
3838
@Json(name = "m.identity_server")
39-
val identityServer: WellKnownBaseConfig? = null
39+
val identityServer: WellKnownBaseConfig? = null,
40+
41+
/**
42+
* If set to true, the SDK will not use the network constraint when configuring Worker for the WorkManager.
43+
*/
44+
@Json(name = "io.element.disable_network_constraint")
45+
val disableNetworkConstraint: Boolean? = null,
4046
)

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@ 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
3332
import org.matrix.android.sdk.internal.session.SessionScope
34-
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
33+
import org.matrix.android.sdk.internal.session.workmanager.WorkManagerConfig
3534
import org.matrix.android.sdk.internal.worker.MatrixWorkerFactory
3635
import timber.log.Timber
3736
import java.util.concurrent.TimeUnit
@@ -106,12 +105,12 @@ internal class WorkManagerProvider @Inject constructor(
106105
private const val MATRIX_SDK_TAG_PREFIX = "MatrixSDK-"
107106

108107
fun getWorkConstraints(
109-
homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
108+
workManagerConfig: WorkManagerConfig,
110109
): Constraints {
111-
val withNetworkConstraint = homeServerCapabilitiesDataSource.getHomeServerCapabilities()?.disableNetworkConstraint.orFalse().not()
110+
val widthNetworkConstraint = workManagerConfig.withNetworkConstraint()
112111
return Constraints.Builder()
113112
.apply {
114-
if (withNetworkConstraint) {
113+
if (widthNetworkConstraint) {
115114
setRequiredNetworkType(NetworkType.CONNECTED)
116115
} else {
117116
Timber.w("Network constraint is disabled")

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ import org.matrix.android.sdk.internal.session.room.tombstone.RoomTombstoneEvent
9797
import org.matrix.android.sdk.internal.session.typing.DefaultTypingUsersTracker
9898
import org.matrix.android.sdk.internal.session.user.accountdata.DefaultSessionAccountDataService
9999
import org.matrix.android.sdk.internal.session.widgets.DefaultWidgetURLFormatter
100+
import org.matrix.android.sdk.internal.session.workmanager.DefaultWorkManagerConfig
101+
import org.matrix.android.sdk.internal.session.workmanager.WorkManagerConfig
100102
import retrofit2.Retrofit
101103
import java.io.File
102104
import javax.inject.Provider
@@ -422,4 +424,7 @@ internal abstract class SessionModule {
422424

423425
@Binds
424426
abstract fun bindPollAggregationProcessor(processor: DefaultPollAggregationProcessor): PollAggregationProcessor
427+
428+
@Binds
429+
abstract fun bindWorkManaerConfig(config: DefaultWorkManagerConfig): WorkManagerConfig
425430
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ 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
3130
import org.matrix.android.sdk.internal.session.pushers.gateway.PushGatewayNotifyTask
31+
import org.matrix.android.sdk.internal.session.workmanager.WorkManagerConfig
3232
import org.matrix.android.sdk.internal.task.TaskExecutor
3333
import org.matrix.android.sdk.internal.task.configureWith
3434
import org.matrix.android.sdk.internal.worker.WorkerParamsFactory
@@ -46,7 +46,7 @@ internal class DefaultPushersService @Inject constructor(
4646
private val togglePusherTask: TogglePusherTask,
4747
private val removePusherTask: RemovePusherTask,
4848
private val taskExecutor: TaskExecutor,
49-
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
49+
private val workManagerConfig: WorkManagerConfig,
5050
) : PushersService {
5151

5252
override suspend fun testPush(
@@ -132,7 +132,7 @@ internal class DefaultPushersService @Inject constructor(
132132
private fun enqueueAddPusher(pusher: JsonPusher): UUID {
133133
val params = AddPusherWorker.Params(sessionId, pusher)
134134
val request = workManagerProvider.matrixOneTimeWorkRequestBuilder<AddPusherWorker>()
135-
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
135+
.setConstraints(WorkManagerProvider.getWorkConstraints(workManagerConfig))
136136
.setInputData(WorkerParamsFactory.toData(params))
137137
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)
138138
.build()

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import org.matrix.android.sdk.internal.di.WorkManagerProvider
5555
import org.matrix.android.sdk.internal.session.content.UploadContentWorker
5656
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
5757
import org.matrix.android.sdk.internal.session.room.send.queue.EventSenderProcessor
58+
import org.matrix.android.sdk.internal.session.workmanager.WorkManagerConfig
5859
import org.matrix.android.sdk.internal.task.TaskExecutor
5960
import org.matrix.android.sdk.internal.util.CancelableWork
6061
import org.matrix.android.sdk.internal.worker.WorkerParamsFactory
@@ -75,7 +76,7 @@ internal class DefaultSendService @AssistedInject constructor(
7576
private val localEchoRepository: LocalEchoRepository,
7677
private val eventSenderProcessor: EventSenderProcessor,
7778
private val cancelSendTracker: CancelSendTracker,
78-
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
79+
private val workManagerConfig: WorkManagerConfig,
7980
) : SendService {
8081

8182
@AssistedFactory
@@ -375,7 +376,7 @@ internal class DefaultSendService @AssistedInject constructor(
375376
val uploadWorkData = WorkerParamsFactory.toData(uploadMediaWorkerParams)
376377

377378
return workManagerProvider.matrixOneTimeWorkRequestBuilder<UploadContentWorker>()
378-
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
379+
.setConstraints(WorkManagerProvider.getWorkConstraints(workManagerConfig))
379380
.startChain(true)
380381
.setInputData(uploadWorkData)
381382
.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: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import androidx.work.OneTimeWorkRequest
2323
import org.matrix.android.sdk.api.util.Cancelable
2424
import org.matrix.android.sdk.internal.di.WorkManagerProvider
2525
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
26+
import org.matrix.android.sdk.internal.session.workmanager.WorkManagerConfig
2627
import org.matrix.android.sdk.internal.util.CancelableWork
2728
import org.matrix.android.sdk.internal.worker.startChain
2829
import java.util.concurrent.TimeUnit
@@ -36,7 +37,7 @@ import javax.inject.Inject
3637
*/
3738
internal class TimelineSendEventWorkCommon @Inject constructor(
3839
private val workManagerProvider: WorkManagerProvider,
39-
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
40+
private val workManagerConfig: WorkManagerConfig,
4041
) {
4142

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

5051
inline fun <reified W : ListenableWorker> createWork(data: Data, startChain: Boolean): OneTimeWorkRequest {
5152
return workManagerProvider.matrixOneTimeWorkRequestBuilder<W>()
52-
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
53+
.setConstraints(WorkManagerProvider.getWorkConstraints(workManagerConfig))
5354
.startChain(startChain)
5455
.setInputData(data)
5556
.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: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.matrix.android.sdk.internal.session.SessionState
2323
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
2424
import org.matrix.android.sdk.internal.session.sync.job.SyncThread
2525
import org.matrix.android.sdk.internal.session.sync.job.SyncWorker
26+
import org.matrix.android.sdk.internal.session.workmanager.WorkManagerConfig
2627
import timber.log.Timber
2728
import javax.inject.Inject
2829
import javax.inject.Provider
@@ -34,23 +35,23 @@ internal class DefaultSyncService @Inject constructor(
3435
private val syncTokenStore: SyncTokenStore,
3536
private val syncRequestStateTracker: SyncRequestStateTracker,
3637
private val sessionState: SessionState,
37-
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
38+
private val workManagerConfig: WorkManagerConfig,
3839
) : SyncService {
3940
private var syncThread: SyncThread? = null
4041

4142
override fun requireBackgroundSync() {
4243
SyncWorker.requireBackgroundSync(
4344
workManagerProvider = workManagerProvider,
4445
sessionId = sessionId,
45-
homeServerCapabilitiesDataSource = homeServerCapabilitiesDataSource,
46+
workManagerConfig = workManagerConfig,
4647
)
4748
}
4849

4950
override fun startAutomaticBackgroundSync(timeOutInSeconds: Long, repeatDelayInSeconds: Long) {
5051
SyncWorker.automaticallyBackgroundSync(
5152
workManagerProvider = workManagerProvider,
5253
sessionId = sessionId,
53-
homeServerCapabilitiesDataSource = homeServerCapabilitiesDataSource,
54+
workManagerConfig = workManagerConfig,
5455
serverTimeoutInSeconds = timeOutInSeconds,
5556
delayInSeconds = repeatDelayInSeconds,
5657
)

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import org.matrix.android.sdk.internal.session.SessionComponent
2828
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
2929
import org.matrix.android.sdk.internal.session.sync.SyncPresence
3030
import org.matrix.android.sdk.internal.session.sync.SyncTask
31+
import org.matrix.android.sdk.internal.session.workmanager.WorkManagerConfig
3132
import org.matrix.android.sdk.internal.worker.SessionSafeCoroutineWorker
3233
import org.matrix.android.sdk.internal.worker.SessionWorkerParams
3334
import org.matrix.android.sdk.internal.worker.WorkerParamsFactory
@@ -60,7 +61,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
6061

6162
@Inject lateinit var syncTask: SyncTask
6263
@Inject lateinit var workManagerProvider: WorkManagerProvider
63-
@Inject lateinit var homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource
64+
@Inject lateinit var workManagerConfig: WorkManagerConfig
6465

6566
override fun injectWith(injector: SessionComponent) {
6667
injector.inject(this)
@@ -79,7 +80,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
7980
automaticallyBackgroundSync(
8081
workManagerProvider = workManagerProvider,
8182
sessionId = params.sessionId,
82-
homeServerCapabilitiesDataSource = homeServerCapabilitiesDataSource,
83+
workManagerConfig = workManagerConfig,
8384
serverTimeoutInSeconds = params.timeout,
8485
delayInSeconds = params.delay,
8586
forceImmediate = hasToDeviceEvents
@@ -89,7 +90,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
8990
requireBackgroundSync(
9091
workManagerProvider = workManagerProvider,
9192
sessionId = params.sessionId,
92-
homeServerCapabilitiesDataSource = homeServerCapabilitiesDataSource,
93+
workManagerConfig = workManagerConfig,
9394
serverTimeoutInSeconds = 0
9495
)
9596
}
@@ -127,7 +128,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
127128
fun requireBackgroundSync(
128129
workManagerProvider: WorkManagerProvider,
129130
sessionId: String,
130-
homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
131+
workManagerConfig: WorkManagerConfig,
131132
serverTimeoutInSeconds: Long = 0
132133
) {
133134
val data = WorkerParamsFactory.toData(
@@ -139,7 +140,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
139140
)
140141
)
141142
val workRequest = workManagerProvider.matrixOneTimeWorkRequestBuilder<SyncWorker>()
142-
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
143+
.setConstraints(WorkManagerProvider.getWorkConstraints(workManagerConfig))
143144
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)
144145
.setInputData(data)
145146
.startChain(true)
@@ -151,7 +152,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
151152
fun automaticallyBackgroundSync(
152153
workManagerProvider: WorkManagerProvider,
153154
sessionId: String,
154-
homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
155+
workManagerConfig: WorkManagerConfig,
155156
serverTimeoutInSeconds: Long = 0,
156157
delayInSeconds: Long = 30,
157158
forceImmediate: Boolean = false
@@ -166,7 +167,7 @@ internal class SyncWorker(context: Context, workerParameters: WorkerParameters,
166167
)
167168
)
168169
val workRequest = workManagerProvider.matrixOneTimeWorkRequestBuilder<SyncWorker>()
169-
.setConstraints(WorkManagerProvider.getWorkConstraints(homeServerCapabilitiesDataSource))
170+
.setConstraints(WorkManagerProvider.getWorkConstraints(workManagerConfig))
170171
.setInputData(data)
171172
.setBackoffCriteria(BackoffPolicy.LINEAR, WorkManagerProvider.BACKOFF_DELAY_MILLIS, TimeUnit.MILLISECONDS)
172173
.setInitialDelay(if (forceImmediate) 0 else delayInSeconds, TimeUnit.SECONDS)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2023 New Vector Ltd
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.matrix.android.sdk.internal.session.workmanager
18+
19+
import org.matrix.android.sdk.api.auth.data.Credentials
20+
import org.matrix.android.sdk.api.extensions.orFalse
21+
import org.matrix.android.sdk.internal.session.homeserver.HomeServerCapabilitiesDataSource
22+
import javax.inject.Inject
23+
24+
internal class DefaultWorkManagerConfig @Inject constructor(
25+
private val credentials: Credentials,
26+
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
27+
) : WorkManagerConfig {
28+
override fun withNetworkConstraint(): Boolean {
29+
return if (credentials.discoveryInformation?.disableNetworkConstraint == true) {
30+
false
31+
} else {
32+
homeServerCapabilitiesDataSource.getHomeServerCapabilities()?.disableNetworkConstraint.orFalse().not()
33+
}
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright (c) 2023 New Vector Ltd
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.matrix.android.sdk.internal.session.workmanager
18+
19+
internal interface WorkManagerConfig {
20+
fun withNetworkConstraint(): Boolean
21+
}

0 commit comments

Comments
 (0)