From 0dcdd6161f6c12549894619c4b600df79aa2b35e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Calvi=C3=B1o=20S=C3=A1nchez?= Date: Mon, 7 Nov 2022 01:29:37 +0100 Subject: [PATCH] Move nick handling out of PeerConnectionWrapper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PeerConnectionWrappers should not be concerned with the nick of participants. Moreover, the nick is included in offers and answers due to legacy reasons and only when the internal signaling server is used. Due to that the nick was moved out of PeerConnectionWrapper; although the handling is now different the end result should be the same (there might be some differences in very specific sequences of events, but in any case all this is just a temporary step and any leftover issue should be addressed once call participants and peer connections are split). As the PeerConnectionWrapper does not keep track of the nick now the nick changed event is always emitted when a nick changed data channel message is received, even if the nick did not actually change. Nevertheless, before it was anyway always emitted if it was for a user and only when it was for a guest it was emitted only on real changes. In any case this is not expected to cause any issue (other than some unneeded view updates, but that will be addressed at a later point by updating the views only when the model actually changed). Signed-off-by: Daniel Calviño Sánchez --- .../talk/activities/CallActivity.java | 58 ++++++++++++++++++- .../talk/webrtc/PeerConnectionWrapper.java | 26 ++------- 2 files changed, 62 insertions(+), 22 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 08d051efd..c79d81774 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -263,6 +263,8 @@ public class CallActivity extends CallBaseActivity { private InternalSignalingMessageSender internalSignalingMessageSender = new InternalSignalingMessageSender(); private SignalingMessageSender signalingMessageSender; + private Map offerAnswerNickProviders = new HashMap<>(); + private Map callParticipantMessageListeners = new HashMap<>(); @@ -2007,6 +2009,13 @@ public class CallActivity extends CallBaseActivity { signalingMessageReceiver.addListener(callParticipantMessageListener, sessionId); } + if (!publisher && !hasExternalSignalingServer && offerAnswerNickProviders.get(sessionId) == null) { + OfferAnswerNickProvider offerAnswerNickProvider = new OfferAnswerNickProvider(); + offerAnswerNickProviders.put(sessionId, offerAnswerNickProvider); + signalingMessageReceiver.addListener(offerAnswerNickProvider.getVideoWebRtcMessageListener(), sessionId, "video"); + signalingMessageReceiver.addListener(offerAnswerNickProvider.getScreenWebRtcMessageListener(), sessionId, "screen"); + } + if (publisher) { startSendingNick(); } @@ -2043,6 +2052,12 @@ public class CallActivity extends CallBaseActivity { if (!justScreen) { SignalingMessageReceiver.CallParticipantMessageListener listener = callParticipantMessageListeners.remove(sessionId); signalingMessageReceiver.removeListener(listener); + + OfferAnswerNickProvider offerAnswerNickProvider = offerAnswerNickProviders.remove(sessionId); + if (offerAnswerNickProvider != null) { + signalingMessageReceiver.removeListener(offerAnswerNickProvider.getVideoWebRtcMessageListener()); + signalingMessageReceiver.removeListener(offerAnswerNickProvider.getScreenWebRtcMessageListener()); + } } } @@ -2264,7 +2279,7 @@ public class CallActivity extends CallBaseActivity { if (hasExternalSignalingServer) { nick = webSocketClient.getDisplayNameForSession(session); } else { - nick = peerConnectionWrapper != null ? peerConnectionWrapper.getNick() : ""; + nick = offerAnswerNickProviders.get(session) != null ? offerAnswerNickProviders.get(session).getNick() : ""; } String userId4Usage = userId; @@ -2561,6 +2576,47 @@ public class CallActivity extends CallBaseActivity { } } + private static class OfferAnswerNickProvider { + + private class WebRtcMessageListener implements SignalingMessageReceiver.WebRtcMessageListener { + + @Override + public void onOffer(String sdp, String nick) { + (OfferAnswerNickProvider.this).nick = nick; + } + + @Override + public void onAnswer(String sdp, String nick) { + (OfferAnswerNickProvider.this).nick = nick; + } + + @Override + public void onCandidate(String sdpMid, int sdpMLineIndex, String sdp) { + } + + @Override + public void onEndOfCandidates() { + } + } + + private final WebRtcMessageListener videoWebRtcMessageListener = new WebRtcMessageListener(); + private final WebRtcMessageListener screenWebRtcMessageListener = new WebRtcMessageListener(); + + private String nick; + + public WebRtcMessageListener getVideoWebRtcMessageListener() { + return videoWebRtcMessageListener; + } + + public WebRtcMessageListener getScreenWebRtcMessageListener() { + return screenWebRtcMessageListener; + } + + public String getNick() { + return nick; + } + } + private class CallActivityCallParticipantMessageListener implements SignalingMessageReceiver.CallParticipantMessageListener { private final String sessionId; diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java b/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java index c91c8b222..944bbf8f8 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java @@ -81,7 +81,6 @@ public class PeerConnectionWrapper { private List iceCandidates = new ArrayList<>(); private PeerConnection peerConnection; private String sessionId; - private String nick; private final MediaConstraints mediaConstraints; private DataChannel dataChannel; private final MagicSdpObserver magicSdpObserver; @@ -220,14 +219,6 @@ public class PeerConnectionWrapper { return sessionId; } - public String getNick() { - return nick; - } - - private void setNick(String nick) { - this.nick = nick; - } - private void sendInitialMediaStatus() { if (localStream != null) { if (localStream.videoTracks.size() == 1 && localStream.videoTracks.get(0).enabled()) { @@ -269,16 +260,14 @@ public class PeerConnectionWrapper { private class WebRtcMessageListener implements SignalingMessageReceiver.WebRtcMessageListener { public void onOffer(String sdp, String nick) { - onOfferOrAnswer("offer", sdp, nick); + onOfferOrAnswer("offer", sdp); } public void onAnswer(String sdp, String nick) { - onOfferOrAnswer("answer", sdp, nick); + onOfferOrAnswer("answer", sdp); } - private void onOfferOrAnswer(String type, String sdp, String nick) { - setNick(nick); - + private void onOfferOrAnswer(String type, String sdp) { SessionDescription sessionDescriptionWithPreferredCodec; boolean isAudio = false; @@ -334,15 +323,10 @@ public class PeerConnectionWrapper { try { DataChannelMessage dataChannelMessage = LoganSquare.parse(strData, DataChannelMessage.class); - String internalNick; if ("nickChanged".equals(dataChannelMessage.getType())) { if (dataChannelMessage.getPayload() instanceof String) { - internalNick = (String) dataChannelMessage.getPayload(); - if (!internalNick.equals(nick)) { - setNick(internalNick); - EventBus.getDefault().post(new PeerConnectionEvent(PeerConnectionEvent.PeerConnectionEventType - .NICK_CHANGE, sessionId, getNick(), null, videoStreamType)); - } + EventBus.getDefault().post(new PeerConnectionEvent(PeerConnectionEvent.PeerConnectionEventType + .NICK_CHANGE, sessionId, (String) dataChannelMessage.getPayload(), null, videoStreamType)); } else { if (dataChannelMessage.getPayload() != null) { Map payloadMap = (Map) dataChannelMessage.getPayload();