diff --git a/.changeset/fix-screen-capture-connection-hang.md b/.changeset/fix-screen-capture-connection-hang.md new file mode 100644 index 00000000..55d1e670 --- /dev/null +++ b/.changeset/fix-screen-capture-connection-hang.md @@ -0,0 +1,5 @@ +--- +"client-sdk-android": patch +--- + +Fixed ScreenCaptureConnection suspending forever when bindService fails and crashing when resuming canceled continuations. diff --git a/livekit-android-sdk/src/main/java/io/livekit/android/room/track/screencapture/ScreenCaptureConnection.kt b/livekit-android-sdk/src/main/java/io/livekit/android/room/track/screencapture/ScreenCaptureConnection.kt index 5257ccf9..19c5225e 100644 --- a/livekit-android-sdk/src/main/java/io/livekit/android/room/track/screencapture/ScreenCaptureConnection.kt +++ b/livekit-android-sdk/src/main/java/io/livekit/android/room/track/screencapture/ScreenCaptureConnection.kt @@ -57,13 +57,21 @@ internal class ScreenCaptureConnection(private val context: Context) { } val intent = Intent(context, ScreenCaptureService::class.java) - context.bindService(intent, connection, BIND_AUTO_CREATE) - return suspendCancellableCoroutine { + val bound = context.bindService(intent, connection, BIND_AUTO_CREATE) + if (!bound) { + throw IllegalStateException("Failed to bind ScreenCaptureService.") + } + return suspendCancellableCoroutine { cont -> + cont.invokeOnCancellation { + synchronized(this) { + queuedConnects.remove(cont) + } + } synchronized(this) { if (isBound) { - it.resume(Unit) + cont.resume(Unit) } else { - queuedConnects.add(it) + queuedConnects.add(cont) } } }