mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-22 13:09:46 +01:00
Further improvements to MCU reconnections
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
9cf7891fbc
commit
e510a35ae4
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user