From c16ca8327928acf01a91df3b512025b6bb9eee50 Mon Sep 17 00:00:00 2001 From: jubb Date: Wed, 9 Mar 2022 10:11:26 +1100 Subject: [PATCH] feat: reset peer connection on DC to prevent ICE messages from old connection or stale state in reconnecting --- .../securesms/service/WebRtcCallService.kt | 3 ++- .../org/thoughtcrime/securesms/webrtc/CallManager.kt | 4 ++++ .../securesms/webrtc/PeerConnectionWrapper.kt | 11 +++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.kt b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.kt index 4c4f023e5..eaab2e14b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/WebRtcCallService.kt @@ -103,7 +103,7 @@ class WebRtcCallService: Service(), CallManager.WebRtcListener { const val EXTRA_WANTS_TO_ANSWER = "wants_to_answer" const val INVALID_NOTIFICATION_ID = -1 - private const val TIMEOUT_SECONDS = 30L + private const val TIMEOUT_SECONDS = 90L private const val RECONNECT_SECONDS = 5L private const val MAX_RECONNECTS = 5 @@ -820,6 +820,7 @@ class WebRtcCallService: Service(), CallManager.WebRtcListener { .setAction(ACTION_ICE_CONNECTED) startService(intent) } else if (newState in arrayOf(FAILED, DISCONNECTED) && scheduledReconnect == null) { + callManager.resetPeerConnection() callManager.callId?.let { callId -> callManager.postConnectionEvent(Event.IceDisconnect) { val currentNetwork = getCurrentNetwork() diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallManager.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallManager.kt index 7708b7454..5603fac7c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallManager.kt @@ -705,6 +705,10 @@ class CallManager(context: Context, audioManager: AudioManagerCompat, private va } } + fun resetPeerConnection() { + peerConnection?.resetPeerConnection() + } + interface WebRtcListener: PeerConnection.Observer { fun onHangup() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionWrapper.kt b/app/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionWrapper.kt index 0c2d53184..1641e436f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionWrapper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/PeerConnectionWrapper.kt @@ -143,9 +143,6 @@ class PeerConnectionWrapper(private val context: Context, fun setNewRemoteDescription(description: SessionDescription) { val future = SettableFuture() - peerConnection?.close() - initPeerConnection() - peerConnection!!.setRemoteDescription(object: SdpObserver { override fun onCreateSuccess(p0: SessionDescription?) { throw AssertionError() @@ -243,9 +240,6 @@ class PeerConnectionWrapper(private val context: Context, fun createNewOffer(mediaConstraints: MediaConstraints): SessionDescription { val future = SettableFuture() - peerConnection?.close() - initPeerConnection() - peerConnection!!.createOffer(object:SdpObserver { override fun onCreateSuccess(sdp: SessionDescription?) { future.set(sdp) @@ -363,4 +357,9 @@ class PeerConnectionWrapper(private val context: Context, rotationVideoSink.mirrored = newCameraState.activeDirection == CameraState.Direction.FRONT cameraEventListener.onCameraSwitchCompleted(newCameraState) } + + fun resetPeerConnection() { + peerConnection?.close() + initPeerConnection() + } } \ No newline at end of file