From e720b4cef80b2c9bda0877590bf2671ba69fad7b Mon Sep 17 00:00:00 2001 From: wch423 Date: Wed, 18 Mar 2026 13:28:36 +0100 Subject: [PATCH] Make outgoing call start with `CONNECTING` then switch to `RINGING` when offer is ready --- .../securesms/calls/CallCoordinator.java | 7 +++++++ .../securesms/calls/CallViewModel.java | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/calls/CallCoordinator.java b/src/main/java/org/thoughtcrime/securesms/calls/CallCoordinator.java index 60b53bf62..dc1e8d744 100644 --- a/src/main/java/org/thoughtcrime/securesms/calls/CallCoordinator.java +++ b/src/main/java/org/thoughtcrime/securesms/calls/CallCoordinator.java @@ -94,6 +94,7 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate { private final MutableLiveData errorMessage = new MutableLiveData<>(); private final MutableLiveData displayName = new MutableLiveData<>(); private final MutableLiveData displayIcon = new MutableLiveData<>(); + private final MutableLiveData outgoingCallPlaced = new MutableLiveData<>(false); // Audio Routing Support private final MediatorLiveData currentAudioEndpoint = @@ -312,6 +313,10 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate { return displayIcon; } + public LiveData getOutgoingCallPlaced() { + return outgoingCallPlaced; + } + public LiveData getCurrentAudioEndpoint() { return currentAudioEndpoint; } @@ -1132,6 +1137,7 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate { remoteVideoEnabled.postValue(true); isRelayUsed.postValue(false); errorMessage.postValue(null); + outgoingCallPlaced.postValue(false); currentAudioEndpoint.postValue(null); availableAudioEndpoints.postValue(null); } @@ -1203,6 +1209,7 @@ public class CallCoordinator implements DcEventCenter.DcEventDelegate { } this.activeCallId = callId; + outgoingCallPlaced.postValue(true); // Get callee info String calleeName = displayName.getValue(); diff --git a/src/main/java/org/thoughtcrime/securesms/calls/CallViewModel.java b/src/main/java/org/thoughtcrime/securesms/calls/CallViewModel.java index 3522c6366..74e25f5de 100644 --- a/src/main/java/org/thoughtcrime/securesms/calls/CallViewModel.java +++ b/src/main/java/org/thoughtcrime/securesms/calls/CallViewModel.java @@ -35,6 +35,7 @@ public class CallViewModel extends AndroidViewModel { private final LiveData errorMessage; private final LiveData displayName; private final LiveData displayIcon; + private final LiveData outgoingCallPlaced; private final LiveData currentAudioEndpoint; private final LiveData> availableAudioEndpoints; @@ -75,6 +76,7 @@ public class CallViewModel extends AndroidViewModel { this.errorMessage = callCoordinator.getErrorMessage(); this.displayName = callCoordinator.getDisplayName(); this.displayIcon = callCoordinator.getDisplayIcon(); + this.outgoingCallPlaced = callCoordinator.getOutgoingCallPlaced(); this.currentAudioEndpoint = callCoordinator.getCurrentAudioEndpoint(); this.availableAudioEndpoints = callCoordinator.getAvailableAudioEndpoints(); @@ -93,7 +95,7 @@ public class CallViewModel extends AndroidViewModel { if (callCoordinator.isIncomingCall()) { callState.setValue(CallState.PROMPTING_USER_ACCEPT); } else { - callState.setValue(CallState.RINGING); + callState.setValue(CallState.CONNECTING); } Log.d(TAG, "CallViewModel initialized"); @@ -116,6 +118,16 @@ public class CallViewModel extends AndroidViewModel { } } }); + + callState.addSource( + outgoingCallPlaced, + placed -> { + if (Boolean.TRUE.equals(placed) && !callCoordinator.isIncomingCall()) { + if (callState.getValue() == CallState.CONNECTING) { + callState.setValue(CallState.RINGING); + } + } + }); } private CallState translateConnectionState(PeerConnection.PeerConnectionState state) { @@ -131,7 +143,9 @@ public class CallViewModel extends AndroidViewModel { if (callCoordinator.isIncomingCall()) { return CallState.CONNECTING; } else { - return CallState.RINGING; // Mirror TypeScript + return Boolean.TRUE.equals(outgoingCallPlaced.getValue()) + ? CallState.RINGING + : CallState.CONNECTING; } case CONNECTED: