Selaa lähdekoodia

Provide federation values to external signaling server in chat

Otherwise the WebSocket configuration and session clashes with the one
from the CallActivity, which already uses the federated settings.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Daniel Calviño Sánchez 7 kuukautta sitten
vanhempi
commit
4cea7b2390
1 muutettua tiedostoa jossa 54 lisäystä ja 5 poistoa
  1. 54 5
      app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

+ 54 - 5
app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

@@ -120,10 +120,12 @@ import com.nextcloud.talk.jobs.ShareOperationWorker
 import com.nextcloud.talk.jobs.UploadAndShareFilesWorker
 import com.nextcloud.talk.jobs.UploadAndShareFilesWorker
 import com.nextcloud.talk.location.LocationPickerActivity
 import com.nextcloud.talk.location.LocationPickerActivity
 import com.nextcloud.talk.messagesearch.MessageSearchActivity
 import com.nextcloud.talk.messagesearch.MessageSearchActivity
+import com.nextcloud.talk.models.ExternalSignalingServer
 import com.nextcloud.talk.models.domain.ConversationModel
 import com.nextcloud.talk.models.domain.ConversationModel
 import com.nextcloud.talk.models.json.capabilities.SpreedCapability
 import com.nextcloud.talk.models.json.capabilities.SpreedCapability
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.models.json.chat.ReadStatus
 import com.nextcloud.talk.models.json.conversations.ConversationEnums
 import com.nextcloud.talk.models.json.conversations.ConversationEnums
+import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall
 import com.nextcloud.talk.polls.ui.PollCreateDialogFragment
 import com.nextcloud.talk.polls.ui.PollCreateDialogFragment
 import com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity
 import com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity
 import com.nextcloud.talk.shareditems.activities.SharedItemsActivity
 import com.nextcloud.talk.shareditems.activities.SharedItemsActivity
@@ -177,6 +179,8 @@ import com.stfalcon.chatkit.messages.MessageHolders
 import com.stfalcon.chatkit.messages.MessageHolders.ContentChecker
 import com.stfalcon.chatkit.messages.MessageHolders.ContentChecker
 import com.stfalcon.chatkit.messages.MessagesListAdapter
 import com.stfalcon.chatkit.messages.MessagesListAdapter
 import com.stfalcon.chatkit.utils.DateFormatter
 import com.stfalcon.chatkit.utils.DateFormatter
+import io.reactivex.Observer
+import io.reactivex.disposables.Disposable
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.flow.collect
@@ -302,6 +306,7 @@ class ChatActivity :
 
 
     var webSocketInstance: WebSocketInstance? = null
     var webSocketInstance: WebSocketInstance? = null
     var signalingMessageSender: SignalingMessageSender? = null
     var signalingMessageSender: SignalingMessageSender? = null
+    var externalSignalingServer: ExternalSignalingServer? = null
 
 
     var getRoomInfoTimerHandler: Handler? = null
     var getRoomInfoTimerHandler: Handler? = null
 
 
@@ -631,10 +636,12 @@ class ChatActivity :
 
 
                     logConversationInfos("joinRoomWithPassword#onNext")
                     logConversationInfos("joinRoomWithPassword#onNext")
 
 
+                    setupWebsocket()
                     if (webSocketInstance != null) {
                     if (webSocketInstance != null) {
                         webSocketInstance?.joinRoomWithRoomTokenAndSession(
                         webSocketInstance?.joinRoomWithRoomTokenAndSession(
                             roomToken,
                             roomToken,
-                            sessionIdAfterRoomJoined
+                            sessionIdAfterRoomJoined,
+                            externalSignalingServer?.federation
                         )
                         )
                     }
                     }
                     if (startCallFromNotification != null && startCallFromNotification) {
                     if (startCallFromNotification != null && startCallFromNotification) {
@@ -952,7 +959,6 @@ class ChatActivity :
 
 
         pullChatMessagesPending = false
         pullChatMessagesPending = false
 
 
-        setupWebsocket()
         webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener)
         webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener)
         webSocketInstance?.getSignalingMessageReceiver()?.addListener(conversationMessageListener)
         webSocketInstance?.getSignalingMessageReceiver()?.addListener(conversationMessageListener)
 
 
@@ -2391,10 +2397,12 @@ class ChatActivity :
         } else {
         } else {
             Log.d(TAG, "sessionID was valid -> skip joinRoom")
             Log.d(TAG, "sessionID was valid -> skip joinRoom")
 
 
+            setupWebsocket()
             if (webSocketInstance != null) {
             if (webSocketInstance != null) {
                 webSocketInstance?.joinRoomWithRoomTokenAndSession(
                 webSocketInstance?.joinRoomWithRoomTokenAndSession(
                     roomToken,
                     roomToken,
-                    sessionIdAfterRoomJoined
+                    sessionIdAfterRoomJoined,
+                    externalSignalingServer?.federation
                 )
                 )
             }
             }
         }
         }
@@ -2423,16 +2431,57 @@ class ChatActivity :
     }
     }
 
 
     private fun setupWebsocket() {
     private fun setupWebsocket() {
-        if (conversationUser == null) {
+        if (currentConversation == null || conversationUser == null) {
             return
             return
         }
         }
-        webSocketInstance = WebSocketConnectionHelper.getWebSocketInstanceForUser(conversationUser!!)
+
+        if (currentConversation!!.remoteServer != null) {
+            val apiVersion = ApiUtils.getSignalingApiVersion(conversationUser!!, intArrayOf(ApiUtils.API_V3, 2, 1))
+            ncApi!!.getSignalingSettings(credentials, ApiUtils.getUrlForSignalingSettings(apiVersion, conversationUser!!.baseUrl,
+                roomToken!!)).blockingSubscribe(object : Observer<SignalingSettingsOverall> {
+                override fun onSubscribe(d: Disposable) {
+                    // unused atm
+                }
+
+                override fun onNext(signalingSettingsOverall: SignalingSettingsOverall) {
+                    if (signalingSettingsOverall.ocs!!.settings!!.externalSignalingServer == null) {
+                        return
+                    }
+
+                    externalSignalingServer = ExternalSignalingServer()
+                    externalSignalingServer!!.externalSignalingServer = signalingSettingsOverall.ocs!!.settings!!
+                        .externalSignalingServer
+                    externalSignalingServer!!.externalSignalingTicket = signalingSettingsOverall.ocs!!.settings!!
+                        .externalSignalingTicket
+                    externalSignalingServer!!.federation = signalingSettingsOverall.ocs!!.settings!!.federation
+
+                    webSocketInstance = WebSocketConnectionHelper.getExternalSignalingInstanceForServer(
+                        externalSignalingServer!!.externalSignalingServer,
+                        conversationUser,
+                        externalSignalingServer!!.externalSignalingTicket,
+                        TextUtils.isEmpty(credentials)
+                    )
+                }
+
+                override fun onError(e: Throwable) {
+                    Log.e(CallActivity.TAG, e.message, e)
+                }
+
+                override fun onComplete() {
+                    // unused atm
+                }
+            })
+        } else {
+            webSocketInstance = WebSocketConnectionHelper.getWebSocketInstanceForUser(conversationUser!!)
+        }
 
 
         if (webSocketInstance == null) {
         if (webSocketInstance == null) {
             Log.d(TAG, "webSocketInstance not set up. This should only happen when not using the HPB")
             Log.d(TAG, "webSocketInstance not set up. This should only happen when not using the HPB")
         }
         }
 
 
         signalingMessageSender = webSocketInstance?.signalingMessageSender
         signalingMessageSender = webSocketInstance?.signalingMessageSender
+        webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener)
+        webSocketInstance?.getSignalingMessageReceiver()?.addListener(conversationMessageListener)
     }
     }
 
 
     private fun processCallStartedMessages(chatMessageList: List<ChatMessage>) {
     private fun processCallStartedMessages(chatMessageList: List<ChatMessage>) {