Sfoglia il codice sorgente

Merge pull request #2852 from nextcloud/bugfix/noid/fixWebsocketConnection

Fix to get websocketInstance
Marcel Hibbe 2 anni fa
parent
commit
abd609c388

+ 24 - 14
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,31 +177,40 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver {
         ClosedInterfaceImpl().providerInstallerInstallIfNeededAsync()
         DeviceUtils.ignoreSpecialBatteryFeatures()
 
+        initWorkers()
+
+        val config = BundledEmojiCompatConfig(this)
+        config.setReplaceAll(true)
+        val emojiCompat = EmojiCompat.init(config)
+
+        EmojiManager.install(GoogleEmojiProvider())
+
+        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()
-        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
         )
-
-        val config = BundledEmojiCompatConfig(this)
-        config.setReplaceAll(true)
-        val emojiCompat = EmojiCompat.init(config)
-
-        EmojiManager.install(GoogleEmojiProvider())
-
-        NotificationUtils.registerNotificationChannels(applicationContext, appPreferences)
     }
 
     override fun onTerminate() {

+ 10 - 5
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() {

+ 3 - 21
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")
         }
     }
 

+ 2 - 2
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<User> 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());

+ 4 - 9
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<User> 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<Integer>() {
                             @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();
     }
 }

+ 8 - 8
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<Long, WebSocketInstance> magicWebSocketInstanceMap = new HashMap<>();
+    private static Map<Long, WebSocketInstance> 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);
             }
         }
     }