diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt index 1b59ce407..130077d8c 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt @@ -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 @@ -176,23 +177,7 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver { ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync() DeviceUtils.ignoreSpecialBatteryFeatures() - val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build() - 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, - periodicCapabilitiesUpdateWork - ) + initWorkers() val config = BundledEmojiCompatConfig(this) config.setReplaceAll(true) @@ -203,6 +188,31 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver { NotificationUtils.registerNotificationChannels(applicationContext, appPreferences) } + private fun initWorkers() { + 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() + WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork( + "DailyCapabilitiesUpdateWork", + ExistingPeriodicWorkPolicy.REPLACE, + periodicCapabilitiesUpdateWork + ) + } + override fun onTerminate() { super.onTerminate() sharedApplication = null diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt index df017ac8c..f275b6fba 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt @@ -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() { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 4d0a7b9b4..c68a51a8e 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -1783,6 +1783,7 @@ class ChatController(args: Bundle) : eventBus.register(this) + setupWebsocket() webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener) if (conversationUser?.userId != "?" && @@ -2002,15 +2003,6 @@ class ChatController(args: Bundle) : logConversationInfos("joinRoomWithPassword#onNext") - // FIXME The web socket should be set up in onAttach(). It is currently setup after joining the - // room to "ensure" (rather, increase the chances) that the WebsocketConnectionsWorker job - // was able to finish and, therefore, that the web socket instance can be got. - setupWebsocket() - - // Ensure that the listener is added if the web socket instance was not set up yet when - // onAttach() was called. - webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener) - if (isFirstMessagesProcessing) { pullChatMessages(false) } else { @@ -2103,15 +2095,6 @@ class ChatController(args: Bundle) : "", sessionIdAfterRoomJoined ) - } else { - Log.e(TAG, "magicWebSocketInstance or currentConversation were null! Failed to leave the room!") - if (BuildConfig.DEBUG) { - Toast.makeText( - context, - "magicWebSocketInstance or currentConversation were null! Failed to leave the room!", - Toast.LENGTH_LONG - ).show() - } } sessionIdAfterRoomJoined = "0" @@ -2224,11 +2207,10 @@ class ChatController(args: Bundle) : if (conversationUser == null) { return } - - webSocketInstance = WebSocketConnectionHelper.getMagicWebSocketInstanceForUserId(conversationUser.id!!) + webSocketInstance = WebSocketConnectionHelper.getWebSocketInstanceForUserId(conversationUser.id!!) if (webSocketInstance == null) { - Log.d(TAG, "magicWebSocketInstance became null") + Log.d(TAG, "webSocketInstance not set up. This should only happen when not using the HPB") } } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java index ba20aab32..4fe5c4f32 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/CapabilitiesWorker.java @@ -112,9 +112,9 @@ public class CapabilitiesWorker extends Worker { long internalUserId = data.getLong(BundleKeys.KEY_INTERNAL_USER_ID, -1); List userEntityObjectList = new ArrayList<>(); - boolean userExists = userManager.getUserWithInternalId(internalUserId).isEmpty().blockingGet(); + boolean userNotFound = userManager.getUserWithInternalId(internalUserId).isEmpty().blockingGet(); - if (internalUserId == -1 || !userExists) { + if (internalUserId == -1 || userNotFound) { userEntityObjectList = userManager.getUsers().blockingGet(); } else { userEntityObjectList.add(userManager.getUserWithInternalId(internalUserId).blockingGet()); diff --git a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java index cdaf5a92f..a0e4e7d07 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java +++ b/app/src/main/java/com/nextcloud/talk/jobs/SignalingSettingsWorker.java @@ -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; @@ -77,9 +75,9 @@ public class SignalingSettingsWorker extends Worker { long internalUserId = data.getLong(BundleKeys.KEY_INTERNAL_USER_ID, -1); List userEntityObjectList = new ArrayList<>(); - boolean userExists = userManager.getUserWithInternalId(internalUserId).isEmpty().blockingGet(); + boolean userNotFound = userManager.getUserWithInternalId(internalUserId).isEmpty().blockingGet(); - if (internalUserId == -1 || !userExists) { + if (internalUserId == -1 || userNotFound) { userEntityObjectList = userManager.getUsers().blockingGet(); } else { userEntityObjectList.add(userManager.getUserWithInternalId(internalUserId).blockingGet()); @@ -115,6 +113,8 @@ public class SignalingSettingsWorker extends Worker { .getExternalSignalingTicket()); } + user.setExternalSignalingServer(externalSignalingServer); + userManager.saveUser(user).subscribe(new SingleObserver() { @Override public void onSubscribe(Disposable d) { @@ -157,11 +157,6 @@ public class SignalingSettingsWorker extends Worker { }); } - OneTimeWorkRequest websocketConnectionsWorker = new OneTimeWorkRequest - .Builder(WebsocketConnectionsWorker.class) - .build(); - WorkManager.getInstance().enqueue(websocketConnectionsWorker); - return Result.success(); } } diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java b/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java index 72554f93f..1a49a1ee4 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java @@ -48,7 +48,7 @@ import okhttp3.OkHttpClient; @AutoInjector(NextcloudTalkApplication.class) public class WebSocketConnectionHelper { public static final String TAG = "WebSocketConnectionHelper"; - private static Map magicWebSocketInstanceMap = new HashMap<>(); + private static Map webSocketInstanceMap = new HashMap<>(); @Inject OkHttpClient okHttpClient; @@ -59,11 +59,11 @@ public class WebSocketConnectionHelper { } @SuppressLint("LongLogTag") - public static synchronized WebSocketInstance getMagicWebSocketInstanceForUserId(long userId) { - WebSocketInstance webSocketInstance = magicWebSocketInstanceMap.get(userId); + public static synchronized WebSocketInstance getWebSocketInstanceForUserId(long userId) { + WebSocketInstance webSocketInstance = webSocketInstanceMap.get(userId); if (webSocketInstance == null) { - Log.d(TAG, "No magicWebSocketInstance found for user " + userId); + Log.e(TAG, "No webSocketInstance found for user " + userId); } return webSocketInstance; @@ -83,24 +83,24 @@ public class WebSocketConnectionHelper { long userId = isGuest ? -1 : user.getId(); WebSocketInstance webSocketInstance; - if (userId != -1 && magicWebSocketInstanceMap.containsKey(user.getId()) && (webSocketInstance = magicWebSocketInstanceMap.get(user.getId())) != null) { + if (userId != -1 && webSocketInstanceMap.containsKey(user.getId()) && (webSocketInstance = webSocketInstanceMap.get(user.getId())) != null) { return webSocketInstance; } else { if (userId == -1) { deleteExternalSignalingInstanceForUserEntity(userId); } webSocketInstance = new WebSocketInstance(user, generatedURL, webSocketTicket); - magicWebSocketInstanceMap.put(user.getId(), webSocketInstance); + webSocketInstanceMap.put(user.getId(), webSocketInstance); return webSocketInstance; } } public static synchronized void deleteExternalSignalingInstanceForUserEntity(long id) { WebSocketInstance webSocketInstance; - if ((webSocketInstance = magicWebSocketInstanceMap.get(id)) != null) { + if ((webSocketInstance = webSocketInstanceMap.get(id)) != null) { if (webSocketInstance.isConnected()) { webSocketInstance.sendBye(); - magicWebSocketInstanceMap.remove(id); + webSocketInstanceMap.remove(id); } } }