From 4f5a344a20a99b165845ec995397c47642ba418c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Kr=C3=BCger?= Date: Wed, 4 May 2022 12:32:35 +0200 Subject: [PATCH] Add handling for "event.participants.update.all" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case a moderator of a restricted room ends the call for all participants a update participants event with the field 'all=true' will be thrown by the HPB. { "type": "event" "event": { "target": "participants", "type": "update", "update": [ "roomid": "the-room-id", "incall": new-incall-state, "all": true ] } } In that case the call can be ended directly without handling every single participant. Resolves: #1881 Signed-off-by: Tim Krüger --- .../talk/activities/CallActivity.java | 25 ++++++++++++++----- .../talk/webrtc/MagicWebSocketInstance.java | 15 ++++++++++- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 3cd82bc42..a459ee93f 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -93,9 +93,9 @@ import com.nextcloud.talk.utils.power.PowerManagerUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder; import com.nextcloud.talk.webrtc.MagicAudioManager; -import com.nextcloud.talk.webrtc.PeerConnectionWrapper; import com.nextcloud.talk.webrtc.MagicWebRTCUtils; import com.nextcloud.talk.webrtc.MagicWebSocketInstance; +import com.nextcloud.talk.webrtc.PeerConnectionWrapper; import com.nextcloud.talk.webrtc.WebSocketConnectionHelper; import com.wooplr.spotlight.SpotlightView; @@ -1481,11 +1481,24 @@ public class CallActivity extends CallBaseActivity { break; case "participantsUpdate": Log.d(TAG, "onMessageEvent 'participantsUpdate'"); - if (webSocketCommunicationEvent.getHashMap().get("roomToken").equals(roomToken)) { - processUsersInRoom( - (List>) webSocketClient - .getJobWithId( - Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId")))); + + // See MagicWebSocketInstance#onMessage in case "participants" how the 'updateParameters' are created + Map updateParameters = webSocketCommunicationEvent.getHashMap(); + + if (roomToken.equals(updateParameters.get("roomToken"))) { + if (updateParameters.containsKey("all") && Boolean.parseBoolean(updateParameters.get("all"))) { + if (updateParameters.containsKey("incall") && "0".equals(updateParameters.get("incall"))) { + Log.d(TAG, "Most probably a moderator ended the call for all."); + hangup(true); + } + } else if (updateParameters.containsKey("jobId")) { + // In that case a list of users for the room is passed. + processUsersInRoom( + (List>) webSocketClient + .getJobWithId( + Integer.valueOf(updateParameters.get("jobId")))); + } + } break; case "signalingMessage": 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 4cc2667ce..417918524 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.java @@ -269,7 +269,20 @@ public class MagicWebSocketInstance extends WebSocketListener { HashMap refreshChatHashMap = new HashMap<>(); HashMap updateEventMap = (HashMap) eventOverallWebSocketMessage.getEventMap().get("update"); refreshChatHashMap.put("roomToken", (String) updateEventMap.get("roomid")); - refreshChatHashMap.put("jobId", Integer.toString(magicMap.add(updateEventMap.get("users")))); + + if (updateEventMap.containsKey("users")) { + refreshChatHashMap.put("jobId", Integer.toString(magicMap.add(updateEventMap.get("users")))); + } + + if (updateEventMap.containsKey("incall")) { + refreshChatHashMap.put("incall", + Long.toString((Long)updateEventMap.get("incall"))); + } + + if (updateEventMap.containsKey("all")) { + refreshChatHashMap.put("all", Boolean.toString((Boolean) updateEventMap.get("all"))); + } + eventBus.post(new WebSocketCommunicationEvent("participantsUpdate", refreshChatHashMap)); } break;