Przeglądaj źródła

Fix screensharing for MCU

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 6 lat temu
rodzic
commit
0ff737d4fd

+ 12 - 15
app/src/main/java/com/nextcloud/talk/controllers/CallController.java

@@ -1283,7 +1283,7 @@ public class CallController extends BaseController {
         if (ncSignalingMessage.getRoomType().equals("video") || ncSignalingMessage.getRoomType().equals("screen")) {
             MagicPeerConnectionWrapper magicPeerConnectionWrapper =
                     getPeerConnectionWrapperForSessionIdAndType(ncSignalingMessage.getFrom(),
-                            ncSignalingMessage.getRoomType(),false);
+                            ncSignalingMessage.getRoomType(), false);
 
             String type = null;
             if (ncSignalingMessage.getPayload() != null && ncSignalingMessage.getPayload().getType() != null) {
@@ -1505,7 +1505,7 @@ public class CallController extends BaseController {
         hasMCU = hasExternalSignalingServer && webSocketClient != null && webSocketClient.hasMCU();
 
         for (String sessionId : newSessions) {
-            getPeerConnectionWrapperForSessionIdAndType(sessionId, "video",hasMCU && sessionId.equals(webSocketClient.getSessionId()));
+            getPeerConnectionWrapperForSessionIdAndType(sessionId, "video", hasMCU && sessionId.equals(webSocketClient.getSessionId()));
         }
 
         for (String sessionId : oldSesssions) {
@@ -1600,17 +1600,12 @@ public class CallController extends BaseController {
     private void endPeerConnection(String sessionId, boolean justScreen) {
         List<MagicPeerConnectionWrapper> magicPeerConnectionWrappers;
         MagicPeerConnectionWrapper magicPeerConnectionWrapper;
-        if (!(magicPeerConnectionWrappers = getPeerConnectionWrapperListForSessionId(sessionId)).isEmpty() && getActivity()
-                != null) {
+        if (!(magicPeerConnectionWrappers = getPeerConnectionWrapperListForSessionId(sessionId)).isEmpty()
+                && getActivity() != null) {
             for (int i = 0; i < magicPeerConnectionWrappers.size(); i++) {
                 magicPeerConnectionWrapper = magicPeerConnectionWrappers.get(i);
                 if (magicPeerConnectionWrapper.getSessionId().equals(sessionId)) {
-                    if (magicPeerConnectionWrapper.getVideoStreamType().equals("screen")) {
-                        MagicPeerConnectionWrapper finalMagicPeerConnectionWrapper = magicPeerConnectionWrapper;
-                        getActivity().runOnUiThread(() -> removeMediaStream(sessionId + "+" +
-                                finalMagicPeerConnectionWrapper.getVideoStreamType()));
-                        deleteMagicPeerConnection(magicPeerConnectionWrapper);
-                    } else if (!justScreen) {
+                    if (magicPeerConnectionWrapper.getVideoStreamType().equals("screen") || !justScreen) {
                         MagicPeerConnectionWrapper finalMagicPeerConnectionWrapper = magicPeerConnectionWrapper;
                         getActivity().runOnUiThread(() -> removeMediaStream(sessionId + "+" +
                                 finalMagicPeerConnectionWrapper.getVideoStreamType()));
@@ -1650,7 +1645,7 @@ public class CallController extends BaseController {
     public void onMessageEvent(PeerConnectionEvent peerConnectionEvent) {
         if (peerConnectionEvent.getPeerConnectionEventType().equals(PeerConnectionEvent.PeerConnectionEventType
                 .PEER_CLOSED)) {
-            endPeerConnection(peerConnectionEvent.getSessionId(), false);
+            endPeerConnection(peerConnectionEvent.getSessionId(), peerConnectionEvent.getVideoStreamType().equals("screen"));
         } else if (peerConnectionEvent.getPeerConnectionEventType().equals(PeerConnectionEvent
                 .PeerConnectionEventType.SENSOR_FAR) ||
                 peerConnectionEvent.getPeerConnectionEventType().equals(PeerConnectionEvent
@@ -1667,7 +1662,7 @@ public class CallController extends BaseController {
             }
         } else if (peerConnectionEvent.getPeerConnectionEventType().equals(PeerConnectionEvent
                 .PeerConnectionEventType.NICK_CHANGE)) {
-            gotNick(peerConnectionEvent.getSessionId() + "+" + peerConnectionEvent.getVideoStreamType(), peerConnectionEvent.getNick(), true);
+            gotNick(peerConnectionEvent.getSessionId(), peerConnectionEvent.getNick(), true, peerConnectionEvent.getVideoStreamType());
         } else if (peerConnectionEvent.getPeerConnectionEventType().equals(PeerConnectionEvent
                 .PeerConnectionEventType.VIDEO_CHANGE) && !isVoiceOnlyCall) {
             gotAudioOrVideoChange(true, peerConnectionEvent.getSessionId() + "+" + peerConnectionEvent.getVideoStreamType(),
@@ -1906,9 +1901,9 @@ public class CallController extends BaseController {
                 surfaceViewRenderer.setOnClickListener(videoOnClickListener);
                 remoteRenderersLayout.addView(relativeLayout);
                 if (hasExternalSignalingServer) {
-                    gotNick(session + "+" + type, webSocketClient.getDisplayNameForSession(session), false);
+                    gotNick(session, webSocketClient.getDisplayNameForSession(session), false, type);
                 } else {
-                    gotNick(session + "+" + type, getPeerConnectionWrapperForSessionIdAndType(session, "video", false).getNick(), false);
+                    gotNick(session, getPeerConnectionWrapperForSessionIdAndType(session, type, false).getNick(), false, type);
                 }
 
                 if ("video".equals(type)) {
@@ -1920,12 +1915,14 @@ public class CallController extends BaseController {
         }
     }
 
-    private void gotNick(String sessionOrUserId, String nick, boolean isFromAnEvent) {
+    private void gotNick(String sessionOrUserId, String nick, boolean isFromAnEvent, String type) {
         if (isFromAnEvent && hasExternalSignalingServer) {
             // get session based on userId
             sessionOrUserId = webSocketClient.getSessionForUserId(sessionOrUserId);
         }
 
+        sessionOrUserId += "+" + type;
+
         if (relativeLayout != null) {
             RelativeLayout relativeLayout = remoteRenderersLayout.findViewWithTag(sessionOrUserId);
             TextView textView = relativeLayout.findViewById(R.id.peer_nick_text_view);

+ 8 - 2
app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java

@@ -29,6 +29,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.events.WebSocketCommunicationEvent;
 import com.nextcloud.talk.models.database.UserEntity;
 import com.nextcloud.talk.models.json.signaling.NCMessageWrapper;
+import com.nextcloud.talk.models.json.signaling.NCSignalingMessage;
 import com.nextcloud.talk.models.json.websocket.BaseWebSocketMessage;
 import com.nextcloud.talk.models.json.websocket.ByeWebSocketMessage;
 import com.nextcloud.talk.models.json.websocket.CallOverallWebSocketMessage;
@@ -201,9 +202,14 @@ public class MagicWebSocketInstance extends WebSocketListener {
                     break;
                 case "message":
                     CallOverallWebSocketMessage callOverallWebSocketMessage = LoganSquare.parse(text, CallOverallWebSocketMessage.class);
-                    if (callOverallWebSocketMessage.getCallWebSocketMessage().getNcSignalingMessage().getFrom() != null) {
+                    NCSignalingMessage ncSignalingMessage = callOverallWebSocketMessage.getCallWebSocketMessage().getNcSignalingMessage();
+                    if (TextUtils.isEmpty(ncSignalingMessage.getFrom()) && callOverallWebSocketMessage.getCallWebSocketMessage().getSenderWebSocketMessage() != null) {
+                        ncSignalingMessage.setFrom(callOverallWebSocketMessage.getCallWebSocketMessage().getSenderWebSocketMessage().getSessionId());
+                    }
+
+                    if (!TextUtils.isEmpty(ncSignalingMessage.getFrom())) {
                         HashMap<String, String> messageHashMap = new HashMap<>();
-                        messageHashMap.put("jobId", Integer.toString(magicMap.add(callOverallWebSocketMessage.getCallWebSocketMessage().getNcSignalingMessage())));
+                        messageHashMap.put("jobId", Integer.toString(magicMap.add(ncSignalingMessage)));
                         eventBus.post(new WebSocketCommunicationEvent("signalingMessage", messageHashMap));
                     }
                     break;