mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-19 19:49:33 +01:00
Seems to work
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
db96e94a60
commit
d0e85c746b
@ -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());
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user