From 00042b9579acfdc8b08663d56ea331dd11e8d3dd Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 20 May 2026 09:56:18 -0400 Subject: [PATCH] Stop screen sharing when disabled from system UI. --- .../securesms/ringrtc/CameraEventListener.java | 1 + .../securesms/ringrtc/OutgoingVideoSourceRouter.kt | 9 +++++++-- .../securesms/ringrtc/ScreenShareCapturer.kt | 4 +++- .../securesms/service/webrtc/SignalCallManager.java | 5 +++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/ringrtc/CameraEventListener.java b/app/src/main/java/org/thoughtcrime/securesms/ringrtc/CameraEventListener.java index 441040d4f6..53dc7ba36c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ringrtc/CameraEventListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ringrtc/CameraEventListener.java @@ -11,4 +11,5 @@ public interface CameraEventListener { void onFullyInitialized(); void onCameraSwitchCompleted(@NonNull CameraState newCameraState); void onCameraStopped(); + void onScreenShareStopped(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/ringrtc/OutgoingVideoSourceRouter.kt b/app/src/main/java/org/thoughtcrime/securesms/ringrtc/OutgoingVideoSourceRouter.kt index 87d0cd7c93..f94f29ed62 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ringrtc/OutgoingVideoSourceRouter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ringrtc/OutgoingVideoSourceRouter.kt @@ -19,7 +19,7 @@ import kotlin.concurrent.Volatile class OutgoingVideoSourceRouter( private val context: Context, private val eglBase: EglBaseWrapper, - cameraEventListener: CameraEventListener, + private val cameraEventListener: CameraEventListener, desiredCameraDirection: CameraState.Direction ) : CameraControl { @@ -92,7 +92,12 @@ class OutgoingVideoSourceRouter( } if (screenShareCapturer == null) { - screenShareCapturer = ScreenShareCapturer(context, eglBase, ScreenSideObserver()) + screenShareCapturer = ScreenShareCapturer( + context = context, + eglBase = eglBase, + sink = ScreenSideObserver(), + onMediaProjectionStopped = cameraEventListener::onScreenShareStopped + ) } screenShareCapturer!!.start(mediaProjectionData) diff --git a/app/src/main/java/org/thoughtcrime/securesms/ringrtc/ScreenShareCapturer.kt b/app/src/main/java/org/thoughtcrime/securesms/ringrtc/ScreenShareCapturer.kt index 298273697c..04bb5fcf0a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ringrtc/ScreenShareCapturer.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ringrtc/ScreenShareCapturer.kt @@ -24,7 +24,8 @@ import kotlin.math.max class ScreenShareCapturer( private val context: Context, private val eglBase: EglBaseWrapper, - private val sink: CapturerObserver + private val sink: CapturerObserver, + private val onMediaProjectionStopped: () -> Unit ) { companion object { @@ -70,6 +71,7 @@ class ScreenShareCapturer( object : MediaProjection.Callback() { override fun onStop() { Log.i(TAG, "MediaProjection stopped") + onMediaProjectionStopped() } override fun onCapturedContentResize(width: Int, height: Int) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java index 3453af5c0e..72ba0d1035 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java @@ -1098,6 +1098,11 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. setEnableVideo(false); } + @Override + public void onScreenShareStopped() { + stopScreenShare(); + } + @Override public void onForeground() { process((s, p) -> {