From d158eeaf723002a7aab1833f9eb4dc5a66f32a24 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 24 Aug 2020 12:47:54 +0200 Subject: [PATCH] terminate jingle call when regular call starts --- .../services/XmppConnectionService.java | 5 ++++- .../xmpp/jingle/JingleConnectionManager.java | 13 +++++++++++++ .../xmpp/jingle/JingleRtpConnection.java | 10 ++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 0c46e3657..dc371fec6 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -268,7 +268,10 @@ public class XmppConnectionService extends Service { private final PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(final int state, final String phoneNumber) { - isPhoneInCall.set(state != 0); + isPhoneInCall.set(state != TelephonyManager.CALL_STATE_IDLE); + if (state == TelephonyManager.CALL_STATE_OFFHOOK) { + mJingleConnectionManager.notifyPhoneCallStarted(); + } } }; diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java index c82a8474a..178ac659c 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java @@ -14,6 +14,7 @@ import com.google.common.collect.ImmutableSet; import java.lang.ref.WeakReference; import java.security.SecureRandom; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -137,6 +138,18 @@ public class JingleConnectionManager extends AbstractConnectionManager { } } + public void notifyPhoneCallStarted() { + for (AbstractJingleConnection connection : connections.values()) { + if (connection instanceof JingleRtpConnection) { + final JingleRtpConnection rtpConnection = (JingleRtpConnection) connection; + if (rtpConnection.isTerminated()) { + continue; + } + rtpConnection.notifyPhoneCall(); + } + } + } + private Optional findMatchingSessionProposal(final Account account, final Jid with, final Set media) { synchronized (this.rtpSessionProposals) { for (Map.Entry entry : this.rtpSessionProposals.entrySet()) { diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java index eb28444a7..d2c340639 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java @@ -901,6 +901,16 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web } } + + public void notifyPhoneCall() { + Log.d(Config.LOGTAG, "a phone call has just been started. killing jingle rtp connections"); + if (Arrays.asList(State.PROPOSED, State.SESSION_INITIALIZED).contains(this.state)) { + rejectCall(); + } else { + endCall(); + } + } + public synchronized void rejectCall() { if (isTerminated()) { Log.w(Config.LOGTAG, id.account.getJid().asBareJid() + ": received rejectCall() when session has already been terminated. nothing to do");