kopia lustrzana https://github.com/ryukoposting/Signal-Android
Fix telecom system freeze in poor network.
rodzic
1d6b62d8ca
commit
9bade7ed4b
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Ładowanie…
Reference in New Issue