Kaynağa Gözat

Seems to work

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 7 yıl önce
ebeveyn
işleme
d0e85c746b

+ 11 - 10
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<String, VideoRenderer> 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<SignalingOverall>() {
@@ -487,7 +484,8 @@ public class CallActivity extends AppCompatActivity {
         List<String> oldSesssions = new ArrayList<>();
 
         for (HashMap<String, String> 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());

+ 22 - 16
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<PeerConnection.IceServer> 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();
                 }
             }
         }