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

View File

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