From 9f1fef7ff15d6a98e8fb42b7829455f6bfb1d22f Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 16 Oct 2018 13:16:53 +0200 Subject: [PATCH] Smaller progress for websocket communication --- .../talk/controllers/CallController.java | 119 +++++++++--------- .../webrtc/MagicPeerConnectionWrapper.java | 6 +- .../talk/webrtc/MagicWebSocketInstance.java | 12 ++ 3 files changed, 75 insertions(+), 62 deletions(-) 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 468d258b6..b828fab32 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java @@ -1193,11 +1193,13 @@ public class CallController extends BaseController { if (webSocketCommunicationEvent.getType().equals("hello")) { callSession = webSocketClient.getSessionId(); webSocketClient.joinRoomWithRoomToken(roomToken); - alwaysGetPeerConnectionWrapperForSessionId(callSession); - } else if (webSocketCommunicationEvent.equals("participantsUpdate")) { + alwaysGetPeerConnectionWrapperForSessionId(callSession, true); + } else if ("participantsUpdate".equals(webSocketCommunicationEvent.getType())) { if (webSocketCommunicationEvent.getHashMap().get("roomId").equals(roomToken)) { processUsersInRoom((List>) webSocketClient.getJobWithId(Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId")))); } + } else if ("signalingMessage".equals(webSocketCommunicationEvent.getType())) { + processMessage((NCSignalingMessage) webSocketClient.getJobWithId(Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId")))); } } @@ -1235,51 +1237,55 @@ public class CallController extends BaseController { } else if ("message".equals(messageType)) { NCSignalingMessage ncSignalingMessage = LoganSquare.parse(signaling.getMessageWrapper().toString(), NCSignalingMessage.class); - if (ncSignalingMessage.getRoomType().equals("video")) { - MagicPeerConnectionWrapper magicPeerConnectionWrapper = alwaysGetPeerConnectionWrapperForSessionId - (ncSignalingMessage.getFrom()); + processMessage(ncSignalingMessage); + } else { + Log.d(TAG, "Something went very very wrong"); + } + } - String type = null; - if (ncSignalingMessage.getPayload() != null && ncSignalingMessage.getPayload().getType() != - null) { - type = ncSignalingMessage.getPayload().getType(); - } else if (ncSignalingMessage.getType() != null) { - type = ncSignalingMessage.getType(); + private void processMessage(NCSignalingMessage ncSignalingMessage) { + if (ncSignalingMessage.getRoomType().equals("video")) { + MagicPeerConnectionWrapper magicPeerConnectionWrapper = alwaysGetPeerConnectionWrapperForSessionId + (ncSignalingMessage.getFrom(), false); + + String type = null; + if (ncSignalingMessage.getPayload() != null && ncSignalingMessage.getPayload().getType() != + null) { + type = ncSignalingMessage.getPayload().getType(); + } else if (ncSignalingMessage.getType() != null) { + type = ncSignalingMessage.getType(); + } + + if (type != null) { + switch (type) { + case "offer": + case "answer": + magicPeerConnectionWrapper.setNick(ncSignalingMessage.getPayload().getNick()); + String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec + (ncSignalingMessage.getPayload().getSdp(), + "VP8", false); + + SessionDescription sessionDescriptionWithPreferredCodec = new SessionDescription( + SessionDescription.Type.fromCanonicalForm(type), + sessionDescriptionStringWithPreferredCodec); + + if (magicPeerConnectionWrapper.getPeerConnection() != null) { + magicPeerConnectionWrapper.getPeerConnection().setRemoteDescription(magicPeerConnectionWrapper + .getMagicSdpObserver(), sessionDescriptionWithPreferredCodec); + } + break; + case "candidate": + NCIceCandidate ncIceCandidate = ncSignalingMessage.getPayload().getIceCandidate(); + IceCandidate iceCandidate = new IceCandidate(ncIceCandidate.getSdpMid(), + ncIceCandidate.getSdpMLineIndex(), ncIceCandidate.getCandidate()); + magicPeerConnectionWrapper.addCandidate(iceCandidate); + break; + case "endOfCandidates": + magicPeerConnectionWrapper.drainIceCandidates(); + break; + default: + break; } - - if (type != null) { - switch (type) { - case "offer": - case "answer": - magicPeerConnectionWrapper.setNick(ncSignalingMessage.getPayload().getNick()); - String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec - (ncSignalingMessage.getPayload().getSdp(), - "VP8", false); - - SessionDescription sessionDescriptionWithPreferredCodec = new SessionDescription( - SessionDescription.Type.fromCanonicalForm(type), - sessionDescriptionStringWithPreferredCodec); - - if (magicPeerConnectionWrapper.getPeerConnection() != null) { - magicPeerConnectionWrapper.getPeerConnection().setRemoteDescription(magicPeerConnectionWrapper - .getMagicSdpObserver(), sessionDescriptionWithPreferredCodec); - } - break; - case "candidate": - NCIceCandidate ncIceCandidate = ncSignalingMessage.getPayload().getIceCandidate(); - IceCandidate iceCandidate = new IceCandidate(ncIceCandidate.getSdpMid(), - ncIceCandidate.getSdpMLineIndex(), ncIceCandidate.getCandidate()); - magicPeerConnectionWrapper.addCandidate(iceCandidate); - break; - case "endOfCandidates": - magicPeerConnectionWrapper.drainIceCandidates(); - break; - default: - break; - } - } - } else { - Log.d(TAG, "Something went very very wrong"); } } else { Log.d(TAG, "Something went very very wrong"); @@ -1455,7 +1461,7 @@ public class CallController extends BaseController { for (String sessionId : newSessions) { if (!hasMCU) { - alwaysGetPeerConnectionWrapperForSessionId(sessionId); + alwaysGetPeerConnectionWrapperForSessionId(sessionId, false); } else { webSocketClient.requestOfferForSessionIdWithType(sessionId, "video"); } @@ -1503,28 +1509,22 @@ public class CallController extends BaseController { magicPeerConnectionWrapperList.remove(magicPeerConnectionWrapper); } - private MagicPeerConnectionWrapper alwaysGetPeerConnectionWrapperForSessionId(String sessionId) { + private MagicPeerConnectionWrapper alwaysGetPeerConnectionWrapperForSessionId(String sessionId, boolean publisher) { MagicPeerConnectionWrapper magicPeerConnectionWrapper; if ((magicPeerConnectionWrapper = getPeerConnectionWrapperForSessionId(sessionId)) != null) { return magicPeerConnectionWrapper; } else { hasMCU = webSocketClient != null && webSocketClient.hasMCU(); - MediaConstraints mediaConstraintsToUse; - - if (hasMCU) { - mediaConstraintsToUse = sdpConstraintsForMCU; - } else { - mediaConstraintsToUse = sdpConstraints; - - } - - if (sessionId.equals(callSession)) { + if (hasMCU && publisher) { magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, - iceServers, mediaConstraintsToUse, sessionId, callSession, localMediaStream, hasMCU); + iceServers, sdpConstraintsForMCU, sessionId, callSession, localMediaStream, true); + } else if (hasMCU) { + magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, + iceServers, sdpConstraints, sessionId, callSession, null, false); } else { magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, - iceServers, mediaConstraintsToUse, sessionId, callSession, null, hasMCU); + iceServers, sdpConstraints, sessionId, callSession, localMediaStream, false); } magicPeerConnectionWrapperList.add(magicPeerConnectionWrapper); @@ -1626,6 +1626,7 @@ public class CallController extends BaseController { ncMessageWrapper.setSessionId(callSession); NCSignalingMessage ncSignalingMessage = new NCSignalingMessage(); ncSignalingMessage.setTo(sessionDescriptionSend.getPeerId()); + ncSignalingMessage.setFrom(callSession); ncSignalingMessage.setRoomType("video"); ncSignalingMessage.setType(sessionDescriptionSend.getType()); NCMessagePayload ncMessagePayload = new NCMessagePayload(); 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 d985da0fa..b967afb03 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java @@ -75,7 +75,7 @@ public class MagicPeerConnectionWrapper { List iceServerList, MediaConstraints mediaConstraints, String sessionId, String localSession, @Nullable MediaStream mediaStream, - boolean hasMCU) { + boolean isMCUPublisher) { this.localMediaStream = mediaStream; @@ -89,11 +89,11 @@ public class MagicPeerConnectionWrapper { new MagicPeerConnectionObserver()); if (peerConnection != null) { - if (localSession != null) { + if (localSession != null && localMediaStream != null) { peerConnection.addStream(localMediaStream); } - if (hasInitiated || hasMCU) { + if (isMCUPublisher || hasInitiated) { DataChannel.Init init = new DataChannel.Init(); init.negotiated = false; magicDataChannel = peerConnection.createDataChannel("status", init); diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java index 3b242cdf8..b4298622f 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java @@ -169,6 +169,18 @@ public class MagicWebSocketInstance extends WebSocketListener { break; case "message": CallOverallWebSocketMessage callOverallWebSocketMessage = LoganSquare.parse(text, CallOverallWebSocketMessage.class); + int newId; + do { + HashMap messageHashMap = new HashMap<>(); + Random rand = new Random(); + newId = rand.nextInt(1000); + if (!concurrentHashMapQueue.contains(newId)) { + concurrentHashMapQueue.put(newId, callOverallWebSocketMessage.getCallWebSocketMessage().getNcSignalingMessage()); + messageHashMap.put("jobId", Integer.toString(newId)); + eventBus.post(new WebSocketCommunicationEvent("signalingMessage", messageHashMap)); + } + } while (!concurrentHashMapQueue.contains(newId)); + break; default: break;