diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java index 538ffb330..316fdcd2e 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java @@ -929,7 +929,6 @@ public class CallController extends BaseController { externalSignalingServer = new ExternalSignalingServer(); externalSignalingServer.setExternalSignalingServer(signalingSettingsOverall.getOcs().getSettings().getExternalSignalingServer()); externalSignalingServer.setExternalSignalingTicket(signalingSettingsOverall.getOcs().getSettings().getExternalSignalingTicket()); - setupAndInitiateWebSocketsConnection(); } if (signalingSettingsOverall.getOcs().getSettings().getStunServers() != null) { @@ -1008,7 +1007,11 @@ public class CallController extends BaseController { .getCapabilities().getSpreedCapability() .getFeatures().contains("no-ping")); - joinRoomAndCall(); + if (externalSignalingServer == null) { + joinRoomAndCall(); + } else { + setupAndInitiateWebSocketsConnection(); + } } @Override @@ -1216,6 +1219,9 @@ public class CallController extends BaseController { case "signalingMessage": processMessage((NCSignalingMessage) webSocketClient.getJobWithId(Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId")))); break; + case "peerConnectionReady": + webSocketClient.requestOfferForSessionIdWithType(webSocketCommunicationEvent.getHashMap().get("sessionId"), "video"); + break; } } @@ -1277,13 +1283,21 @@ public class CallController extends BaseController { case "offer": case "answer": magicPeerConnectionWrapper.setNick(ncSignalingMessage.getPayload().getNick()); - String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec - (ncSignalingMessage.getPayload().getSdp(), - "VP8", false); + SessionDescription sessionDescriptionWithPreferredCodec; - SessionDescription sessionDescriptionWithPreferredCodec = new SessionDescription( - SessionDescription.Type.fromCanonicalForm(type), - sessionDescriptionStringWithPreferredCodec); + if (magicPeerConnectionWrapper.hasMediaStream() ) { + String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec + (ncSignalingMessage.getPayload().getSdp(), + "VP8", false); + + sessionDescriptionWithPreferredCodec = new SessionDescription( + SessionDescription.Type.fromCanonicalForm(type), + sessionDescriptionStringWithPreferredCodec); + } else { + sessionDescriptionWithPreferredCodec = new SessionDescription( + SessionDescription.Type.fromCanonicalForm(type), + ncSignalingMessage.getPayload().getSdp()); + } if (magicPeerConnectionWrapper.getPeerConnection() != null) { magicPeerConnectionWrapper.getPeerConnection().setRemoteDescription(magicPeerConnectionWrapper @@ -1476,11 +1490,7 @@ public class CallController extends BaseController { } for (String sessionId : newSessions) { - if (!hasMCU) { - alwaysGetPeerConnectionWrapperForSessionId(sessionId, false); - } else { - webSocketClient.requestOfferForSessionIdWithType(sessionId, "video"); - } + alwaysGetPeerConnectionWrapperForSessionId(sessionId, false); } for (String sessionId : oldSesssions) { @@ -1532,15 +1542,19 @@ public class CallController extends BaseController { } else { hasMCU = webSocketClient != null && webSocketClient.hasMCU(); + if (sessionId == null) { + Log.d("MARIO", "ISNULL"); + } + if (hasMCU && publisher) { magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, - iceServers, sdpConstraintsForMCU, sessionId, callSession, localMediaStream, true); + iceServers, sdpConstraintsForMCU, sessionId, callSession, localMediaStream, true, true); } else if (hasMCU) { magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, - iceServers, sdpConstraints, sessionId, callSession, null, false); + iceServers, sdpConstraints, sessionId, callSession, null, false, true); } else { magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, - iceServers, sdpConstraints, sessionId, callSession, localMediaStream, false); + iceServers, sdpConstraints, sessionId, callSession, localMediaStream, false, false); } magicPeerConnectionWrapperList.add(magicPeerConnectionWrapper); diff --git a/app/src/main/java/com/nextcloud/talk/models/json/websocket/ActorWebSocketMessage.java b/app/src/main/java/com/nextcloud/talk/models/json/websocket/ActorWebSocketMessage.java index 6cd1050b6..b8c931e72 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/websocket/ActorWebSocketMessage.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/websocket/ActorWebSocketMessage.java @@ -36,4 +36,7 @@ public class ActorWebSocketMessage { @JsonField(name = "sessionid") String sessionId; + + @JsonField(name = "userid") + String userid; } diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java b/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java index 5965b6a41..d187a63d5 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java @@ -48,7 +48,9 @@ import org.webrtc.SessionDescription; import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import androidx.annotation.Nullable; @@ -75,7 +77,7 @@ public class MagicPeerConnectionWrapper { List iceServerList, MediaConstraints mediaConstraints, String sessionId, String localSession, @Nullable MediaStream mediaStream, - boolean isMCUPublisher) { + boolean isMCUPublisher, boolean hasMCU) { this.localMediaStream = mediaStream; @@ -93,12 +95,19 @@ public class MagicPeerConnectionWrapper { peerConnection.addStream(localMediaStream); } - if (isMCUPublisher || hasInitiated) { + if (hasMCU || hasInitiated) { DataChannel.Init init = new DataChannel.Init(); init.negotiated = false; magicDataChannel = peerConnection.createDataChannel("status", init); magicDataChannel.registerObserver(new MagicDataChannelObserver()); - peerConnection.createOffer(magicSdpObserver, mediaConstraints); + if (isMCUPublisher) { + peerConnection.createOffer(magicSdpObserver, mediaConstraints); + } else if (hasMCU) { + HashMap peerConnectionReadyMap = new HashMap<>(); + peerConnectionReadyMap.put("sessionId", sessionId); + EventBus.getDefault().post(new WebSocketCommunicationEvent("peerConnectionReady", peerConnectionReadyMap)); + + } } } } @@ -341,13 +350,18 @@ public class MagicPeerConnectionWrapper { @Override public void onCreateSuccess(SessionDescription sessionDescription) { - String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec - (sessionDescription.description, - "VP8", false); + SessionDescription sessionDescriptionWithPreferredCodec; + if (localMediaStream != null) { + String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec + (sessionDescription.description, + "VP8", false); + sessionDescriptionWithPreferredCodec = new SessionDescription( + sessionDescription.type, + sessionDescriptionStringWithPreferredCodec); + } else { + sessionDescriptionWithPreferredCodec = sessionDescription; + } - SessionDescription sessionDescriptionWithPreferredCodec = new SessionDescription( - sessionDescription.type, - sessionDescriptionStringWithPreferredCodec); EventBus.getDefault().post(new SessionDescriptionSendEvent(sessionDescriptionWithPreferredCodec, sessionId, sessionDescription.type.canonicalForm().toLowerCase(), null)); @@ -370,4 +384,8 @@ public class MagicPeerConnectionWrapper { } } } + + public boolean hasMediaStream() { + return localMediaStream != null; + } }