Browse Source

Further improvements to MCU reconnections

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 5 years ago
parent
commit
e510a35ae4
1 changed files with 114 additions and 110 deletions
  1. 114 110
      app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java

+ 114 - 110
app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java

@@ -102,135 +102,138 @@ public class MagicWebSocketInstance extends WebSocketListener {
 
 
     @Override
     @Override
     public void onOpen(WebSocket webSocket, Response response) {
     public void onOpen(WebSocket webSocket, Response response) {
+        internalWebSocket = webSocket;
         sendHello();
         sendHello();
     }
     }
 
 
+    private void closeWebSocket(WebSocket webSocket) {
+        webSocket.close(1000, null);
+        webSocket.cancel();
+        messagesQueue = new ArrayList<>();
+        currentRoomToken = "";
+    }
+
     private void restartWebSocket() {
     private void restartWebSocket() {
         reconnecting = true;
         reconnecting = true;
 
 
-        if (internalWebSocket != null) {
-            internalWebSocket.close(1000, null);
-            internalWebSocket.cancel();
-            messagesQueue = new ArrayList<>();
-            currentRoomToken = "";
-        }
-
         Request request = new Request.Builder().url(connectionUrl).build();
         Request request = new Request.Builder().url(connectionUrl).build();
-        internalWebSocket = okHttpClient.newWebSocket(request, this);
+        okHttpClient.newWebSocket(request, this);
         restartCount++;
         restartCount++;
     }
     }
 
 
     @Override
     @Override
     public void onMessage(WebSocket webSocket, String text) {
     public void onMessage(WebSocket webSocket, String text) {
-        Log.d(TAG, "Receiving : " + text);
-        try {
-            BaseWebSocketMessage baseWebSocketMessage = LoganSquare.parse(text, BaseWebSocketMessage.class);
-            String messageType = baseWebSocketMessage.getType();
-            switch (messageType) {
-                case "hello":
-                    connected = true;
-                    reconnecting = false;
-                    restartCount = 0;
-                    HelloResponseOverallWebSocketMessage helloResponseWebSocketMessage = LoganSquare.parse(text, HelloResponseOverallWebSocketMessage.class);
-                    resumeId = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().getResumeId();
-                    sessionId = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().getSessionId();
-                    hasMCU = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().serverHasMCUSupport();
-
-                    for (int i = 0; i < messagesQueue.size(); i++) {
-                        webSocket.send(messagesQueue.get(i));
-                    }
-
-                    messagesQueue = new ArrayList<>();
-                    eventBus.post(new WebSocketCommunicationEvent("hello", null));
-                    break;
-                case "error":
-                    ErrorOverallWebSocketMessage errorOverallWebSocketMessage = LoganSquare.parse(text, ErrorOverallWebSocketMessage.class);
-                    if (("no_such_session").equals(errorOverallWebSocketMessage.getErrorWebSocketMessage().getCode())) {
-                        resumeId = "";
-                        restartWebSocket();
-                    } else if (("hello_expected").equals(errorOverallWebSocketMessage.getErrorWebSocketMessage().getCode())) {
-                        restartWebSocket();
-                    }
-
-                    break;
-                case "room":
-                    JoinedRoomOverallWebSocketMessage joinedRoomOverallWebSocketMessage = LoganSquare.parse(text, JoinedRoomOverallWebSocketMessage.class);
-                    currentRoomToken = joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomId();
-                    if (joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomPropertiesWebSocketMessage() != null && !TextUtils.isEmpty(currentRoomToken)) {
-                        HashMap<String, String> joinRoomHashMap = new HashMap<>();
-                        joinRoomHashMap.put("roomToken", currentRoomToken);
-                        eventBus.post(new WebSocketCommunicationEvent("roomJoined", joinRoomHashMap));
-                    } else {
-                        userIdSesssionHashMap = new HashMap<>();
-                        displayNameHashMap = new HashMap<>();
-                    }
-                    break;
-                case "event":
-                    EventOverallWebSocketMessage eventOverallWebSocketMessage = LoganSquare.parse(text, EventOverallWebSocketMessage.class);
-                    if (eventOverallWebSocketMessage.getEventMap() != null) {
-                        String target = (String) eventOverallWebSocketMessage.getEventMap().get("target");
-                        switch (target) {
-                            case "room":
-                                if (eventOverallWebSocketMessage.getEventMap().get("type").equals("message")) {
-                                    if (eventOverallWebSocketMessage.getEventMap().containsKey("data")) {
-                                        Map<String, Object> dataHashMap = (Map<String, Object>) eventOverallWebSocketMessage.getEventMap().get("data");
-                                        if (dataHashMap.containsKey("chat")) {
-                                            boolean shouldRefreshChat;
-                                            Map<String, Object> chatMap = (Map<String, Object>) dataHashMap.get("chat");
-                                            if (chatMap.containsKey("refresh")) {
-                                                shouldRefreshChat = (boolean) chatMap.get("refresh");
-                                                if (shouldRefreshChat) {
-                                                    HashMap<String, String> refreshChatHashMap = new HashMap<>();
-                                                    refreshChatHashMap.put("roomToken", (String) eventOverallWebSocketMessage.getEventMap().get("roomid"));
-                                                    eventBus.post(new WebSocketCommunicationEvent("refreshChat", refreshChatHashMap));
+        if (webSocket == internalWebSocket) {
+            Log.d(TAG, "Receiving : " + text);
+            try {
+                BaseWebSocketMessage baseWebSocketMessage = LoganSquare.parse(text, BaseWebSocketMessage.class);
+                String messageType = baseWebSocketMessage.getType();
+                switch (messageType) {
+                    case "hello":
+                        connected = true;
+                        reconnecting = false;
+                        restartCount = 0;
+                        HelloResponseOverallWebSocketMessage helloResponseWebSocketMessage = LoganSquare.parse(text, HelloResponseOverallWebSocketMessage.class);
+                        resumeId = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().getResumeId();
+                        sessionId = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().getSessionId();
+                        hasMCU = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().serverHasMCUSupport();
+
+                        for (int i = 0; i < messagesQueue.size(); i++) {
+                            webSocket.send(messagesQueue.get(i));
+                        }
+
+                        messagesQueue = new ArrayList<>();
+                        eventBus.post(new WebSocketCommunicationEvent("hello", null));
+                        break;
+                    case "error":
+                        ErrorOverallWebSocketMessage errorOverallWebSocketMessage = LoganSquare.parse(text, ErrorOverallWebSocketMessage.class);
+                        if (("no_such_session").equals(errorOverallWebSocketMessage.getErrorWebSocketMessage().getCode())) {
+                            resumeId = "";
+                            restartWebSocket();
+                        } else if (("hello_expected").equals(errorOverallWebSocketMessage.getErrorWebSocketMessage().getCode())) {
+                            restartWebSocket();
+                        }
+
+                        break;
+                    case "room":
+                        JoinedRoomOverallWebSocketMessage joinedRoomOverallWebSocketMessage = LoganSquare.parse(text, JoinedRoomOverallWebSocketMessage.class);
+                        currentRoomToken = joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomId();
+                        if (joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomPropertiesWebSocketMessage() != null && !TextUtils.isEmpty(currentRoomToken)) {
+                            HashMap<String, String> joinRoomHashMap = new HashMap<>();
+                            joinRoomHashMap.put("roomToken", currentRoomToken);
+                            eventBus.post(new WebSocketCommunicationEvent("roomJoined", joinRoomHashMap));
+                        } else {
+                            userIdSesssionHashMap = new HashMap<>();
+                            displayNameHashMap = new HashMap<>();
+                        }
+                        break;
+                    case "event":
+                        EventOverallWebSocketMessage eventOverallWebSocketMessage = LoganSquare.parse(text, EventOverallWebSocketMessage.class);
+                        if (eventOverallWebSocketMessage.getEventMap() != null) {
+                            String target = (String) eventOverallWebSocketMessage.getEventMap().get("target");
+                            switch (target) {
+                                case "room":
+                                    if (eventOverallWebSocketMessage.getEventMap().get("type").equals("message")) {
+                                        if (eventOverallWebSocketMessage.getEventMap().containsKey("data")) {
+                                            Map<String, Object> dataHashMap = (Map<String, Object>) eventOverallWebSocketMessage.getEventMap().get("data");
+                                            if (dataHashMap.containsKey("chat")) {
+                                                boolean shouldRefreshChat;
+                                                Map<String, Object> chatMap = (Map<String, Object>) dataHashMap.get("chat");
+                                                if (chatMap.containsKey("refresh")) {
+                                                    shouldRefreshChat = (boolean) chatMap.get("refresh");
+                                                    if (shouldRefreshChat) {
+                                                        HashMap<String, String> refreshChatHashMap = new HashMap<>();
+                                                        refreshChatHashMap.put("roomToken", (String) eventOverallWebSocketMessage.getEventMap().get("roomid"));
+                                                        eventBus.post(new WebSocketCommunicationEvent("refreshChat", refreshChatHashMap));
+                                                    }
                                                 }
                                                 }
                                             }
                                             }
                                         }
                                         }
+                                    } else if (eventOverallWebSocketMessage.getEventMap().get("type").equals("join")) {
+                                        List<HashMap<String, Object>> joinEventMap = (List<HashMap<String, Object>>) eventOverallWebSocketMessage.getEventMap().get("join");
+                                        HashMap<String, Object> internalHashMap;
+                                        for (int i = 0; i < joinEventMap.size(); i++) {
+                                            internalHashMap = joinEventMap.get(i);
+                                            HashMap<String, Object> userMap = (HashMap<String, Object>) internalHashMap.get("user");
+                                            displayNameHashMap.put((String) internalHashMap.get("sessionid"), (String) userMap.get("displayname"));
+                                            userIdSesssionHashMap.put((String) internalHashMap.get("userid"), (String) internalHashMap.get("sessionid"));
+                                        }
                                     }
                                     }
-                                } else if (eventOverallWebSocketMessage.getEventMap().get("type").equals("join")) {
-                                    List<HashMap<String, Object>> joinEventMap = (List<HashMap<String, Object>>) eventOverallWebSocketMessage.getEventMap().get("join");
-                                    HashMap<String, Object> internalHashMap;
-                                    for (int i = 0; i < joinEventMap.size(); i++) {
-                                        internalHashMap = joinEventMap.get(i);
-                                        HashMap<String, Object> userMap = (HashMap<String, Object>) internalHashMap.get("user");
-                                        displayNameHashMap.put((String) internalHashMap.get("sessionid"), (String) userMap.get("displayname"));
-                                        userIdSesssionHashMap.put((String) internalHashMap.get("userid"), (String) internalHashMap.get("sessionid"));
+                                    break;
+                                case "participants":
+                                    if (eventOverallWebSocketMessage.getEventMap().get("type").equals("update")) {
+                                        HashMap<String, String> refreshChatHashMap = new HashMap<>();
+                                        HashMap<String, Object> updateEventMap = (HashMap<String, Object>) eventOverallWebSocketMessage.getEventMap().get("update");
+                                        refreshChatHashMap.put("roomToken", (String) updateEventMap.get("roomid"));
+                                        refreshChatHashMap.put("jobId", Integer.toString(magicMap.add(updateEventMap.get("users"))));
+                                        eventBus.post(new WebSocketCommunicationEvent("participantsUpdate", refreshChatHashMap));
                                     }
                                     }
-                                }
-                                break;
-                            case "participants":
-                                if (eventOverallWebSocketMessage.getEventMap().get("type").equals("update")) {
-                                    HashMap<String, String> refreshChatHashMap = new HashMap<>();
-                                    HashMap<String, Object> updateEventMap = (HashMap<String, Object>) eventOverallWebSocketMessage.getEventMap().get("update");
-                                    refreshChatHashMap.put("roomToken", (String) updateEventMap.get("roomid"));
-                                    refreshChatHashMap.put("jobId", Integer.toString(magicMap.add(updateEventMap.get("users"))));
-                                    eventBus.post(new WebSocketCommunicationEvent("participantsUpdate", refreshChatHashMap));
-                                }
-                                break;
+                                    break;
+                            }
                         }
                         }
-                    }
-                    break;
-                case "message":
-                    CallOverallWebSocketMessage callOverallWebSocketMessage = LoganSquare.parse(text, CallOverallWebSocketMessage.class);
-                    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(ncSignalingMessage)));
-                        eventBus.post(new WebSocketCommunicationEvent("signalingMessage", messageHashMap));
-                    }
-                    break;
-                case "bye":
-                    connected = false;
-                    resumeId = "";
-                default:
-                    break;
+                        break;
+                    case "message":
+                        CallOverallWebSocketMessage callOverallWebSocketMessage = LoganSquare.parse(text, CallOverallWebSocketMessage.class);
+                        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(ncSignalingMessage)));
+                            eventBus.post(new WebSocketCommunicationEvent("signalingMessage", messageHashMap));
+                        }
+                        break;
+                    case "bye":
+                        connected = false;
+                        resumeId = "";
+                    default:
+                        break;
+                }
+            } catch (IOException e) {
+                Log.e(TAG, "Failed to WebSocket message");
             }
             }
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to WebSocket message");
         }
         }
     }
     }
 
 
@@ -247,6 +250,7 @@ public class MagicWebSocketInstance extends WebSocketListener {
     @Override
     @Override
     public void onFailure(WebSocket webSocket, Throwable t, Response response) {
     public void onFailure(WebSocket webSocket, Throwable t, Response response) {
         Log.d(TAG, "Error : " + t.getMessage());
         Log.d(TAG, "Error : " + t.getMessage());
+        closeWebSocket(webSocket);
         restartWebSocket();
         restartWebSocket();
     }
     }