From 3ec248084814d7193876957a36ebf54a80ab0299 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 25 Oct 2018 00:56:01 +0200 Subject: [PATCH] Improve websocket connection management --- .../talk/controllers/CallController.java | 4 ++++ .../talk/dagger/modules/RestModule.java | 1 + .../talk/webrtc/MagicWebSocketInstance.java | 21 +++++++++++++++---- .../webrtc/WebSocketConnectionHelper.java | 6 +++--- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java index 425846dd3..78d22c4aa 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/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) diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java b/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java index c7a6909ac..69a59277f 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RestModule.java +++ b/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); diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java index d2c7fb37a..600352dfc 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java +++ b/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 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 joinRoomHashMap = new HashMap<>(); + joinRoomHashMap.put("roomToken", currentRoomToken); + eventBus.post(new WebSocketCommunicationEvent("roomJoined", joinRoomHashMap)); } } diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java b/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java index b01114372..4174f9101 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/WebSocketConnectionHelper.java +++ b/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 magicWebSocketInstanceMap = new HashMap<>(); + private static Map 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);