From 2b4d5d74f2e3ad79d9b434bf2159eec7f2b503a8 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 4 Dec 2025 09:50:19 -0400 Subject: [PATCH] Fix crash when no remote participants are available when analyzing call result. --- .../thoughtcrime/securesms/calls/quality/CallQuality.kt | 4 ++-- .../securesms/service/webrtc/SignalCallManager.java | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/quality/CallQuality.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/quality/CallQuality.kt index 5fa10eed81..7ed93bfee1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/quality/CallQuality.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/quality/CallQuality.kt @@ -28,8 +28,8 @@ object CallQuality { ) @JvmStatic - fun handleOneToOneCallSummary(callSummary: CallSummary, isVideoCall: Boolean) { - val callType = if (isVideoCall) CallType.DIRECT_VIDEO else CallType.DIRECT_VOICE + fun handleOneToOneCallSummary(callSummary: CallSummary, hasRemoteVideoContent: Boolean) { + val callType = if (hasRemoteVideoContent) CallType.DIRECT_VIDEO else CallType.DIRECT_VOICE handleCallSummary(callSummary, callType) } 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 31c88a1dcc..e7934dd800 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 @@ -614,11 +614,15 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. if (s.getCallInfoState().getGroupCall() != null) { Log.i(TAG, "onCallEnded(): call_id: bypassing call summary handling for group call, this is handled in onEnded(groupCall, ...)"); } else { - boolean isRemoteVideoEnabled = Objects.requireNonNull(s.getCallInfoState().getRemoteCallParticipant(s.getCallInfoState().getCallRecipient())).isVideoEnabled(); + boolean hasRemoteVideoContent = s.getCallInfoState() + .getRemoteCallParticipants() + .stream() + .anyMatch(participant -> participant.isVideoEnabled() || participant.isScreenSharing()); + CameraState cameraState = s.getLocalDeviceState().getCameraState(); boolean isLocalVideoEnabled = cameraState.isEnabled() && cameraState.getCameraCount() > 0; - CallQuality.handleOneToOneCallSummary(summary, isRemoteVideoEnabled || isLocalVideoEnabled); + CallQuality.handleOneToOneCallSummary(summary, hasRemoteVideoContent || isLocalVideoEnabled); } switch (reason) {