Move nick handling out of PeerConnectionWrapper

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 <danxuliu@gmail.com>
This commit is contained in:
Daniel Calviño Sánchez 2022-11-07 01:29:37 +01:00
parent 2eac8c2cba
commit 0dcdd6161f
2 changed files with 62 additions and 22 deletions

View File

@ -263,6 +263,8 @@ public class CallActivity extends CallBaseActivity {
private InternalSignalingMessageSender internalSignalingMessageSender = new InternalSignalingMessageSender();
private SignalingMessageSender signalingMessageSender;
private Map<String, OfferAnswerNickProvider> offerAnswerNickProviders = new HashMap<>();
private Map<String, SignalingMessageReceiver.CallParticipantMessageListener> 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;

View File

@ -81,7 +81,6 @@ public class PeerConnectionWrapper {
private List<IceCandidate> 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<String, String> payloadMap = (Map<String, String>) dataChannelMessage.getPayload();