Seems to work

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2017-12-06 16:38:42 +01:00
parent db96e94a60
commit d0e85c746b
2 changed files with 33 additions and 26 deletions

View File

@ -126,9 +126,7 @@ public class CallActivity extends AppCompatActivity {
AudioTrack localAudioTrack; AudioTrack localAudioTrack;
VideoCapturer videoCapturer; VideoCapturer videoCapturer;
VideoRenderer localRenderer; VideoRenderer localRenderer;
VideoRenderer remoteRenderer;
HashMap<String, VideoRenderer> videoRendererHashMap = new HashMap<>(); HashMap<String, VideoRenderer> videoRendererHashMap = new HashMap<>();
PeerConnection localPeer;
EglBase rootEglBase; EglBase rootEglBase;
boolean leavingCall = false; boolean leavingCall = false;
BooleanSupplier booleanSupplier = () -> leavingCall; BooleanSupplier booleanSupplier = () -> leavingCall;
@ -322,8 +320,6 @@ public class CallActivity extends AppCompatActivity {
@Override @Override
public void onNext(GenericOverall genericOverall) { public void onNext(GenericOverall genericOverall) {
callSession = callOverall.getOcs().getData().getSessionId(); callSession = callOverall.getOcs().getData().getSessionId();
localPeer = alwaysGetPeerConnectionWrapperForSessionId(callSession).
getPeerConnection();
// start pinging the call // start pinging the call
ncApi.pingCall(ApiHelper.getCredentials(userEntity.getUsername(), userEntity.getToken()), ncApi.pingCall(ApiHelper.getCredentials(userEntity.getUsername(), userEntity.getToken()),
@ -360,7 +356,8 @@ public class CallActivity extends AppCompatActivity {
userEntity.getToken()), ApiHelper.getUrlForSignaling(userEntity.getBaseUrl())) userEntity.getToken()), ApiHelper.getUrlForSignaling(userEntity.getBaseUrl()))
.subscribeOn(Schedulers.newThread()) .subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.repeatWhen(observable -> observable.delay(1500, TimeUnit.MILLISECONDS)) .repeatWhen(observable -> observable.delay(1500, TimeUnit
.MILLISECONDS))
.repeatUntil(booleanSupplier) .repeatUntil(booleanSupplier)
.retry(3) .retry(3)
.subscribe(new Observer<SignalingOverall>() { .subscribe(new Observer<SignalingOverall>() {
@ -487,7 +484,8 @@ public class CallActivity extends AppCompatActivity {
List<String> oldSesssions = new ArrayList<>(); List<String> oldSesssions = new ArrayList<>();
for (HashMap<String, String> participant : users) { for (HashMap<String, String> participant : users) {
if (!participant.get("sessionId").equals(callSession) && Boolean.parseBoolean(participant.get("inCall"))) { Object inCallObject = participant.get("inCall");
if (!participant.get("sessionId").equals(callSession) && (boolean)inCallObject) {
newSessions.add(participant.get("sessionId")); newSessions.add(participant.get("sessionId"));
} }
} }
@ -533,8 +531,7 @@ public class CallActivity extends AppCompatActivity {
return magicPeerConnectionWrapper; return magicPeerConnectionWrapper;
} else { } else {
magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory,
iceServers, sdpConstraints, sessionId, callSession); iceServers, sdpConstraints, sessionId, callSession, localMediaStream);
magicPeerConnectionWrapper.getPeerConnection().addStream(localMediaStream);
magicPeerConnectionWrapperList.add(magicPeerConnectionWrapper); magicPeerConnectionWrapperList.add(magicPeerConnectionWrapper);
return magicPeerConnectionWrapper; return magicPeerConnectionWrapper;
} }
@ -554,6 +551,10 @@ public class CallActivity extends AppCompatActivity {
leavingCall = true; leavingCall = true;
dispose(null); dispose(null);
for (int i = 0; i < magicPeerConnectionWrapperList.size(); i++) {
endPeerConnection(magicPeerConnectionWrapperList.get(i).getSessionId());
}
for (MagicPeerConnectionWrapper magicPeerConnectionWrapper : magicPeerConnectionWrapperList) { for (MagicPeerConnectionWrapper magicPeerConnectionWrapper : magicPeerConnectionWrapperList) {
endPeerConnection(magicPeerConnectionWrapper.getSessionId()); endPeerConnection(magicPeerConnectionWrapper.getSessionId());
} }
@ -665,8 +666,8 @@ public class CallActivity extends AppCompatActivity {
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy();
hangup(); hangup();
super.onDestroy();
} }
private void dispose(@Nullable Disposable disposable) { private void dispose(@Nullable Disposable disposable) {
@ -739,12 +740,12 @@ public class CallActivity extends AppCompatActivity {
ncMessageWrapper.setEv("message"); ncMessageWrapper.setEv("message");
ncMessageWrapper.setSessionId(callSession); ncMessageWrapper.setSessionId(callSession);
NCSignalingMessage ncSignalingMessage = new NCSignalingMessage(); NCSignalingMessage ncSignalingMessage = new NCSignalingMessage();
ncSignalingMessage.setFrom(callSession);
ncSignalingMessage.setTo(sessionDescriptionSend.getPeerId()); ncSignalingMessage.setTo(sessionDescriptionSend.getPeerId());
ncSignalingMessage.setRoomType("video"); ncSignalingMessage.setRoomType("video");
ncSignalingMessage.setType(sessionDescriptionSend.getType()); ncSignalingMessage.setType(sessionDescriptionSend.getType());
NCMessagePayload ncMessagePayload = new NCMessagePayload(); NCMessagePayload ncMessagePayload = new NCMessagePayload();
ncMessagePayload.setType(sessionDescriptionSend.getType()); ncMessagePayload.setType(sessionDescriptionSend.getType());
if (!"candidate".equals(sessionDescriptionSend.getType())) { if (!"candidate".equals(sessionDescriptionSend.getType())) {
ncMessagePayload.setSdp(sessionDescriptionSend.getSessionDescription().description); ncMessagePayload.setSdp(sessionDescriptionSend.getSessionDescription().description);
ncMessagePayload.setNick(userEntity.getDisplayName()); ncMessagePayload.setNick(userEntity.getDisplayName());

View File

@ -60,30 +60,32 @@ public class MagicPeerConnectionWrapper {
private boolean audioOn; private boolean audioOn;
private boolean videoOn; private boolean videoOn;
private boolean hasInitiated;
public MagicPeerConnectionWrapper(PeerConnectionFactory peerConnectionFactory, public MagicPeerConnectionWrapper(PeerConnectionFactory peerConnectionFactory,
List<PeerConnection.IceServer> iceServerList, List<PeerConnection.IceServer> iceServerList,
MediaConstraints mediaConstraints, MediaConstraints mediaConstraints,
String sessionId, String localSession) { String sessionId, String localSession, MediaStream mediaStream) {
this.iceServers = iceServerList; this.iceServers = iceServerList;
this.localSession = localSession; this.localSession = localSession;
peerConnection = peerConnectionFactory.createPeerConnection(iceServerList, mediaConstraints, peerConnection = peerConnectionFactory.createPeerConnection(iceServerList, mediaConstraints,
new MagicPeerConnectionObserver()); new MagicPeerConnectionObserver());
peerConnection.addStream(mediaStream);
this.sessionId = sessionId; this.sessionId = sessionId;
this.mediaConstraints = mediaConstraints; this.mediaConstraints = mediaConstraints;
magicSdpObserver = new MagicSdpObserver(); magicSdpObserver = new MagicSdpObserver();
hasInitiated = sessionId.compareTo(localSession) < 0;
if (sessionId.compareTo(localSession) < 0) { if (hasInitiated) {
DataChannel.Init init = new DataChannel.Init(); DataChannel.Init init = new DataChannel.Init();
init.negotiated = false; init.negotiated = false;
magicDataChannel = peerConnection.createDataChannel("status", init); magicDataChannel = peerConnection.createDataChannel("status", init);
magicDataChannel.registerObserver(new MagicDataChannelObserver()); magicDataChannel.registerObserver(new MagicDataChannelObserver());
peerConnection.createOffer(magicSdpObserver, mediaConstraints); peerConnection.createOffer(magicSdpObserver, mediaConstraints);
} }
} }
public void drainIceCandidates() { public void drainIceCandidates() {
@ -188,6 +190,10 @@ public class MagicPeerConnectionWrapper {
@Override @Override
public void onIceConnectionChange(PeerConnection.IceConnectionState iceConnectionState) { public void onIceConnectionChange(PeerConnection.IceConnectionState iceConnectionState) {
if (iceConnectionState.equals(PeerConnection.IceConnectionState.CONNECTED) && hasInitiated) {
sendChannelData(new DataChannelMessage("videoOn"));
sendChannelData(new DataChannelMessage("audioOn"));
}
} }
@Override @Override
@ -219,15 +225,19 @@ public class MagicPeerConnectionWrapper {
public void onAddStream(MediaStream mediaStream) { public void onAddStream(MediaStream mediaStream) {
videoOn = mediaStream.videoTracks != null && mediaStream.videoTracks.size() == 1; videoOn = mediaStream.videoTracks != null && mediaStream.videoTracks.size() == 1;
audioOn = mediaStream.audioTracks != null && mediaStream.audioTracks.size() == 1; audioOn = mediaStream.audioTracks != null && mediaStream.audioTracks.size() == 1;
if (!sessionId.equals(localSession)) {
EventBus.getDefault().post(new MediaStreamEvent(mediaStream, sessionId)); EventBus.getDefault().post(new MediaStreamEvent(mediaStream, sessionId));
} }
}
@Override @Override
public void onRemoveStream(MediaStream mediaStream) { public void onRemoveStream(MediaStream mediaStream) {
videoOn = mediaStream.videoTracks != null && mediaStream.videoTracks.size() == 1; videoOn = mediaStream.videoTracks != null && mediaStream.videoTracks.size() == 1;
audioOn = mediaStream.audioTracks != null && mediaStream.audioTracks.size() == 1; audioOn = mediaStream.audioTracks != null && mediaStream.audioTracks.size() == 1;
if (!sessionId.equals(localSession)) {
EventBus.getDefault().post(new MediaStreamEvent(null, sessionId)); EventBus.getDefault().post(new MediaStreamEvent(null, sessionId));
} }
}
@Override @Override
public void onDataChannel(DataChannel dataChannel) { public void onDataChannel(DataChannel dataChannel) {
@ -263,25 +273,21 @@ public class MagicPeerConnectionWrapper {
@Override @Override
public void onCreateSuccess(SessionDescription sessionDescription) { public void onCreateSuccess(SessionDescription sessionDescription) {
EventBus.getDefault().post(new SessionDescriptionSendEvent(sessionDescription, sessionId,
sessionDescription.type.canonicalForm().toLowerCase(), null));
peerConnection.setLocalDescription(magicSdpObserver, sessionDescription); peerConnection.setLocalDescription(magicSdpObserver, sessionDescription);
} }
@Override @Override
public void onSetSuccess() { public void onSetSuccess() {
if (peerConnection != null) { if (peerConnection != null) {
if (peerConnection.getLocalDescription() == null) {
peerConnection.createAnswer(magicSdpObserver, mediaConstraints);
}
if (peerConnection.getRemoteDescription() != null) { if (peerConnection.getRemoteDescription() != null) {
drainIceCandidates(); drainIceCandidates();
} }
if (peerConnection.getRemoteDescription() == null) {
EventBus.getDefault().post(new SessionDescriptionSendEvent(peerConnection.getLocalDescription(), sessionId,
peerConnection.getLocalDescription().type.canonicalForm(), null));
} else if (peerConnection.getLocalDescription() == null && sessionId.compareTo(localSession) > 0) {
peerConnection.createAnswer(magicSdpObserver, mediaConstraints);
} else if ((peerConnection.getLocalDescription() != null)) {
EventBus.getDefault().post(new SessionDescriptionSendEvent(peerConnection.getLocalDescription(), sessionId,
peerConnection.getLocalDescription().type.canonicalForm(), null));
}
} }
} }
} }