diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 798a23f0b..25cff25b7 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -126,9 +126,7 @@ public class CallActivity extends AppCompatActivity { AudioTrack localAudioTrack; VideoCapturer videoCapturer; VideoRenderer localRenderer; - VideoRenderer remoteRenderer; HashMap videoRendererHashMap = new HashMap<>(); - PeerConnection localPeer; EglBase rootEglBase; boolean leavingCall = false; BooleanSupplier booleanSupplier = () -> leavingCall; @@ -322,8 +320,6 @@ public class CallActivity extends AppCompatActivity { @Override public void onNext(GenericOverall genericOverall) { callSession = callOverall.getOcs().getData().getSessionId(); - localPeer = alwaysGetPeerConnectionWrapperForSessionId(callSession). - getPeerConnection(); // start pinging the call ncApi.pingCall(ApiHelper.getCredentials(userEntity.getUsername(), userEntity.getToken()), @@ -360,7 +356,8 @@ public class CallActivity extends AppCompatActivity { userEntity.getToken()), ApiHelper.getUrlForSignaling(userEntity.getBaseUrl())) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) - .repeatWhen(observable -> observable.delay(1500, TimeUnit.MILLISECONDS)) + .repeatWhen(observable -> observable.delay(1500, TimeUnit + .MILLISECONDS)) .repeatUntil(booleanSupplier) .retry(3) .subscribe(new Observer() { @@ -487,7 +484,8 @@ public class CallActivity extends AppCompatActivity { List oldSesssions = new ArrayList<>(); for (HashMap participant : users) { - if (!participant.get("sessionId").equals(callSession) && Boolean.parseBoolean(participant.get("inCall"))) { + Object inCallObject = participant.get("inCall"); + if (!participant.get("sessionId").equals(callSession) && (boolean)inCallObject) { newSessions.add(participant.get("sessionId")); } } @@ -533,8 +531,7 @@ public class CallActivity extends AppCompatActivity { return magicPeerConnectionWrapper; } else { magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, - iceServers, sdpConstraints, sessionId, callSession); - magicPeerConnectionWrapper.getPeerConnection().addStream(localMediaStream); + iceServers, sdpConstraints, sessionId, callSession, localMediaStream); magicPeerConnectionWrapperList.add(magicPeerConnectionWrapper); return magicPeerConnectionWrapper; } @@ -554,6 +551,10 @@ public class CallActivity extends AppCompatActivity { leavingCall = true; dispose(null); + for (int i = 0; i < magicPeerConnectionWrapperList.size(); i++) { + endPeerConnection(magicPeerConnectionWrapperList.get(i).getSessionId()); + + } for (MagicPeerConnectionWrapper magicPeerConnectionWrapper : magicPeerConnectionWrapperList) { endPeerConnection(magicPeerConnectionWrapper.getSessionId()); } @@ -665,8 +666,8 @@ public class CallActivity extends AppCompatActivity { @Override public void onDestroy() { - super.onDestroy(); hangup(); + super.onDestroy(); } private void dispose(@Nullable Disposable disposable) { @@ -739,12 +740,12 @@ public class CallActivity extends AppCompatActivity { ncMessageWrapper.setEv("message"); ncMessageWrapper.setSessionId(callSession); NCSignalingMessage ncSignalingMessage = new NCSignalingMessage(); - ncSignalingMessage.setFrom(callSession); ncSignalingMessage.setTo(sessionDescriptionSend.getPeerId()); ncSignalingMessage.setRoomType("video"); ncSignalingMessage.setType(sessionDescriptionSend.getType()); NCMessagePayload ncMessagePayload = new NCMessagePayload(); ncMessagePayload.setType(sessionDescriptionSend.getType()); + if (!"candidate".equals(sessionDescriptionSend.getType())) { ncMessagePayload.setSdp(sessionDescriptionSend.getSessionDescription().description); ncMessagePayload.setNick(userEntity.getDisplayName()); 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 1ab336c2f..5fb48e4aa 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicPeerConnectionWrapper.java @@ -60,30 +60,32 @@ public class MagicPeerConnectionWrapper { private boolean audioOn; private boolean videoOn; + private boolean hasInitiated; + public MagicPeerConnectionWrapper(PeerConnectionFactory peerConnectionFactory, List iceServerList, MediaConstraints mediaConstraints, - String sessionId, String localSession) { + String sessionId, String localSession, MediaStream mediaStream) { this.iceServers = iceServerList; this.localSession = localSession; peerConnection = peerConnectionFactory.createPeerConnection(iceServerList, mediaConstraints, new MagicPeerConnectionObserver()); + peerConnection.addStream(mediaStream); this.sessionId = sessionId; this.mediaConstraints = mediaConstraints; magicSdpObserver = new MagicSdpObserver(); - - if (sessionId.compareTo(localSession) < 0) { + hasInitiated = sessionId.compareTo(localSession) < 0; + if (hasInitiated) { DataChannel.Init init = new DataChannel.Init(); init.negotiated = false; magicDataChannel = peerConnection.createDataChannel("status", init); magicDataChannel.registerObserver(new MagicDataChannelObserver()); peerConnection.createOffer(magicSdpObserver, mediaConstraints); } - } public void drainIceCandidates() { @@ -188,6 +190,10 @@ public class MagicPeerConnectionWrapper { @Override public void onIceConnectionChange(PeerConnection.IceConnectionState iceConnectionState) { + if (iceConnectionState.equals(PeerConnection.IceConnectionState.CONNECTED) && hasInitiated) { + sendChannelData(new DataChannelMessage("videoOn")); + sendChannelData(new DataChannelMessage("audioOn")); + } } @Override @@ -219,14 +225,18 @@ public class MagicPeerConnectionWrapper { public void onAddStream(MediaStream mediaStream) { videoOn = mediaStream.videoTracks != null && mediaStream.videoTracks.size() == 1; audioOn = mediaStream.audioTracks != null && mediaStream.audioTracks.size() == 1; - EventBus.getDefault().post(new MediaStreamEvent(mediaStream, sessionId)); + if (!sessionId.equals(localSession)) { + EventBus.getDefault().post(new MediaStreamEvent(mediaStream, sessionId)); + } } @Override public void onRemoveStream(MediaStream mediaStream) { videoOn = mediaStream.videoTracks != null && mediaStream.videoTracks.size() == 1; audioOn = mediaStream.audioTracks != null && mediaStream.audioTracks.size() == 1; - EventBus.getDefault().post(new MediaStreamEvent(null, sessionId)); + if (!sessionId.equals(localSession)) { + EventBus.getDefault().post(new MediaStreamEvent(null, sessionId)); + } } @Override @@ -263,24 +273,20 @@ public class MagicPeerConnectionWrapper { @Override public void onCreateSuccess(SessionDescription sessionDescription) { + EventBus.getDefault().post(new SessionDescriptionSendEvent(sessionDescription, sessionId, + sessionDescription.type.canonicalForm().toLowerCase(), null)); peerConnection.setLocalDescription(magicSdpObserver, sessionDescription); } @Override public void onSetSuccess() { if (peerConnection != null) { - if (peerConnection.getRemoteDescription() != null) { - drainIceCandidates(); + if (peerConnection.getLocalDescription() == null) { + peerConnection.createAnswer(magicSdpObserver, mediaConstraints); } - if (peerConnection.getRemoteDescription() == null) { - EventBus.getDefault().post(new SessionDescriptionSendEvent(peerConnection.getLocalDescription(), sessionId, - peerConnection.getLocalDescription().type.canonicalForm(), null)); - } else if (peerConnection.getLocalDescription() == null && sessionId.compareTo(localSession) > 0) { - peerConnection.createAnswer(magicSdpObserver, mediaConstraints); - } else if ((peerConnection.getLocalDescription() != null)) { - EventBus.getDefault().post(new SessionDescriptionSendEvent(peerConnection.getLocalDescription(), sessionId, - peerConnection.getLocalDescription().type.canonicalForm(), null)); + if (peerConnection.getRemoteDescription() != null) { + drainIceCandidates(); } } }