Browse Source

Provide federation values when joining a room in the external signaling

The "federation" values are used by the external signaling server to
establish a connection with the remote signaling server in a federated
room.

For now this is applied only in calls; when the room is joined in the
chat view again after a call it will still join it in the old way,
without federation properties, which will cause the connection with the
remote signaling server to be closed.

Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Daniel Calviño Sánchez 8 months ago
parent
commit
86b06488c3

+ 2 - 1
app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt

@@ -1632,7 +1632,8 @@ class CallActivity : CallBaseActivity() {
 
     private fun callOrJoinRoomViaWebSocket() {
         if (hasExternalSignalingServer) {
-            webSocketClient!!.joinRoomWithRoomTokenAndSession(roomToken!!, callSession)
+            webSocketClient!!.joinRoomWithRoomTokenAndSession(roomToken!!, callSession,
+                externalSignalingServer!!.federation)
         } else {
             performCall()
         }

+ 4 - 2
app/src/main/java/com/nextcloud/talk/models/json/websocket/RoomWebSocketMessage.kt

@@ -20,8 +20,10 @@ class RoomWebSocketMessage(
     @JsonField(name = ["sessionid"])
     var sessionId: String? = null,
     @JsonField(name = ["properties"])
-    var roomPropertiesWebSocketMessage: RoomPropertiesWebSocketMessage? = null
+    var roomPropertiesWebSocketMessage: RoomPropertiesWebSocketMessage? = null,
+    @JsonField(name = ["federation"])
+    var roomFederationWebSocketMessage: RoomFederationWebSocketMessage? = null
 ) : Parcelable {
     // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
-    constructor() : this(null, null, null)
+    constructor() : this(null, null, null, null)
 }

+ 12 - 1
app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java

@@ -12,6 +12,7 @@ import android.util.Log;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.data.user.model.User;
 import com.nextcloud.talk.models.json.signaling.NCSignalingMessage;
+import com.nextcloud.talk.models.json.signaling.settings.FederationSettings;
 import com.nextcloud.talk.models.json.websocket.ActorWebSocketMessage;
 import com.nextcloud.talk.models.json.websocket.AuthParametersWebSocketMessage;
 import com.nextcloud.talk.models.json.websocket.AuthWebSocketMessage;
@@ -19,6 +20,7 @@ import com.nextcloud.talk.models.json.websocket.CallOverallWebSocketMessage;
 import com.nextcloud.talk.models.json.websocket.CallWebSocketMessage;
 import com.nextcloud.talk.models.json.websocket.HelloOverallWebSocketMessage;
 import com.nextcloud.talk.models.json.websocket.HelloWebSocketMessage;
+import com.nextcloud.talk.models.json.websocket.RoomFederationWebSocketMessage;
 import com.nextcloud.talk.models.json.websocket.RoomOverallWebSocketMessage;
 import com.nextcloud.talk.models.json.websocket.RoomWebSocketMessage;
 import com.nextcloud.talk.utils.ApiUtils;
@@ -128,12 +130,21 @@ public class WebSocketConnectionHelper {
         return helloOverallWebSocketMessage;
     }
 
-    RoomOverallWebSocketMessage getAssembledJoinOrLeaveRoomModel(String roomId, String sessionId) {
+    RoomOverallWebSocketMessage getAssembledJoinOrLeaveRoomModel(String roomId, String sessionId,
+                                                                 FederationSettings federation) {
         RoomOverallWebSocketMessage roomOverallWebSocketMessage = new RoomOverallWebSocketMessage();
         roomOverallWebSocketMessage.setType("room");
         RoomWebSocketMessage roomWebSocketMessage = new RoomWebSocketMessage();
         roomWebSocketMessage.setRoomId(roomId);
         roomWebSocketMessage.setSessionId(sessionId);
+        if (federation != null) {
+            RoomFederationWebSocketMessage roomFederationWebSocketMessage = new RoomFederationWebSocketMessage();
+            roomFederationWebSocketMessage.setSignaling(federation.getServer());
+            roomFederationWebSocketMessage.setUrl(federation.getNextcloudServer() + "/ocs/v2.php/apps/spreed/api/v3/signaling/backend");
+            roomFederationWebSocketMessage.setRoomid(federation.getRoomId());
+            roomFederationWebSocketMessage.setToken(federation.getHelloAuthParams().getToken());
+            roomWebSocketMessage.setRoomFederationWebSocketMessage(roomFederationWebSocketMessage);
+        }
         roomOverallWebSocketMessage.setRoomWebSocketMessage(roomWebSocketMessage);
         return roomOverallWebSocketMessage;
     }

+ 9 - 3
app/src/main/java/com/nextcloud/talk/webrtc/WebSocketInstance.kt

@@ -20,6 +20,7 @@ import com.nextcloud.talk.events.WebSocketCommunicationEvent
 import com.nextcloud.talk.models.json.participants.Participant
 import com.nextcloud.talk.models.json.participants.Participant.ActorType
 import com.nextcloud.talk.models.json.signaling.NCSignalingMessage
+import com.nextcloud.talk.models.json.signaling.settings.FederationSettings
 import com.nextcloud.talk.models.json.websocket.BaseWebSocketMessage
 import com.nextcloud.talk.models.json.websocket.ByeWebSocketMessage
 import com.nextcloud.talk.models.json.websocket.CallOverallWebSocketMessage
@@ -75,6 +76,7 @@ class WebSocketInstance internal constructor(
     private val connectionUrl: String
     private var currentRoomToken: String? = null
     private var currentNormalBackendSession: String? = null
+    private var currentFederation: FederationSettings? = null
     private var reconnecting = false
     private val usersHashMap: HashMap<String?, Participant>
     private var messagesQueue: MutableList<String> = ArrayList()
@@ -367,24 +369,28 @@ class WebSocketInstance internal constructor(
         return hasMCU
     }
 
-    fun joinRoomWithRoomTokenAndSession(roomToken: String, normalBackendSession: String?) {
+    fun joinRoomWithRoomTokenAndSession(roomToken: String, normalBackendSession: String?,
+            federation: FederationSettings? = null) {
         Log.d(TAG, "joinRoomWithRoomTokenAndSession")
         Log.d(TAG, "   roomToken: $roomToken")
         Log.d(TAG, "   session: $normalBackendSession")
         try {
             val message = LoganSquare.serialize(
-                webSocketConnectionHelper.getAssembledJoinOrLeaveRoomModel(roomToken, normalBackendSession)
+                webSocketConnectionHelper.getAssembledJoinOrLeaveRoomModel(roomToken, normalBackendSession, federation)
             )
             if (roomToken == "") {
                 Log.d(TAG, "sending 'leave room' via websocket")
                 currentNormalBackendSession = ""
+                currentFederation = null
                 sendMessage(message)
-            } else if (roomToken == currentRoomToken && normalBackendSession == currentNormalBackendSession) {
+            } else if (roomToken == currentRoomToken && normalBackendSession == currentNormalBackendSession &&
+                federation == currentFederation) {
                 Log.d(TAG, "roomToken & session are unchanged. Joining locally without to send websocket message")
                 sendRoomJoinedEvent()
             } else {
                 Log.d(TAG, "Sending join room message via websocket")
                 currentNormalBackendSession = normalBackendSession
+                currentFederation = federation
                 sendMessage(message)
             }
         } catch (e: IOException) {