Fix telecom system freeze in poor network.

fork-5.53.8
Cody Henthorne 2022-07-22 13:13:42 -04:00
rodzic 1d6b62d8ca
commit 9bade7ed4b
6 zmienionych plików z 19 dodań i 10 usunięć

Wyświetl plik

@ -47,7 +47,7 @@ class AndroidCallConnectionService : ConnectionService() {
setRinging() setRinging()
} }
AndroidTelecomUtil.connections[recipientId] = connection AndroidTelecomUtil.connections[recipientId] = connection
ApplicationDependencies.getSignalCallManager().setTelecomApproved(callId) ApplicationDependencies.getSignalCallManager().setTelecomApproved(callId, recipientId)
return connection return connection
} }
@ -80,7 +80,7 @@ class AndroidCallConnectionService : ConnectionService() {
setDialing() setDialing()
} }
AndroidTelecomUtil.connections[recipientId] = connection AndroidTelecomUtil.connections[recipientId] = connection
ApplicationDependencies.getSignalCallManager().setTelecomApproved(callId) ApplicationDependencies.getSignalCallManager().setTelecomApproved(callId, recipientId)
return connection return connection
} }

Wyświetl plik

@ -141,7 +141,7 @@ object AndroidTelecomUtil {
if (telecomSupported) { if (telecomSupported) {
val telecomBundle = bundleOf( val telecomBundle = bundleOf(
TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE to getPhoneAccountHandle(), 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( TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS to bundleOf(
AndroidCallConnectionService.KEY_RECIPIENT_ID to recipientId.serialize(), AndroidCallConnectionService.KEY_RECIPIENT_ID to recipientId.serialize(),
AndroidCallConnectionService.KEY_CALL_ID to callId, AndroidCallConnectionService.KEY_CALL_ID to callId,

Wyświetl plik

@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.events.WebRtcViewModel;
import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.notifications.DoNotDisturbUtil; import org.thoughtcrime.securesms.notifications.DoNotDisturbUtil;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.ringrtc.CallState; import org.thoughtcrime.securesms.ringrtc.CallState;
import org.thoughtcrime.securesms.ringrtc.RemotePeer; import org.thoughtcrime.securesms.ringrtc.RemotePeer;
import org.thoughtcrime.securesms.service.webrtc.state.CallSetupState; import org.thoughtcrime.securesms.service.webrtc.state.CallSetupState;
@ -75,8 +76,8 @@ public class IncomingCallActionProcessor extends DeviceAwareActionProcessor {
} }
@Override @Override
protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId) { protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId, RecipientId recipientId) {
return proceed(super.handleSetTelecomApproved(currentState, callId)); return proceed(super.handleSetTelecomApproved(currentState, callId, recipientId));
} }
private @NonNull WebRtcServiceState proceed(@NonNull WebRtcServiceState currentState) { private @NonNull WebRtcServiceState proceed(@NonNull WebRtcServiceState currentState) {

Wyświetl plik

@ -16,6 +16,7 @@ import org.thoughtcrime.securesms.events.CallParticipant;
import org.thoughtcrime.securesms.events.WebRtcViewModel; import org.thoughtcrime.securesms.events.WebRtcViewModel;
import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.recipients.RecipientUtil;
import org.thoughtcrime.securesms.ringrtc.RemotePeer; import org.thoughtcrime.securesms.ringrtc.RemotePeer;
import org.thoughtcrime.securesms.service.webrtc.WebRtcData.CallMetadata; import org.thoughtcrime.securesms.service.webrtc.WebRtcData.CallMetadata;
@ -120,8 +121,8 @@ public class OutgoingCallActionProcessor extends DeviceAwareActionProcessor {
} }
@Override @Override
protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId) { protected @NonNull WebRtcServiceState handleSetTelecomApproved(@NonNull WebRtcServiceState currentState, long callId, RecipientId recipientId) {
return proceed(super.handleSetTelecomApproved(currentState, callId)); return proceed(super.handleSetTelecomApproved(currentState, callId, recipientId));
} }
private @NonNull WebRtcServiceState proceed(@NonNull WebRtcServiceState currentState) { private @NonNull WebRtcServiceState proceed(@NonNull WebRtcServiceState currentState) {

Wyświetl plik

@ -316,8 +316,8 @@ private void processStateless(@NonNull Function1<WebRtcEphemeralState, WebRtcEph
process((s, p) -> p.handleSetUserAudioDevice(s, desiredDevice)); process((s, p) -> p.handleSetUserAudioDevice(s, desiredDevice));
} }
public void setTelecomApproved(long callId) { public void setTelecomApproved(long callId, @NonNull RecipientId recipientId) {
process((s, p) -> p.handleSetTelecomApproved(s, callId)); process((s, p) -> p.handleSetTelecomApproved(s, callId, recipientId));
} }
public void dropCall(long callId) { public void dropCall(long callId) {

Wyświetl plik

@ -256,9 +256,16 @@ public abstract class WebRtcActionProcessor {
return currentState; 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); 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() currentState = currentState.builder()
.changeCallSetupState(new CallId(callId)) .changeCallSetupState(new CallId(callId))
.telecomApproved(true) .telecomApproved(true)