mirror of
https://github.com/nextcloud/talk-android
synced 2025-02-01 12:11:59 +00:00
Use WorkManager queue to chain workers.
This is necessary as many of the workers store user data. When running in parallel, there are race conditions and user data that was stored by one worker gets directly overwritten by the next worker. E.g. this happened with the "externalSignalingServer" attribute of user: SignalingSettingsWorker saved the user with the externalSignalingServer value, but then CapabilitiesWorker kicked in and saved the user without this value. Because of this, in WebsocketConnectionsWorker getExternalSignalingServer() of the user was null. Because of this, webSocketConnectionHelper.getExternalSignalingInstanceForServer(..) was not called. So the webSocketInstanceMap in WebSocketConnectionHelper was never filled. This is why WebSocketConnectionHelper.getMagicWebSocketInstanceForUserId(..) in ChatController failed to get a webSocketInstance. Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
parent
8c991c697f
commit
609e5a2c71
@ -61,6 +61,7 @@ import com.nextcloud.talk.dagger.modules.ViewModelModule
|
||||
import com.nextcloud.talk.jobs.AccountRemovalWorker
|
||||
import com.nextcloud.talk.jobs.CapabilitiesWorker
|
||||
import com.nextcloud.talk.jobs.SignalingSettingsWorker
|
||||
import com.nextcloud.talk.jobs.WebsocketConnectionsWorker
|
||||
import com.nextcloud.talk.ui.theme.ThemeModule
|
||||
import com.nextcloud.talk.utils.ClosedInterfaceImpl
|
||||
import com.nextcloud.talk.utils.DeviceUtils
|
||||
@ -177,18 +178,22 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver {
|
||||
DeviceUtils.ignoreSpecialBatteryFeatures()
|
||||
|
||||
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build()
|
||||
val capabilitiesUpdateWork = OneTimeWorkRequest.Builder(CapabilitiesWorker::class.java).build()
|
||||
val signalingSettingsWork = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java).build()
|
||||
val websocketConnectionsWorker = OneTimeWorkRequest.Builder(WebsocketConnectionsWorker::class.java).build()
|
||||
|
||||
WorkManager.getInstance(applicationContext)
|
||||
.beginWith(accountRemovalWork)
|
||||
.then(capabilitiesUpdateWork)
|
||||
.then(signalingSettingsWork)
|
||||
.then(websocketConnectionsWorker)
|
||||
.enqueue()
|
||||
|
||||
val periodicCapabilitiesUpdateWork = PeriodicWorkRequest.Builder(
|
||||
CapabilitiesWorker::class.java,
|
||||
HALF_DAY,
|
||||
TimeUnit.HOURS
|
||||
).build()
|
||||
|
||||
val capabilitiesUpdateWork = OneTimeWorkRequest.Builder(CapabilitiesWorker::class.java).build()
|
||||
val signalingSettingsWork = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java).build()
|
||||
|
||||
WorkManager.getInstance(applicationContext).enqueue(accountRemovalWork)
|
||||
WorkManager.getInstance(applicationContext).enqueue(capabilitiesUpdateWork)
|
||||
WorkManager.getInstance(applicationContext).enqueue(signalingSettingsWork)
|
||||
WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork(
|
||||
"DailyCapabilitiesUpdateWork",
|
||||
ExistingPeriodicWorkPolicy.REPLACE,
|
||||
|
@ -48,6 +48,7 @@ import com.nextcloud.talk.events.EventStatus
|
||||
import com.nextcloud.talk.jobs.CapabilitiesWorker
|
||||
import com.nextcloud.talk.jobs.PushRegistrationWorker
|
||||
import com.nextcloud.talk.jobs.SignalingSettingsWorker
|
||||
import com.nextcloud.talk.jobs.WebsocketConnectionsWorker
|
||||
import com.nextcloud.talk.models.json.capabilities.Capabilities
|
||||
import com.nextcloud.talk.models.json.capabilities.CapabilitiesOverall
|
||||
import com.nextcloud.talk.models.json.generic.Status
|
||||
@ -434,11 +435,15 @@ class AccountVerificationController(args: Bundle? = null) :
|
||||
Data.Builder()
|
||||
.putLong(KEY_INTERNAL_USER_ID, internalAccountId)
|
||||
.build()
|
||||
val signalingSettings =
|
||||
OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java)
|
||||
.setInputData(userData)
|
||||
.build()
|
||||
WorkManager.getInstance().enqueue(signalingSettings)
|
||||
val signalingSettings = OneTimeWorkRequest.Builder(SignalingSettingsWorker::class.java)
|
||||
.setInputData(userData)
|
||||
.build()
|
||||
val websocketConnectionsWorker = OneTimeWorkRequest.Builder(WebsocketConnectionsWorker::class.java).build()
|
||||
|
||||
WorkManager.getInstance(applicationContext!!)
|
||||
.beginWith(signalingSettings)
|
||||
.then(websocketConnectionsWorker)
|
||||
.enqueue()
|
||||
}
|
||||
|
||||
private fun proceedWithLogin() {
|
||||
|
@ -42,8 +42,6 @@ import javax.inject.Inject;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.work.Data;
|
||||
import androidx.work.OneTimeWorkRequest;
|
||||
import androidx.work.WorkManager;
|
||||
import androidx.work.Worker;
|
||||
import androidx.work.WorkerParameters;
|
||||
import autodagger.AutoInjector;
|
||||
@ -159,11 +157,6 @@ public class SignalingSettingsWorker extends Worker {
|
||||
});
|
||||
}
|
||||
|
||||
OneTimeWorkRequest websocketConnectionsWorker = new OneTimeWorkRequest
|
||||
.Builder(WebsocketConnectionsWorker.class)
|
||||
.build();
|
||||
WorkManager.getInstance().enqueue(websocketConnectionsWorker);
|
||||
|
||||
return Result.success();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user