Track pending incoming ice updates in addition to outgoing

// FREEBIE
This commit is contained in:
Moxie Marlinspike 2017-07-12 11:15:28 -07:00
parent 34443b059c
commit 9dd508b6f5

View File

@ -170,7 +170,8 @@ public class WebRtcCallService extends Service implements InjectableType, PeerCo
@Nullable private Recipient recipient; @Nullable private Recipient recipient;
@Nullable private PeerConnectionWrapper peerConnection; @Nullable private PeerConnectionWrapper peerConnection;
@Nullable private DataChannel dataChannel; @Nullable private DataChannel dataChannel;
@Nullable private List<IceUpdateMessage> pendingIceUpdates; @Nullable private List<IceUpdateMessage> pendingOutgoingIceUpdates;
@Nullable private List<IceCandidate> pendingIncomingIceUpdates;
@Nullable public static SurfaceViewRenderer localRenderer; @Nullable public static SurfaceViewRenderer localRenderer;
@Nullable public static SurfaceViewRenderer remoteRenderer; @Nullable public static SurfaceViewRenderer remoteRenderer;
@ -329,6 +330,7 @@ public class WebRtcCallService extends Service implements InjectableType, PeerCo
this.callState = CallState.STATE_ANSWERING; this.callState = CallState.STATE_ANSWERING;
this.callId = intent.getLongExtra(EXTRA_CALL_ID, -1); this.callId = intent.getLongExtra(EXTRA_CALL_ID, -1);
this.pendingIncomingIceUpdates = new LinkedList<>();
this.recipient = getRemoteRecipient(intent); this.recipient = getRemoteRecipient(intent);
if (isIncomingMessageExpired(intent)) { if (isIncomingMessageExpired(intent)) {
@ -358,6 +360,9 @@ public class WebRtcCallService extends Service implements InjectableType, PeerCo
ListenableFutureTask<Boolean> listenableFutureTask = sendMessage(recipient, SignalServiceCallMessage.forAnswer(new AnswerMessage(WebRtcCallService.this.callId, sdp.description))); ListenableFutureTask<Boolean> listenableFutureTask = sendMessage(recipient, SignalServiceCallMessage.forAnswer(new AnswerMessage(WebRtcCallService.this.callId, sdp.description)));
for (IceCandidate candidate : pendingIncomingIceUpdates) WebRtcCallService.this.peerConnection.addIceCandidate(candidate);
WebRtcCallService.this.pendingIncomingIceUpdates = null;
listenableFutureTask.addListener(new FailureListener<Boolean>(WebRtcCallService.this.callState, WebRtcCallService.this.callId) { listenableFutureTask.addListener(new FailureListener<Boolean>(WebRtcCallService.this.callState, WebRtcCallService.this.callId) {
@Override @Override
public void onFailureContinue(Throwable error) { public void onFailureContinue(Throwable error) {
@ -383,7 +388,7 @@ public class WebRtcCallService extends Service implements InjectableType, PeerCo
this.callState = CallState.STATE_DIALING; this.callState = CallState.STATE_DIALING;
this.recipient = getRemoteRecipient(intent); this.recipient = getRemoteRecipient(intent);
this.callId = SecureRandom.getInstance("SHA1PRNG").nextLong(); this.callId = SecureRandom.getInstance("SHA1PRNG").nextLong();
this.pendingIceUpdates = new LinkedList<>(); this.pendingOutgoingIceUpdates = new LinkedList<>();
initializeVideo(); initializeVideo();
@ -451,12 +456,12 @@ public class WebRtcCallService extends Service implements InjectableType, PeerCo
return; return;
} }
if (peerConnection == null || pendingIceUpdates == null) { if (peerConnection == null || pendingOutgoingIceUpdates == null) {
throw new AssertionError("assert"); throw new AssertionError("assert");
} }
if (!pendingIceUpdates.isEmpty()) { if (!pendingOutgoingIceUpdates.isEmpty()) {
ListenableFutureTask<Boolean> listenableFutureTask = sendMessage(recipient, SignalServiceCallMessage.forIceUpdates(pendingIceUpdates)); ListenableFutureTask<Boolean> listenableFutureTask = sendMessage(recipient, SignalServiceCallMessage.forIceUpdates(pendingOutgoingIceUpdates));
listenableFutureTask.addListener(new FailureListener<Boolean>(callState, callId) { listenableFutureTask.addListener(new FailureListener<Boolean>(callState, callId) {
@Override @Override
@ -470,7 +475,7 @@ public class WebRtcCallService extends Service implements InjectableType, PeerCo
} }
this.peerConnection.setRemoteDescription(new SessionDescription(SessionDescription.Type.ANSWER, intent.getStringExtra(EXTRA_REMOTE_DESCRIPTION))); this.peerConnection.setRemoteDescription(new SessionDescription(SessionDescription.Type.ANSWER, intent.getStringExtra(EXTRA_REMOTE_DESCRIPTION)));
this.pendingIceUpdates = null; this.pendingOutgoingIceUpdates = null;
} catch (PeerConnectionException e) { } catch (PeerConnectionException e) {
Log.w(TAG, e); Log.w(TAG, e);
terminate(); terminate();
@ -480,10 +485,13 @@ public class WebRtcCallService extends Service implements InjectableType, PeerCo
private void handleRemoteIceCandidate(Intent intent) { private void handleRemoteIceCandidate(Intent intent) {
Log.w(TAG, "handleRemoteIceCandidate..."); Log.w(TAG, "handleRemoteIceCandidate...");
if (peerConnection != null && Util.isEquals(this.callId, getCallId(intent))) { if (Util.isEquals(this.callId, getCallId(intent))) {
peerConnection.addIceCandidate(new IceCandidate(intent.getStringExtra(EXTRA_ICE_SDP_MID), IceCandidate candidate = new IceCandidate(intent.getStringExtra(EXTRA_ICE_SDP_MID),
intent.getIntExtra(EXTRA_ICE_SDP_LINE_INDEX, 0), intent.getIntExtra(EXTRA_ICE_SDP_LINE_INDEX, 0),
intent.getStringExtra(EXTRA_ICE_SDP))); intent.getStringExtra(EXTRA_ICE_SDP));
if (peerConnection != null) peerConnection.addIceCandidate(candidate);
else if (pendingIncomingIceUpdates != null) pendingIncomingIceUpdates.add(candidate);
} }
} }
@ -501,9 +509,9 @@ public class WebRtcCallService extends Service implements InjectableType, PeerCo
intent.getIntExtra(EXTRA_ICE_SDP_LINE_INDEX, 0), intent.getIntExtra(EXTRA_ICE_SDP_LINE_INDEX, 0),
intent.getStringExtra(EXTRA_ICE_SDP)); intent.getStringExtra(EXTRA_ICE_SDP));
if (pendingIceUpdates != null) { if (pendingOutgoingIceUpdates != null) {
Log.w(TAG, "Adding to pending ice candidates..."); Log.w(TAG, "Adding to pending ice candidates...");
this.pendingIceUpdates.add(iceUpdateMessage); this.pendingOutgoingIceUpdates.add(iceUpdateMessage);
return; return;
} }
@ -886,7 +894,8 @@ public class WebRtcCallService extends Service implements InjectableType, PeerCo
this.microphoneEnabled = true; this.microphoneEnabled = true;
this.localVideoEnabled = false; this.localVideoEnabled = false;
this.remoteVideoEnabled = false; this.remoteVideoEnabled = false;
this.pendingIceUpdates = null; this.pendingOutgoingIceUpdates = null;
this.pendingIncomingIceUpdates = null;
lockManager.updatePhoneState(LockManager.PhoneState.IDLE); lockManager.updatePhoneState(LockManager.PhoneState.IDLE);
} }