From bec37f82ae95b01d4648afcadd044a027eef8204 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Tue, 21 Nov 2017 10:27:43 +0100 Subject: [PATCH] Some Signed-off-by: Mario Danic --- .../talk/activities/CallActivity.java | 64 +++++-------------- .../nextcloud/talk/events/PeerReadyEvent.java | 35 ---------- .../MagicFirebaseMessagingService.java | 5 ++ .../talk/webrtc/PeerConnectionWrapper.java | 55 +++++++--------- 4 files changed, 44 insertions(+), 115 deletions(-) delete mode 100644 app/src/main/java/com/nextcloud/talk/events/PeerReadyEvent.java 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 7779a5c08..42e08b393 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -49,10 +49,8 @@ import com.nextcloud.talk.api.models.json.signaling.Signaling; import com.nextcloud.talk.api.models.json.signaling.SignalingOverall; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.events.MediaStreamEvent; -import com.nextcloud.talk.events.PeerReadyEvent; import com.nextcloud.talk.events.SessionDescriptionSendEvent; import com.nextcloud.talk.persistence.entities.UserEntity; -import com.nextcloud.talk.webrtc.MagicSdpObserver; import com.nextcloud.talk.webrtc.PeerConnectionWrapper; import org.apache.commons.lang3.StringEscapeUtils; @@ -134,6 +132,8 @@ public class CallActivity extends AppCompatActivity { private UserEntity userEntity; private String callSession; + private MediaStream localMediaStream; + private String credentials; private List peerConnectionWrapperList = new ArrayList<>(); @@ -258,6 +258,10 @@ public class CallActivity extends AppCompatActivity { audioSource = peerConnectionFactory.createAudioSource(audioConstraints); localAudioTrack = peerConnectionFactory.createAudioTrack("NCa0", audioSource); + localMediaStream = peerConnectionFactory.createLocalMediaStream("NCMS"); + localMediaStream.addTrack(localAudioTrack); + localMediaStream.addTrack(localVideoTrack); + Resources r = getResources(); int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120, r.getDisplayMetrics()); videoCapturerAndroid.startCapture(px, px, 30); @@ -270,8 +274,10 @@ public class CallActivity extends AppCompatActivity { //we already have video and audio tracks. Now create peerconnections iceServers = new ArrayList<>(); - //iceServers.add(new PeerConnection.IceServer("stun:stun.l.google.com:19302")); - iceServers.add(new PeerConnection.IceServer("turn:172.104.225.9:3478")); + iceServers.add(new PeerConnection.IceServer("stun:stun.l.google.com:19302")); + //iceServers.add(new PeerConnection.IceServer("turn:mario:mario@172.104.225.9:3478")); + //iceServers.add(PeerConnection.IceServer.builder("http://172.104.225.9:3478").setUsername("mario").setPassword + // ("mario").createIceServer()); //create sdpConstraints sdpConstraints = new MediaConstraints(); @@ -308,8 +314,6 @@ public class CallActivity extends AppCompatActivity { localPeer = alwaysGetPeerConnectionWrapperForSessionId(callSession, true). getPeerConnection(); - //creating local mediastream - // start pinging the call ncApi.pingCall(ApiHelper.getCredentials(userEntity.getUsername(), userEntity.getToken()), ApiHelper.getUrlForCallPing(userEntity.getBaseUrl(), roomToken)) @@ -434,25 +438,9 @@ public class CallActivity extends AppCompatActivity { case "offer": case "answer": peerConnectionWrapper.setNick(ncSignalingMessage.getPayload().getNick()); - peerConnectionWrapper.getPeerConnection().setRemoteDescription(new MagicSdpObserver() { - - @Override - public void onSetSuccess() { - super.onSetSuccess(); - peerConnectionWrapper.getPeerConnection().createAnswer(new MagicSdpObserver() { - @Override - public void onCreateSuccess(SessionDescription sessionDescription) { - super.onCreateSuccess(sessionDescription); - peerConnectionWrapper.getPeerConnection().setLocalDescription(new MagicSdpObserver(), - sessionDescription); - } - - }, sdpConstraints); - } - }, new SessionDescription(SessionDescription.Type.fromCanonicalForm(type), + peerConnectionWrapper.getPeerConnection().setRemoteDescription(peerConnectionWrapper + .getMagicSdpObserver(), new SessionDescription(SessionDescription.Type.fromCanonicalForm(type), ncSignalingMessage.getPayload().getSdp())); - - break; case "candidate": NCIceCandidate ncIceCandidate = ncSignalingMessage.getPayload().getIceCandidate(); @@ -461,17 +449,7 @@ public class CallActivity extends AppCompatActivity { peerConnectionWrapper.addCandidate(iceCandidate); break; case "endOfCandidates": - peerConnectionWrapper.drainIceCandidates(); - if (peerConnectionWrapper.getPeerConnection().getLocalDescription() != null) { - EventBus.getDefault().post(new SessionDescriptionSendEvent - (peerConnectionWrapper.getPeerConnection().getLocalDescription(), callSession, - peerConnectionWrapper.getPeerConnection().getLocalDescription().type.canonicalForm(), - null)); - } else { - peerConnectionWrapper.getPeerConnection().createAnswer(peerConnectionWrapper - .getMagicSdpObserver(), sdpConstraints); - } - peerConnectionWrapper.sendLocalCandidates(); + //peerConnectionWrapper.drainIceCandidates(); break; default: break; @@ -550,6 +528,7 @@ public class CallActivity extends AppCompatActivity { } else { peerConnectionWrapper = new PeerConnectionWrapper(peerConnectionFactory, iceServers, sdpConstraints, sessionId, isLocalPeer, callSession); + peerConnectionWrapper.getPeerConnection().addStream(localMediaStream); peerConnectionWrapperList.add(peerConnectionWrapper); return peerConnectionWrapper; } @@ -665,16 +644,6 @@ public class CallActivity extends AppCompatActivity { eventBus.unregister(this); } - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onMessageEvent(PeerReadyEvent peerReadyEvent) { - MediaStream stream = peerConnectionFactory.createLocalMediaStream("NCMS"); - stream.addTrack(localAudioTrack); - stream.addTrack(localVideoTrack); - if (peerReadyEvent.getPeerConnection() != null) { - peerReadyEvent.getPeerConnection().addStream(stream); - } - } - @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessageEvent(MediaStreamEvent mediaStreamEvent) { gotRemoteStream(mediaStreamEvent.getMediaStream()); @@ -689,9 +658,9 @@ public class CallActivity extends AppCompatActivity { ncMessageWrapper.setSessionId(callSession); // Create signaling message and payload NCSignalingMessage ncSignalingMessage = new NCSignalingMessage(); - //ncSignalingMessage.setFrom(callSession); ncSignalingMessage.setTo(sessionDescriptionSend.getPeerId()); ncSignalingMessage.setRoomType("video"); + ncSignalingMessage.setType(sessionDescriptionSend.getType()); NCMessagePayload ncMessagePayload = new NCMessagePayload(); ncMessagePayload.setType(sessionDescriptionSend.getType()); if (!"candidate".equals(sessionDescriptionSend.getType())) { @@ -701,6 +670,7 @@ public class CallActivity extends AppCompatActivity { ncMessagePayload.setIceCandidate(sessionDescriptionSend.getNcIceCandidate()); } + // Set all we need ncSignalingMessage.setPayload(ncMessagePayload); ncMessageWrapper.setSignalingMessage(ncSignalingMessage); @@ -722,8 +692,6 @@ public class CallActivity extends AppCompatActivity { String stringToSend = stringBuilder.toString(); strings.add(stringToSend); - List wrappers = new ArrayList<>(); - wrappers.add(ncMessageWrapper); ncApi.sendSignalingMessages(credentials, ApiHelper.getUrlForSignaling(userEntity.getBaseUrl()), strings.toString()) .subscribeOn(Schedulers.newThread()) diff --git a/app/src/main/java/com/nextcloud/talk/events/PeerReadyEvent.java b/app/src/main/java/com/nextcloud/talk/events/PeerReadyEvent.java deleted file mode 100644 index 8bcbcf7da..000000000 --- a/app/src/main/java/com/nextcloud/talk/events/PeerReadyEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Nextcloud Talk application - * - * @author Mario Danic - * Copyright (C) 2017 Mario Danic - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.nextcloud.talk.events; - - -import org.webrtc.PeerConnection; - -import lombok.Data; - -@Data -public class PeerReadyEvent { - private final PeerConnection peerConnection; - - public PeerReadyEvent(PeerConnection peerConnection) { - this.peerConnection = peerConnection; - } -} diff --git a/app/src/main/java/com/nextcloud/talk/services/firebase/MagicFirebaseMessagingService.java b/app/src/main/java/com/nextcloud/talk/services/firebase/MagicFirebaseMessagingService.java index a4915970d..29937abb7 100644 --- a/app/src/main/java/com/nextcloud/talk/services/firebase/MagicFirebaseMessagingService.java +++ b/app/src/main/java/com/nextcloud/talk/services/firebase/MagicFirebaseMessagingService.java @@ -66,6 +66,11 @@ public class MagicFirebaseMessagingService extends FirebaseMessagingService { byte[] decryptedSubject = cipher.doFinal(base64DecodedSubject); DecryptedPushMessage decryptedPushMessage = LoganSquare.parse(new String(decryptedSubject), DecryptedPushMessage.class); + + if (decryptedPushMessage.getApp().equals("spreed") || decryptedPushMessage.getApp().equals + ("talk")) { + // process message + } } } catch (NoSuchAlgorithmException e1) { Log.d(TAG, "No proper algorithm to decrypt the message"); 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 53e268423..19c34ceae 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/PeerConnectionWrapper.java @@ -25,7 +25,6 @@ import android.util.Log; import com.nextcloud.talk.api.models.json.signaling.DataChannelMessage; import com.nextcloud.talk.api.models.json.signaling.NCIceCandidate; import com.nextcloud.talk.events.MediaStreamEvent; -import com.nextcloud.talk.events.PeerReadyEvent; import com.nextcloud.talk.events.SessionDescriptionSendEvent; import org.greenrobot.eventbus.EventBus; @@ -80,7 +79,6 @@ public class PeerConnectionWrapper { @Override public void onAddStream(MediaStream mediaStream) { - Log.d("MARIO", "MEDIA"); EventBus.getDefault().post(new MediaStreamEvent(mediaStream)); } @@ -103,18 +101,19 @@ public class PeerConnectionWrapper { ncIceCandidate.setSdpMid(iceCandidate.sdpMid); ncIceCandidate.setSdpMLineIndex(iceCandidate.sdpMLineIndex); ncIceCandidate.setCandidate(iceCandidate.sdp); - localCandidates.add(ncIceCandidate); + if (peerConnection.getRemoteDescription() == null) { + localCandidates.add(ncIceCandidate); + } else { + EventBus.getDefault().post(new SessionDescriptionSendEvent(null, sessionId, + "candidate", ncIceCandidate)); + } } }; - peerConnection = peerConnectionFactory.createPeerConnection(iceServerList, mediaConstraints, - magicPeerConnectionObserver); + peerConnection = peerConnectionFactory.createPeerConnection(iceServerList, mediaConstraints, + magicPeerConnectionObserver); - - if (isLocalPeer) { - EventBus.getDefault().post(new PeerReadyEvent(peerConnection)); - } this.sessionId = sessionId; this.local = isLocalPeer; this.mediaConstraints = mediaConstraints; @@ -140,30 +139,22 @@ public class PeerConnectionWrapper { @Override public void onSetSuccess() { - if (isInitiator) { - // For offering peer connection we first create offer and set - // local SDP, then after receiving answer set remote SDP. - if (peerConnection.getRemoteDescription() == null) { - // We've just set our local SDP so time to send it. - EventBus.getDefault().post(new SessionDescriptionSendEvent(peerConnection.getLocalDescription(), sessionId, - peerConnection.getLocalDescription().type.canonicalForm(), null)); - } + if (peerConnection.getRemoteDescription() == null) { + EventBus.getDefault().post(new SessionDescriptionSendEvent(peerConnection.getLocalDescription(), sessionId, + peerConnection.getLocalDescription().type.canonicalForm(), null)); + + } else if (peerConnection.getLocalDescription() == null && peerConnection.getRemoteDescription().type + .canonicalForm().equals + ("offer")) { + peerConnection.createAnswer(magicSdpObserver, mediaConstraints); + } else if ((peerConnection.getLocalDescription() != null && peerConnection.getRemoteDescription().type + .canonicalForm().equals + ("offer"))) { + EventBus.getDefault().post(new SessionDescriptionSendEvent(peerConnection.getLocalDescription(), sessionId, + peerConnection.getLocalDescription().type.canonicalForm(), null)); } else { - // For anwering peer connection we set remote SDP and then - // create answer and set local SDP. - if (peerConnection.getLocalDescription() != null) { - EventBus.getDefault().post(new SessionDescriptionSendEvent(peerConnection.getLocalDescription - (), - sessionId, - peerConnection.getLocalDescription().type.canonicalForm(), null)); - // We've just set our local SDP so time to send it, drain - // remote and send local ICE candidates. - - } else { - // We've just set remote SDP - do nothing for now - - // answer will be created soon. - - } + drainIceCandidates(); + sendLocalCandidates(); } }