@@ -43,6 +43,7 @@ import org.greenrobot.eventbus.Subscribe
4343import org.greenrobot.eventbus.ThreadMode
4444import java.io.IOException
4545import java.lang.Thread.sleep
46+ import java.util.concurrent.TimeUnit
4647import javax.inject.Inject
4748
4849@AutoInjector(NextcloudTalkApplication ::class )
@@ -80,6 +81,7 @@ class WebSocketInstance internal constructor(conversationUser: User, connectionU
8081 private var messagesQueue: MutableList <String > = ArrayList ()
8182 private val signalingMessageReceiver = ExternalSignalingMessageReceiver ()
8283 val signalingMessageSender = ExternalSignalingMessageSender ()
84+ private val signalingHttpClient: OkHttpClient by lazy { createSignalingHttpClient(okHttpClient!! ) }
8385
8486 init {
8587 sharedApplication!! .componentApplication.inject(this )
@@ -140,7 +142,7 @@ class WebSocketInstance internal constructor(conversationUser: User, connectionU
140142 reconnecting = true
141143 Log .d(TAG , " restartWebSocket: $connectionUrl " )
142144 val request = Request .Builder ().url(connectionUrl).build()
143- okHttpClient !! .newWebSocket(request, this )
145+ signalingHttpClient .newWebSocket(request, this )
144146 }
145147
146148 override fun onMessage (webSocket : WebSocket , text : String ) {
@@ -524,5 +526,13 @@ class WebSocketInstance internal constructor(conversationUser: User, connectionU
524526 private const val TAG = " WebSocketInstance"
525527 private const val NORMAL_CLOSURE = 1000
526528 private const val ONE_SECOND : Long = 1000
529+ private const val PING_INTERVAL_SECONDS : Long = 10
530+
531+ // Dedicated client with pings, so half-open WebSocket connections
532+ // (e.g. after a WiFi to cellular switch without TCP reset) fail and trigger the reconnect path.
533+ internal fun createSignalingHttpClient (baseClient : OkHttpClient ): OkHttpClient =
534+ baseClient.newBuilder()
535+ .pingInterval(PING_INTERVAL_SECONDS , TimeUnit .SECONDS )
536+ .build()
527537 }
528538}
0 commit comments