浏览代码

Improve websocket connection management

Mario Danic 6 年之前
父节点
当前提交
3ec2480848

+ 4 - 0
app/src/main/java/com/nextcloud/talk/controllers/CallController.java

@@ -1196,6 +1196,10 @@ public class CallController extends BaseController {
         webSocketClient = webSocketConnectionHelper.getExternalSignalingInstanceForServer(
                 externalSignalingServer.getExternalSignalingServer(),
                 conversationUser, externalSignalingServer.getExternalSignalingTicket());
+
+        if (webSocketClient.isConnected()) {
+            joinRoomAndCall();
+        }
     }
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)

+ 1 - 0
app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java

@@ -183,6 +183,7 @@ public class RestModule {
                                    CookieManager cookieManager, Dispatcher dispatcher) {
         OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
 
+        httpClient.retryOnConnectionFailure(true);
         httpClient.connectTimeout(45, TimeUnit.SECONDS);
         httpClient.readTimeout(45, TimeUnit.SECONDS);
         httpClient.writeTimeout(45, TimeUnit.SECONDS);

+ 17 - 4
app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java

@@ -72,6 +72,8 @@ public class MagicWebSocketInstance extends WebSocketListener {
     private WebSocket webSocket;
     private MagicMap magicMap;
 
+    private String currentRoomToken;
+
     MagicWebSocketInstance(UserEntity conversationUser, String connectionUrl, String webSocketTicket) {
         NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
         Request request = new Request.Builder().url(connectionUrl).build();
@@ -115,12 +117,17 @@ public class MagicWebSocketInstance extends WebSocketListener {
                     break;
                 case "error":
                     ErrorOverallWebSocketMessage errorOverallWebSocketMessage = LoganSquare.parse(text, ErrorOverallWebSocketMessage.class);
+                    if (("no_such_session").equals(errorOverallWebSocketMessage.getErrorWebSocketMessage().getCode().equals("no_such_session"))) {
+                        resumeId = "";
+
+                    }
                     break;
                 case "room":
                     JoinedRoomOverallWebSocketMessage joinedRoomOverallWebSocketMessage = LoganSquare.parse(text, JoinedRoomOverallWebSocketMessage.class);
                     if (joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomPropertiesWebSocketMessage() != null) {
                         HashMap<String, String> joinRoomHashMap = new HashMap<>();
                         joinRoomHashMap.put("roomToken", joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomId());
+                        currentRoomToken = joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomId();
                         eventBus.post(new WebSocketCommunicationEvent("roomJoined", joinRoomHashMap));
                     }
                 break;
@@ -202,10 +209,16 @@ public class MagicWebSocketInstance extends WebSocketListener {
     }
 
     public void joinRoomWithRoomTokenAndSession(String roomToken, String normalBackendSession) {
-        try {
-            webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledJoinOrLeaveRoomModel(roomToken, normalBackendSession)));
-        } catch (IOException e) {
-            Log.e(TAG, "Failed to serialize room overall websocket message");
+        if (!roomToken.equals(currentRoomToken)) {
+            try {
+                webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledJoinOrLeaveRoomModel(roomToken, normalBackendSession)));
+            } catch (IOException e) {
+                Log.e(TAG, "Failed to serialize room overall websocket message");
+            }
+        } else {
+            HashMap<String, String> joinRoomHashMap = new HashMap<>();
+            joinRoomHashMap.put("roomToken", currentRoomToken);
+            eventBus.post(new WebSocketCommunicationEvent("roomJoined", joinRoomHashMap));
         }
     }
 

+ 3 - 3
app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java

@@ -47,7 +47,7 @@ import okhttp3.OkHttpClient;
 
 @AutoInjector(NextcloudTalkApplication.class)
 public class WebSocketConnectionHelper {
-    private Map<String, MagicWebSocketInstance> magicWebSocketInstanceMap = new HashMap<>();
+    private static Map<String, MagicWebSocketInstance> magicWebSocketInstanceMap = new HashMap<>();
 
     @Inject
     OkHttpClient okHttpClient;
@@ -57,7 +57,7 @@ public class WebSocketConnectionHelper {
         NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
     }
 
-    private String getExternalSignalingServerUrlFromSettingsUrl(String url) {
+    private static String getExternalSignalingServerUrlFromSettingsUrl(String url) {
         String generatedURL = url.replace("https://", "wss://").replace("http://", "ws://");
 
         if (generatedURL.endsWith("/")) {
@@ -69,7 +69,7 @@ public class WebSocketConnectionHelper {
         return generatedURL;
     }
 
-    public synchronized MagicWebSocketInstance getExternalSignalingInstanceForServer(String url, UserEntity userEntity, String webSocketTicket) {
+    public static synchronized MagicWebSocketInstance getExternalSignalingInstanceForServer(String url, UserEntity userEntity, String webSocketTicket) {
 
         String connectionUrl = getExternalSignalingServerUrlFromSettingsUrl(url);