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 5809b334d..34e0fb8a8 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java @@ -1219,6 +1219,9 @@ public class CallController extends BaseController { case "signalingMessage": processMessage((NCSignalingMessage) webSocketClient.getJobWithId(Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId")))); break; + case "peerReadyForRequestingOffer": + webSocketClient.requestOfferForSessionIdWithType(webSocketCommunicationEvent.getHashMap().get("sessionId"), "video"); + break; } } @@ -1280,19 +1283,13 @@ public class CallController extends BaseController { magicPeerConnectionWrapper.setNick(ncSignalingMessage.getPayload().getNick()); SessionDescription sessionDescriptionWithPreferredCodec; - if (magicPeerConnectionWrapper.hasMediaStream()) { - String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec - (ncSignalingMessage.getPayload().getSdp(), - "VP8", false); + 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()); - } + sessionDescriptionWithPreferredCodec = new SessionDescription( + SessionDescription.Type.fromCanonicalForm(type), + sessionDescriptionStringWithPreferredCodec); if (magicPeerConnectionWrapper.getPeerConnection() != null) { magicPeerConnectionWrapper.getPeerConnection().setRemoteDescription(magicPeerConnectionWrapper @@ -1485,11 +1482,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) { @@ -1543,13 +1536,13 @@ public class CallController extends BaseController { 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/webrtc/MagicPeerConnectionWrapper.java b/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java index 8b999a73c..506479921 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java @@ -50,17 +50,15 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; import androidx.annotation.Nullable; public class MagicPeerConnectionWrapper { private static String TAG = "MagicPeerConnectionWrapper"; - List iceCandidates = new ArrayList<>(); + private List iceCandidates = new ArrayList<>(); private PeerConnection peerConnection; private String sessionId; private String nick; - private String userId; private MediaConstraints mediaConstraints; private DataChannel magicDataChannel; private MagicSdpObserver magicSdpObserver; @@ -78,7 +76,7 @@ public class MagicPeerConnectionWrapper { List iceServerList, MediaConstraints mediaConstraints, String sessionId, String localSession, @Nullable MediaStream mediaStream, - boolean isMCUPublisher) { + boolean isMCUPublisher, boolean hasMCU) { this.localMediaStream = mediaStream; @@ -97,13 +95,17 @@ 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()); if (isMCUPublisher) { peerConnection.createOffer(magicSdpObserver, mediaConstraints); + } else if (hasMCU) { + HashMap hashMap = new HashMap<>(); + hashMap.put("sessionId", sessionId); + EventBus.getDefault().post(new WebSocketCommunicationEvent("peerReadyForRequestingOffer", hashMap)); } } } @@ -185,16 +187,18 @@ public class MagicPeerConnectionWrapper { } private void sendInitialMediaStatus() { - if (localMediaStream.videoTracks.size() == 1 && localMediaStream.videoTracks.get(0).enabled()) { - sendChannelData(new DataChannelMessage("videoOn")); - } else { - sendChannelData(new DataChannelMessage("videoOff")); - } + if (localMediaStream != null) { + if (localMediaStream.videoTracks.size() == 1 && localMediaStream.videoTracks.get(0).enabled()) { + sendChannelData(new DataChannelMessage("videoOn")); + } else { + sendChannelData(new DataChannelMessage("videoOff")); + } - if (localMediaStream.audioTracks.size() == 1 && localMediaStream.audioTracks.get(0).enabled()) { - sendChannelData(new DataChannelMessage("audioOn")); - } else { - sendChannelData(new DataChannelMessage("audioOff")); + if (localMediaStream.audioTracks.size() == 1 && localMediaStream.audioTracks.get(0).enabled()) { + sendChannelData(new DataChannelMessage("audioOn")); + } else { + sendChannelData(new DataChannelMessage("audioOff")); + } } } @@ -268,13 +272,12 @@ public class MagicPeerConnectionWrapper { if (iceConnectionState.equals(PeerConnection.IceConnectionState.CONNECTED)) { /*EventBus.getDefault().post(new PeerConnectionEvent(PeerConnectionEvent.PeerConnectionEventType .PEER_CONNECTED, sessionId, null, null));*/ - if (!isMCUPublisher) { - EventBus.getDefault().post(new MediaStreamEvent(remoteMediaStream, sessionId)); - } + //EventBus.getDefault().post(new MediaStreamEvent(remoteMediaStream, sessionId)); if (hasInitiated) { sendInitialMediaStatus(); } + } else if (iceConnectionState.equals(PeerConnection.IceConnectionState.CLOSED)) { EventBus.getDefault().post(new PeerConnectionEvent(PeerConnectionEvent.PeerConnectionEventType .PEER_CLOSED, sessionId, null, null)); @@ -352,16 +355,12 @@ public class MagicPeerConnectionWrapper { @Override public void onCreateSuccess(SessionDescription sessionDescription) { SessionDescription sessionDescriptionWithPreferredCodec; - if (localMediaStream != null) { - String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec - (sessionDescription.description, - "VP8", false); - sessionDescriptionWithPreferredCodec = new SessionDescription( - sessionDescription.type, - sessionDescriptionStringWithPreferredCodec); - } else { - sessionDescriptionWithPreferredCodec = sessionDescription; - } + String sessionDescriptionStringWithPreferredCodec = MagicWebRTCUtils.preferCodec + (sessionDescription.description, + "VP8", false); + sessionDescriptionWithPreferredCodec = new SessionDescription( + sessionDescription.type, + sessionDescriptionStringWithPreferredCodec); EventBus.getDefault().post(new SessionDescriptionSendEvent(sessionDescriptionWithPreferredCodec, sessionId, @@ -385,8 +384,4 @@ public class MagicPeerConnectionWrapper { } } } - - public boolean hasMediaStream() { - return localMediaStream != null; - } }