Further improvements to MCU reconnections

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2019-05-29 11:53:09 +02:00
parent 9cf7891fbc
commit e510a35ae4

View File

@ -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); if (webSocket == internalWebSocket) {
try { Log.d(TAG, "Receiving : " + text);
BaseWebSocketMessage baseWebSocketMessage = LoganSquare.parse(text, BaseWebSocketMessage.class); try {
String messageType = baseWebSocketMessage.getType(); BaseWebSocketMessage baseWebSocketMessage = LoganSquare.parse(text, BaseWebSocketMessage.class);
switch (messageType) { String messageType = baseWebSocketMessage.getType();
case "hello": switch (messageType) {
connected = true; case "hello":
reconnecting = false; connected = true;
restartCount = 0; reconnecting = false;
HelloResponseOverallWebSocketMessage helloResponseWebSocketMessage = LoganSquare.parse(text, HelloResponseOverallWebSocketMessage.class); restartCount = 0;
resumeId = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().getResumeId(); HelloResponseOverallWebSocketMessage helloResponseWebSocketMessage = LoganSquare.parse(text, HelloResponseOverallWebSocketMessage.class);
sessionId = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().getSessionId(); resumeId = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().getResumeId();
hasMCU = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().serverHasMCUSupport(); sessionId = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().getSessionId();
hasMCU = helloResponseWebSocketMessage.getHelloResponseWebSocketMessage().serverHasMCUSupport();
for (int i = 0; i < messagesQueue.size(); i++) { for (int i = 0; i < messagesQueue.size(); i++) {
webSocket.send(messagesQueue.get(i)); webSocket.send(messagesQueue.get(i));
} }
messagesQueue = new ArrayList<>(); messagesQueue = new ArrayList<>();
eventBus.post(new WebSocketCommunicationEvent("hello", null)); eventBus.post(new WebSocketCommunicationEvent("hello", null));
break; break;
case "error": case "error":
ErrorOverallWebSocketMessage errorOverallWebSocketMessage = LoganSquare.parse(text, ErrorOverallWebSocketMessage.class); ErrorOverallWebSocketMessage errorOverallWebSocketMessage = LoganSquare.parse(text, ErrorOverallWebSocketMessage.class);
if (("no_such_session").equals(errorOverallWebSocketMessage.getErrorWebSocketMessage().getCode())) { if (("no_such_session").equals(errorOverallWebSocketMessage.getErrorWebSocketMessage().getCode())) {
resumeId = ""; resumeId = "";
restartWebSocket(); restartWebSocket();
} else if (("hello_expected").equals(errorOverallWebSocketMessage.getErrorWebSocketMessage().getCode())) { } else if (("hello_expected").equals(errorOverallWebSocketMessage.getErrorWebSocketMessage().getCode())) {
restartWebSocket(); restartWebSocket();
} }
break; break;
case "room": case "room":
JoinedRoomOverallWebSocketMessage joinedRoomOverallWebSocketMessage = LoganSquare.parse(text, JoinedRoomOverallWebSocketMessage.class); JoinedRoomOverallWebSocketMessage joinedRoomOverallWebSocketMessage = LoganSquare.parse(text, JoinedRoomOverallWebSocketMessage.class);
currentRoomToken = joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomId(); currentRoomToken = joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomId();
if (joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomPropertiesWebSocketMessage() != null && !TextUtils.isEmpty(currentRoomToken)) { if (joinedRoomOverallWebSocketMessage.getRoomWebSocketMessage().getRoomPropertiesWebSocketMessage() != null && !TextUtils.isEmpty(currentRoomToken)) {
HashMap<String, String> joinRoomHashMap = new HashMap<>(); HashMap<String, String> joinRoomHashMap = new HashMap<>();
joinRoomHashMap.put("roomToken", currentRoomToken); joinRoomHashMap.put("roomToken", currentRoomToken);
eventBus.post(new WebSocketCommunicationEvent("roomJoined", joinRoomHashMap)); eventBus.post(new WebSocketCommunicationEvent("roomJoined", joinRoomHashMap));
} else { } else {
userIdSesssionHashMap = new HashMap<>(); userIdSesssionHashMap = new HashMap<>();
displayNameHashMap = new HashMap<>(); displayNameHashMap = new HashMap<>();
} }
break; break;
case "event": case "event":
EventOverallWebSocketMessage eventOverallWebSocketMessage = LoganSquare.parse(text, EventOverallWebSocketMessage.class); EventOverallWebSocketMessage eventOverallWebSocketMessage = LoganSquare.parse(text, EventOverallWebSocketMessage.class);
if (eventOverallWebSocketMessage.getEventMap() != null) { if (eventOverallWebSocketMessage.getEventMap() != null) {
String target = (String) eventOverallWebSocketMessage.getEventMap().get("target"); String target = (String) eventOverallWebSocketMessage.getEventMap().get("target");
switch (target) { switch (target) {
case "room": case "room":
if (eventOverallWebSocketMessage.getEventMap().get("type").equals("message")) { if (eventOverallWebSocketMessage.getEventMap().get("type").equals("message")) {
if (eventOverallWebSocketMessage.getEventMap().containsKey("data")) { if (eventOverallWebSocketMessage.getEventMap().containsKey("data")) {
Map<String, Object> dataHashMap = (Map<String, Object>) eventOverallWebSocketMessage.getEventMap().get("data"); Map<String, Object> dataHashMap = (Map<String, Object>) eventOverallWebSocketMessage.getEventMap().get("data");
if (dataHashMap.containsKey("chat")) { if (dataHashMap.containsKey("chat")) {
boolean shouldRefreshChat; boolean shouldRefreshChat;
Map<String, Object> chatMap = (Map<String, Object>) dataHashMap.get("chat"); Map<String, Object> chatMap = (Map<String, Object>) dataHashMap.get("chat");
if (chatMap.containsKey("refresh")) { if (chatMap.containsKey("refresh")) {
shouldRefreshChat = (boolean) chatMap.get("refresh"); shouldRefreshChat = (boolean) chatMap.get("refresh");
if (shouldRefreshChat) { if (shouldRefreshChat) {
HashMap<String, String> refreshChatHashMap = new HashMap<>(); HashMap<String, String> refreshChatHashMap = new HashMap<>();
refreshChatHashMap.put("roomToken", (String) eventOverallWebSocketMessage.getEventMap().get("roomid")); refreshChatHashMap.put("roomToken", (String) eventOverallWebSocketMessage.getEventMap().get("roomid"));
eventBus.post(new WebSocketCommunicationEvent("refreshChat", refreshChatHashMap)); 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")) { break;
List<HashMap<String, Object>> joinEventMap = (List<HashMap<String, Object>>) eventOverallWebSocketMessage.getEventMap().get("join"); case "participants":
HashMap<String, Object> internalHashMap; if (eventOverallWebSocketMessage.getEventMap().get("type").equals("update")) {
for (int i = 0; i < joinEventMap.size(); i++) { HashMap<String, String> refreshChatHashMap = new HashMap<>();
internalHashMap = joinEventMap.get(i); HashMap<String, Object> updateEventMap = (HashMap<String, Object>) eventOverallWebSocketMessage.getEventMap().get("update");
HashMap<String, Object> userMap = (HashMap<String, Object>) internalHashMap.get("user"); refreshChatHashMap.put("roomToken", (String) updateEventMap.get("roomid"));
displayNameHashMap.put((String) internalHashMap.get("sessionid"), (String) userMap.get("displayname")); refreshChatHashMap.put("jobId", Integer.toString(magicMap.add(updateEventMap.get("users"))));
userIdSesssionHashMap.put((String) internalHashMap.get("userid"), (String) internalHashMap.get("sessionid")); eventBus.post(new WebSocketCommunicationEvent("participantsUpdate", refreshChatHashMap));
} }
} break;
break; }
case "participants": }
if (eventOverallWebSocketMessage.getEventMap().get("type").equals("update")) { break;
HashMap<String, String> refreshChatHashMap = new HashMap<>(); case "message":
HashMap<String, Object> updateEventMap = (HashMap<String, Object>) eventOverallWebSocketMessage.getEventMap().get("update"); CallOverallWebSocketMessage callOverallWebSocketMessage = LoganSquare.parse(text, CallOverallWebSocketMessage.class);
refreshChatHashMap.put("roomToken", (String) updateEventMap.get("roomid")); NCSignalingMessage ncSignalingMessage = callOverallWebSocketMessage.getCallWebSocketMessage().getNcSignalingMessage();
refreshChatHashMap.put("jobId", Integer.toString(magicMap.add(updateEventMap.get("users")))); if (TextUtils.isEmpty(ncSignalingMessage.getFrom()) && callOverallWebSocketMessage.getCallWebSocketMessage().getSenderWebSocketMessage() != null) {
eventBus.post(new WebSocketCommunicationEvent("participantsUpdate", refreshChatHashMap)); ncSignalingMessage.setFrom(callOverallWebSocketMessage.getCallWebSocketMessage().getSenderWebSocketMessage().getSessionId());
}
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())) { if (!TextUtils.isEmpty(ncSignalingMessage.getFrom())) {
HashMap<String, String> messageHashMap = new HashMap<>(); HashMap<String, String> messageHashMap = new HashMap<>();
messageHashMap.put("jobId", Integer.toString(magicMap.add(ncSignalingMessage))); messageHashMap.put("jobId", Integer.toString(magicMap.add(ncSignalingMessage)));
eventBus.post(new WebSocketCommunicationEvent("signalingMessage", messageHashMap)); eventBus.post(new WebSocketCommunicationEvent("signalingMessage", messageHashMap));
} }
break; break;
case "bye": case "bye":
connected = false; connected = false;
resumeId = ""; resumeId = "";
default: default:
break; 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();
} }