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 33528f640..1949a4608 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -78,7 +78,6 @@ import com.nextcloud.talk.models.json.participants.Participant; import com.nextcloud.talk.models.json.participants.ParticipantsOverall; import com.nextcloud.talk.models.json.signaling.DataChannelMessage; import com.nextcloud.talk.models.json.signaling.DataChannelMessageNick; -import com.nextcloud.talk.models.json.signaling.NCIceCandidate; import com.nextcloud.talk.models.json.signaling.NCMessagePayload; import com.nextcloud.talk.models.json.signaling.NCMessageWrapper; import com.nextcloud.talk.models.json.signaling.NCSignalingMessage; @@ -86,6 +85,7 @@ import com.nextcloud.talk.models.json.signaling.Signaling; import com.nextcloud.talk.models.json.signaling.SignalingOverall; import com.nextcloud.talk.models.json.signaling.settings.IceServer; import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall; +import com.nextcloud.talk.signaling.SignalingMessageReceiver; import com.nextcloud.talk.ui.dialog.AudioOutputDialog; import com.nextcloud.talk.users.UserManager; import com.nextcloud.talk.utils.ApiUtils; @@ -264,6 +264,8 @@ public class CallActivity extends CallBaseActivity { private SpotlightView spotlightView; + private CallActivitySignalingMessageReceiver signalingMessageReceiver = new CallActivitySignalingMessageReceiver(); + private ExternalSignalingServer externalSignalingServer; private MagicWebSocketInstance webSocketClient; private WebSocketConnectionHelper webSocketConnectionHelper; @@ -1670,44 +1672,12 @@ public class CallActivity extends CallBaseActivity { return; } - PeerConnectionWrapper peerConnectionWrapper = null; - if ("offer".equals(type)) { - peerConnectionWrapper = - getOrCreatePeerConnectionWrapperForSessionIdAndType(ncSignalingMessage.getFrom(), - ncSignalingMessage.getRoomType(), false); - } else { - peerConnectionWrapper = - getPeerConnectionWrapperForSessionIdAndType(ncSignalingMessage.getFrom(), - ncSignalingMessage.getRoomType()); + getOrCreatePeerConnectionWrapperForSessionIdAndType(ncSignalingMessage.getFrom(), + ncSignalingMessage.getRoomType(), false); } - if (peerConnectionWrapper == null) { - return; - } - - String sdp = ncSignalingMessage.getPayload().getSdp(); - String nick = ncSignalingMessage.getPayload().getNick(); - - switch (type) { - case "offer": - peerConnectionWrapper.getWebRtcMessageListener().onOffer(sdp, nick); - break; - case "answer": - peerConnectionWrapper.getWebRtcMessageListener().onAnswer(sdp, nick); - break; - case "candidate": - NCIceCandidate ncIceCandidate = ncSignalingMessage.getPayload().getIceCandidate(); - peerConnectionWrapper.getWebRtcMessageListener().onCandidate(ncIceCandidate.getSdpMid(), - ncIceCandidate.getSdpMLineIndex(), - ncIceCandidate.getCandidate()); - break; - case "endOfCandidates": - peerConnectionWrapper.getWebRtcMessageListener().onEndOfCandidates(); - break; - default: - break; - } + signalingMessageReceiver.process(ncSignalingMessage); } else { Log.e(TAG, "unexpected RoomType while processing NCSignalingMessage"); } @@ -2010,7 +1980,8 @@ public class CallActivity extends CallBaseActivity { localStream, true, true, - type); + type, + signalingMessageReceiver); } else if (hasMCU) { peerConnectionWrapper = new PeerConnectionWrapper(peerConnectionFactory, @@ -2021,7 +1992,8 @@ public class CallActivity extends CallBaseActivity { null, false, true, - type); + type, + signalingMessageReceiver); } else { if (!"screen".equals(type)) { peerConnectionWrapper = new PeerConnectionWrapper(peerConnectionFactory, @@ -2032,7 +2004,8 @@ public class CallActivity extends CallBaseActivity { localStream, false, false, - type); + type, + signalingMessageReceiver); } else { peerConnectionWrapper = new PeerConnectionWrapper(peerConnectionFactory, iceServers, @@ -2042,7 +2015,8 @@ public class CallActivity extends CallBaseActivity { null, false, false, - type); + type, + signalingMessageReceiver); } } @@ -2653,6 +2627,15 @@ public class CallActivity extends CallBaseActivity { } } + /** + * Temporary implementation of SignalingMessageReceiver until signaling related code is extracted from CallActivity. + */ + private static class CallActivitySignalingMessageReceiver extends SignalingMessageReceiver { + public void process(NCSignalingMessage message) { + processSignalingMessage(message); + } + } + private class MicrophoneButtonTouchListener implements View.OnTouchListener { @SuppressLint("ClickableViewAccessibility") 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 f4fbbeba9..a06df1781 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java @@ -37,6 +37,7 @@ import com.nextcloud.talk.events.WebSocketCommunicationEvent; import com.nextcloud.talk.models.json.signaling.DataChannelMessage; import com.nextcloud.talk.models.json.signaling.DataChannelMessageNick; import com.nextcloud.talk.models.json.signaling.NCIceCandidate; +import com.nextcloud.talk.signaling.SignalingMessageReceiver; import org.greenrobot.eventbus.EventBus; import org.webrtc.AudioTrack; @@ -74,6 +75,7 @@ public class PeerConnectionWrapper { private static final String TAG = PeerConnectionWrapper.class.getCanonicalName(); + private final SignalingMessageReceiver signalingMessageReceiver; private final WebRtcMessageListener webRtcMessageListener = new WebRtcMessageListener(); private List iceCandidates = new ArrayList<>(); @@ -98,7 +100,8 @@ public class PeerConnectionWrapper { List iceServerList, MediaConstraints mediaConstraints, String sessionId, String localSession, @Nullable MediaStream localStream, - boolean isMCUPublisher, boolean hasMCU, String videoStreamType) { + boolean isMCUPublisher, boolean hasMCU, String videoStreamType, + SignalingMessageReceiver signalingMessageReceiver) { Objects.requireNonNull(NextcloudTalkApplication.Companion.getSharedApplication()).getComponentApplication().inject(this); @@ -116,6 +119,9 @@ public class PeerConnectionWrapper { configuration.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN; peerConnection = peerConnectionFactory.createPeerConnection(configuration, new MagicPeerConnectionObserver()); + this.signalingMessageReceiver = signalingMessageReceiver; + this.signalingMessageReceiver.addListener(webRtcMessageListener, sessionId, videoStreamType); + if (peerConnection != null) { if (this.localStream != null) { List localStreamIds = Collections.singletonList(this.localStream.getId()); @@ -152,6 +158,8 @@ public class PeerConnectionWrapper { } public void removePeerConnection() { + signalingMessageReceiver.removeListener(webRtcMessageListener); + if (dataChannel != null) { dataChannel.dispose(); dataChannel = null; @@ -261,11 +269,7 @@ public class PeerConnectionWrapper { return false; } - public WebRtcMessageListener getWebRtcMessageListener() { - return webRtcMessageListener; - } - - public class WebRtcMessageListener { + private class WebRtcMessageListener implements SignalingMessageReceiver.WebRtcMessageListener { public void onOffer(String sdp, String nick) { onOfferOrAnswer("offer", sdp, nick);