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();