diff --git a/.changeset/fix-hasPublished-thread-safety.md b/.changeset/fix-hasPublished-thread-safety.md new file mode 100644 index 00000000..58cd837f --- /dev/null +++ b/.changeset/fix-hasPublished-thread-safety.md @@ -0,0 +1,5 @@ +--- +"client-sdk-android": patch +--- + +Improve thread-safety and reconnection reliability for hasPublished flag. 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 ec657c3c..8f4f8aa9 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 @@ -200,6 +200,7 @@ internal constructor( @Volatile private var isClosed = true + @Volatile private var hasPublished = false private var coroutineScope = CloseableCoroutineScope(SupervisorJob() + ioDispatcher) @@ -676,12 +677,14 @@ internal constructor( } internal fun negotiatePublisher() { + // Mark intent to publish before checking Signal state so reconnect() can + // re-trigger negotiation even if the first attempt occurs before Signal connects. + hasPublished = true + if (!client.isConnected) { return } - hasPublished = true - coroutineScope.launch { if (negotiatePublisherMutex.tryLock()) { try {