From 9bade7ed4bc6565c369244285dfc9978925933be Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 22 Jul 2022 13:13:42 -0400 Subject: [PATCH] Fix telecom system freeze in poor network. --- .../service/webrtc/AndroidCallConnectionService.kt | 4 ++-- .../securesms/service/webrtc/AndroidTelecomUtil.kt | 2 +- .../service/webrtc/IncomingCallActionProcessor.java | 5 +++-- .../service/webrtc/OutgoingCallActionProcessor.java | 5 +++-- .../securesms/service/webrtc/SignalCallManager.java | 4 ++-- .../securesms/service/webrtc/WebRtcActionProcessor.java | 9 ++++++++- 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidCallConnectionService.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidCallConnectionService.kt index 031411924a..c6bc5d9bc3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidCallConnectionService.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidCallConnectionService.kt @@ -47,7 +47,7 @@ class AndroidCallConnectionService : ConnectionService() { setRinging() } AndroidTelecomUtil.connections[recipientId] = connection - ApplicationDependencies.getSignalCallManager().setTelecomApproved(callId) + ApplicationDependencies.getSignalCallManager().setTelecomApproved(callId, recipientId) return connection } @@ -80,7 +80,7 @@ class AndroidCallConnectionService : ConnectionService() { setDialing() } AndroidTelecomUtil.connections[recipientId] = connection - ApplicationDependencies.getSignalCallManager().setTelecomApproved(callId) + ApplicationDependencies.getSignalCallManager().setTelecomApproved(callId, recipientId) return connection } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt index 99f358c7db..ad3c6c5d15 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AndroidTelecomUtil.kt @@ -141,7 +141,7 @@ object AndroidTelecomUtil { if (telecomSupported) { val telecomBundle = bundleOf( TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE to getPhoneAccountHandle(), - TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE to VideoProfile.STATE_BIDIRECTIONAL, + TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE to if (isVideoCall) VideoProfile.STATE_BIDIRECTIONAL else VideoProfile.STATE_AUDIO_ONLY, TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS to bundleOf( AndroidCallConnectionService.KEY_RECIPIENT_ID to recipientId.serialize(), AndroidCallConnectionService.KEY_CALL_ID to callId, diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java index 06495f7ec8..a8994cea68 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IncomingCallActionProcessor.java @@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.events.WebRtcViewModel; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.notifications.DoNotDisturbUtil; import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.ringrtc.CallState; import org.thoughtcrime.securesms.ringrtc.RemotePeer; import org.thoughtcrime.securesms.service.webrtc.state.CallSetupState; @@ -75,8 +76,8 @@ public class IncomingCallActionProcessor extends DeviceAwareActionProcessor { } @Override - protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId) { - return proceed(super.handleSetTelecomApproved(currentState, callId)); + protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId, RecipientId recipientId) { + return proceed(super.handleSetTelecomApproved(currentState, callId, recipientId)); } private @NonNull WebRtcServiceState proceed(@NonNull WebRtcServiceState currentState) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/OutgoingCallActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/OutgoingCallActionProcessor.java index 3e5b605355..5388642d71 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/OutgoingCallActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/OutgoingCallActionProcessor.java @@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.events.CallParticipant; import org.thoughtcrime.securesms.events.WebRtcViewModel; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.ringrtc.RemotePeer; import org.thoughtcrime.securesms.service.webrtc.WebRtcData.CallMetadata; @@ -120,8 +121,8 @@ public class OutgoingCallActionProcessor extends DeviceAwareActionProcessor { } @Override - protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId) { - return proceed(super.handleSetTelecomApproved(currentState, callId)); + protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId, RecipientId recipientId) { + return proceed(super.handleSetTelecomApproved(currentState, callId, recipientId)); } private @NonNull WebRtcServiceState proceed(@NonNull WebRtcServiceState currentState) { 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 8c8ef08641..723a367438 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 @@ -316,8 +316,8 @@ private void processStateless(@NonNull Function1 p.handleSetUserAudioDevice(s, desiredDevice)); } - public void setTelecomApproved(long callId) { - process((s, p) -> p.handleSetTelecomApproved(s, callId)); + public void setTelecomApproved(long callId, @NonNull RecipientId recipientId) { + process((s, p) -> p.handleSetTelecomApproved(s, callId, recipientId)); } public void dropCall(long callId) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java index a93e639f76..425266703a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java @@ -256,9 +256,16 @@ public abstract class WebRtcActionProcessor { return currentState; } - protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId) { + protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId, RecipientId recipientId) { Log.i(tag, "handleSetTelecomApproved(): call_id: " + callId); + RemotePeer peer = currentState.getCallInfoState().getPeerByCallId(new CallId(callId)); + if (peer == null || !peer.callIdEquals(currentState.getCallInfoState().getActivePeer())) { + Log.w(tag, "Received telecom approval after call terminated. callId: " + callId + " recipient: " + recipientId); + webRtcInteractor.terminateCall(recipientId); + return currentState; + } + currentState = currentState.builder() .changeCallSetupState(new CallId(callId)) .telecomApproved(true)