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>
This commit is contained in:
Daniel Calviño Sánchez 2024-08-28 08:24:51 +02:00 committed by Marcel Hibbe
parent f3c7913f16
commit 86b06488c3
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
4 changed files with 27 additions and 7 deletions

View File

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

View File

@ -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)
}

View File

@ -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;
}

View File

@ -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) {