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;
|
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());
|
||||||
|
@ -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,14 +225,18 @@ 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;
|
||||||
EventBus.getDefault().post(new MediaStreamEvent(mediaStream, sessionId));
|
if (!sessionId.equals(localSession)) {
|
||||||
|
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;
|
||||||
EventBus.getDefault().post(new MediaStreamEvent(null, sessionId));
|
if (!sessionId.equals(localSession)) {
|
||||||
|
EventBus.getDefault().post(new MediaStreamEvent(null, sessionId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -263,24 +273,20 @@ 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.getRemoteDescription() != null) {
|
if (peerConnection.getLocalDescription() == null) {
|
||||||
drainIceCandidates();
|
peerConnection.createAnswer(magicSdpObserver, mediaConstraints);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (peerConnection.getRemoteDescription() == null) {
|
if (peerConnection.getRemoteDescription() != null) {
|
||||||
EventBus.getDefault().post(new SessionDescriptionSendEvent(peerConnection.getLocalDescription(), sessionId,
|
drainIceCandidates();
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user