From 668b42e27e04390a8ce7836510a481b02a16ddc3 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 11 Apr 2020 10:49:36 +0200 Subject: [PATCH] Fix #742 Signed-off-by: Mario Danic --- .../talk/controllers/CallController.kt | 47 ++++++++++--------- .../json/signaling/NCMessagePayload.java | 7 +++ .../websocket/ControlDataWebSocketMessage.kt | 14 ++++++ .../ControlOverallWebSocketMessage.kt | 10 ++++ .../json/websocket/ControlWebSocketMessage.kt | 14 ++++++ .../talk/webrtc/MagicWebSocketInstance.kt | 10 +++- app/src/main/res/values/strings.xml | 3 +- 7 files changed, 82 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlDataWebSocketMessage.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlOverallWebSocketMessage.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlWebSocketMessage.kt diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallController.kt b/app/src/main/java/com/nextcloud/talk/controllers/CallController.kt index 0ba13f345..ab08dd853 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.kt @@ -654,11 +654,11 @@ class CallController(args: Bundle) : BaseController() { microphoneControlButton?.setImageResource(R.drawable.ic_mic_off_white_24px) } - toggleMedia(audioOn, false) + toggleMedia(audioOn, false, false) } else { microphoneControlButton?.setImageResource(R.drawable.ic_mic_white_24px) pulseAnimation!!.start() - toggleMedia(true, false) + toggleMedia(true, false, false) } if (isVoiceOnlyCall && !isConnectionEstablished) { @@ -709,7 +709,7 @@ class CallController(args: Bundle) : BaseController() { cameraSwitchButton!!.visibility = View.GONE } - toggleMedia(videoOn, true) + toggleMedia(videoOn, true, false) } else if (activity != null && EffortlessPermissions.somePermissionPermanentlyDenied( activity!!, *PERMISSIONS_CAMERA @@ -746,9 +746,11 @@ class CallController(args: Bundle) : BaseController() { private fun toggleMedia( enable: Boolean, - video: Boolean + video: Boolean, + silencedByModerator: Boolean = false ) { var message: String + val alreadySilenced = microphoneControlButton?.alpha == 0.7f if (video) { message = "videoOff" if (enable) { @@ -789,6 +791,11 @@ class CallController(args: Bundle) : BaseController() { } } + if (!alreadySilenced && !enable && !video && silencedByModerator) { + microphoneControlButton?.setImageResource(R.drawable.ic_mic_off_white_24px) + Toast.makeText(context, R.string.silenced_by_moderator, Toast.LENGTH_SHORT).show() + } + sendDataChannelMessage(message) } @@ -976,21 +983,6 @@ class CallController(args: Bundle) : BaseController() { hasExternalSignalingServer = false } - if (conversationUser!!.userId != "?") { - /*try { - userUtils.createOrUpdateUser( - null, null, null, null, null, null, null, - conversationUser.id, null, null, - LoganSquare.serialize(externalSignalingServer!!) - ) - .subscribeOn(Schedulers.io()) - .subscribe() - } catch (exception: IOException) { - Log.e(TAG, "Failed to serialize external signaling server") - }*/ - - } - if (signalingSettingsOverall.ocs.signalingSettings.stunServers != null) { for (i in 0 until signalingSettingsOverall.ocs.signalingSettings.stunServers!!.size) { iceServer = signalingSettingsOverall.ocs.signalingSettings.stunServers!![i] @@ -1305,6 +1297,9 @@ class CallController(args: Bundle) : BaseController() { it, "video" ) } + "mutedByModerator" -> { + toggleMedia(enable = false, video = false, silencedByModerator = true) + } } } @@ -1399,6 +1394,16 @@ class CallController(args: Bundle) : BaseController() { magicPeerConnectionWrapper.addCandidate(iceCandidate) } "endOfCandidates" -> magicPeerConnectionWrapper.drainIceCandidates() + "control" -> { + when (ncSignalingMessage.payload.action) { + "forceMute" -> { + if (ncSignalingMessage.payload.peerId == callSession) { + toggleMedia(false, video = false, silencedByModerator = true) + } + } + else -> {} + } + } else -> { } } @@ -1799,7 +1804,7 @@ class CallController(args: Bundle) : BaseController() { (currentCallStatus == CallStatus.CALLING || isConnectionEstablished) && videoOn && enableVideo != localVideoTrack!!.enabled() ) { - toggleMedia(enableVideo, true) + toggleMedia(enableVideo, true, false) } } } else if (peerConnectionEvent.peerConnectionEventType == PeerConnectionEvent @@ -2426,7 +2431,7 @@ class CallController(args: Bundle) : BaseController() { isPTTActive = false microphoneControlButton?.setImageResource(R.drawable.ic_mic_off_white_24px) pulseAnimation!!.stop() - toggleMedia(false, false) + toggleMedia(false, false, false) animateCallControls(false, 5000) } return true diff --git a/app/src/main/java/com/nextcloud/talk/models/json/signaling/NCMessagePayload.java b/app/src/main/java/com/nextcloud/talk/models/json/signaling/NCMessagePayload.java index 98c17c4cd..d0903a5a2 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/signaling/NCMessagePayload.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/signaling/NCMessagePayload.java @@ -45,4 +45,11 @@ public class NCMessagePayload { @JsonField(name = "name") public String name; + + @JsonField(name = "action") + public String action; + + @JsonField(name = "peerId") + public String peerId; + } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlDataWebSocketMessage.kt b/app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlDataWebSocketMessage.kt new file mode 100644 index 000000000..861f8c74e --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlDataWebSocketMessage.kt @@ -0,0 +1,14 @@ +package com.nextcloud.talk.models.json.websocket + +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject + +@JsonObject +class ControlDataWebSocketMessage { + @JsonField(name = ["action"]) + var action: String? = null + + @JsonField(name = ["peerId"]) + var peerId: String? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlOverallWebSocketMessage.kt b/app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlOverallWebSocketMessage.kt new file mode 100644 index 000000000..dcef87078 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlOverallWebSocketMessage.kt @@ -0,0 +1,10 @@ +package com.nextcloud.talk.models.json.websocket + +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject + +@JsonObject +class ControlOverallWebSocketMessage : BaseWebSocketMessage() { + @JsonField(name = ["control"]) + var controlWebSocketMessage: ControlWebSocketMessage? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlWebSocketMessage.kt b/app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlWebSocketMessage.kt new file mode 100644 index 000000000..7667ec36c --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/websocket/ControlWebSocketMessage.kt @@ -0,0 +1,14 @@ +package com.nextcloud.talk.models.json.websocket + +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject + +@JsonObject +class ControlWebSocketMessage { + @JsonField(name = ["recipient"]) + var recipient: ActorWebSocketMessage? = null + + @JsonField(name = ["data"]) + var data: ControlDataWebSocketMessage? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.kt b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.kt index f15468d0d..618e21e3d 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.kt +++ b/app/src/main/java/com/nextcloud/talk/webrtc/MagicWebSocketInstance.kt @@ -309,10 +309,18 @@ class MagicWebSocketInstance internal constructor( if (!TextUtils.isEmpty(ncSignalingMessage.from)) { val messageHashMap = HashMap() - messageHashMap["jobId"] = Integer.toString(magicMap.add(ncSignalingMessage)) + messageHashMap["jobId"] = magicMap.add(ncSignalingMessage).toString() eventBus.post(WebSocketCommunicationEvent("signalingMessage", messageHashMap)) } } + "control" -> { + val controlOverallWebSocketMessage = LoganSquare.parse(text, ControlOverallWebSocketMessage::class.java) + if (controlOverallWebSocketMessage.controlWebSocketMessage?.data?.peerId == sessionId) { + if (controlOverallWebSocketMessage.controlWebSocketMessage?.data?.action?.equals("forceMute") == true) { + eventBus.post(WebSocketCommunicationEvent("mutedByModerator", hashMapOf())) + } + } + } "bye" -> { isConnected = false resumeId = "" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 389d6f79e..7493c0310 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -344,5 +344,6 @@ Search for more participants New group Where did they all hide? - Reject + Reject + You were silenced by a moderator