diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/room/RTCEngine.kt b/livekit-android-sdk/src/main/java/io/livekit/android/room/RTCEngine.kt index c3576151..fbb9db54 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/room/RTCEngine.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/room/RTCEngine.kt @@ -505,6 +505,21 @@ internal constructor( } } + /** + * Cancel any in-progress reconnection and start a fresh one. + * Used when network availability changes, since the existing reconnect + * loop may be stuck in blocking calls to an unreachable server. + * Forces a full reconnect since the cancelled job may have already + * destroyed peer connections via closeResources(). + */ + @Synchronized + internal fun forceReconnect() { + reconnectingJob?.cancel() + reconnectingJob = null + fullReconnectOnNext = true + reconnect() + } + /** * reconnect Signal and PeerConnections */ diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/room/Room.kt b/livekit-android-sdk/src/main/java/io/livekit/android/room/Room.kt index 77de0cfb..0bb887d4 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/room/Room.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/room/Room.kt @@ -968,9 +968,6 @@ constructor( } private fun reconnect() { - if (state == State.RECONNECTING) { - return - } engine.reconnect() } @@ -1116,8 +1113,11 @@ constructor( private val networkCallbackManager = networkCallbackManagerFactory.invoke( object : NetworkCallback() { override fun onLost(network: Network) { - // lost connection, flip to reconnecting hasLostConnectivity = true + if (state == State.CONNECTED) { + state = State.RECONNECTING + eventBus.postEvent(RoomEvent.Reconnecting(this@Room), coroutineScope) + } } override fun onAvailable(network: Network) { @@ -1125,9 +1125,13 @@ constructor( if (!hasLostConnectivity) { return } - LKLog.i { "network connection available, reconnecting" } - reconnect() hasLostConnectivity = false + LKLog.i { "network connection available, reconnecting" } + // Force-restart reconnection. The engine likely already started + // its own reconnect loop (via ICE state detection) while offline, + // but that loop may be stuck in blocking calls to unreachable + // servers. Cancel it and start fresh now that network is back. + engine.forceReconnect() } }, )