retract proposal when accepting other call

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java | 65 
1 file changed, 51 insertions(+), 14 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java 🔗

@@ -1,7 +1,5 @@
 package eu.siacs.conversations.xmpp.jingle;
 
-import android.os.Bundle;
-import android.telecom.TelecomManager;
 import android.util.Base64;
 import android.util.Log;
 
@@ -31,9 +29,7 @@ import eu.siacs.conversations.xml.Namespace;
 import eu.siacs.conversations.xmpp.Jid;
 import eu.siacs.conversations.xmpp.XmppConnection;
 import eu.siacs.conversations.xmpp.jingle.stanzas.Content;
-import eu.siacs.conversations.xmpp.jingle.stanzas.FileTransferDescription;
 import eu.siacs.conversations.xmpp.jingle.stanzas.GenericDescription;
-import eu.siacs.conversations.xmpp.jingle.stanzas.IbbTransportInfo;
 import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
 import eu.siacs.conversations.xmpp.jingle.stanzas.Propose;
 import eu.siacs.conversations.xmpp.jingle.stanzas.Reason;
@@ -384,7 +380,8 @@ public class JingleConnectionManager extends AbstractConnectionManager {
                         rtpConnection.setProposedMedia(ImmutableSet.copyOf(media));
                         rtpConnection.deliveryMessage(from, message, serverMsgId, timestamp);
 
-                        CallIntegrationConnectionService.addNewIncomingCall(getXmppConnectionService(), id);
+                        CallIntegrationConnectionService.addNewIncomingCall(
+                                getXmppConnectionService(), id);
                         // TODO actually do the automatic accept?!
                     } else {
                         Log.d(
@@ -435,7 +432,8 @@ public class JingleConnectionManager extends AbstractConnectionManager {
                     rtpConnection.setProposedMedia(ImmutableSet.copyOf(media));
                     rtpConnection.deliveryMessage(from, message, serverMsgId, timestamp);
 
-                    CallIntegrationConnectionService.addNewIncomingCall(getXmppConnectionService(), id);
+                    CallIntegrationConnectionService.addNewIncomingCall(
+                            getXmppConnectionService(), id);
                 }
             } else {
                 Log.d(
@@ -454,7 +452,8 @@ public class JingleConnectionManager extends AbstractConnectionManager {
                 if (proposal != null) {
                     rtpSessionProposals.remove(proposal);
                     final JingleRtpConnection rtpConnection =
-                            new JingleRtpConnection(this, id, account.getJid(), proposal.callIntegration);
+                            new JingleRtpConnection(
+                                    this, id, account.getJid(), proposal.callIntegration);
                     rtpConnection.setProposedMedia(proposal.media);
                     this.connections.put(id, rtpConnection);
                     rtpConnection.transitionOrThrow(AbstractJingleConnection.State.PROPOSED);
@@ -726,10 +725,12 @@ public class JingleConnectionManager extends AbstractConnectionManager {
                 throw new IllegalStateException(
                         "There is already a running RTP session. This should have been caught by the UI");
             }
-            final CallIntegration callIntegration = new CallIntegration(mXmppConnectionService.getApplicationContext());
+            final CallIntegration callIntegration =
+                    new CallIntegration(mXmppConnectionService.getApplicationContext());
             callIntegration.setInitialAudioDevice(CallIntegration.initialAudioDevice(media));
             final RtpSessionProposal proposal =
                     RtpSessionProposal.of(account, with.asBareJid(), media, callIntegration);
+            callIntegration.setCallback(new ProposalStateCallback(proposal));
             this.rtpSessionProposals.put(proposal, DeviceDiscoveryState.SEARCHING);
             mXmppConnectionService.notifyJingleRtpConnectionUpdate(
                     account, proposal.with, proposal.sessionId, RtpEndUserState.FINDING_DEVICE);
@@ -775,7 +776,9 @@ public class JingleConnectionManager extends AbstractConnectionManager {
             sid = null;
         }
         if (sid == null) {
-            Log.d(Config.LOGTAG, account.getJid().asBareJid()+": unable to deliver ibb packet. missing sid");
+            Log.d(
+                    Config.LOGTAG,
+                    account.getJid().asBareJid() + ": unable to deliver ibb packet. missing sid");
             account.getXmppConnection()
                     .sendIqPacket(packet.generateResponse(IqPacket.TYPE.ERROR), null);
             return;
@@ -799,7 +802,9 @@ public class JingleConnectionManager extends AbstractConnectionManager {
                 }
             }
         }
-        Log.d(Config.LOGTAG, account.getJid().asBareJid()+": unable to deliver ibb packet with sid="+sid);
+        Log.d(
+                Config.LOGTAG,
+                account.getJid().asBareJid() + ": unable to deliver ibb packet with sid=" + sid);
         account.getXmppConnection()
                 .sendIqPacket(packet.generateResponse(IqPacket.TYPE.ERROR), null);
     }
@@ -882,7 +887,7 @@ public class JingleConnectionManager extends AbstractConnectionManager {
             if (endUserState == RtpEndUserState.RINGING) {
                 sessionProposal.callIntegration.setDialing();
             }
-            //toneManager.transition(endUserState, sessionProposal.media);
+            // toneManager.transition(endUserState, sessionProposal.media);
             mXmppConnectionService.notifyJingleRtpConnectionUpdate(
                     account, sessionProposal.with, sessionProposal.sessionId, endUserState);
             Log.d(
@@ -1013,7 +1018,12 @@ public class JingleConnectionManager extends AbstractConnectionManager {
         private final Account account;
         private final CallIntegration callIntegration;
 
-        private RtpSessionProposal(Account account, Jid with, String sessionId, Set<Media> media, final CallIntegration callIntegration) {
+        private RtpSessionProposal(
+                Account account,
+                Jid with,
+                String sessionId,
+                Set<Media> media,
+                final CallIntegration callIntegration) {
             this.account = account;
             this.with = with;
             this.sessionId = sessionId;
@@ -1021,8 +1031,12 @@ public class JingleConnectionManager extends AbstractConnectionManager {
             this.callIntegration = callIntegration;
         }
 
-        public static RtpSessionProposal of(Account account, Jid with, Set<Media> media, final CallIntegration callIntegration) {
-            return new RtpSessionProposal(account, with, nextRandomId(), media,callIntegration);
+        public static RtpSessionProposal of(
+                Account account,
+                Jid with,
+                Set<Media> media,
+                final CallIntegration callIntegration) {
+            return new RtpSessionProposal(account, with, nextRandomId(), media, callIntegration);
         }
 
         @Override
@@ -1059,4 +1073,27 @@ public class JingleConnectionManager extends AbstractConnectionManager {
             return this.callIntegration;
         }
     }
+
+    public class ProposalStateCallback implements CallIntegration.Callback {
+
+        private final RtpSessionProposal proposal;
+
+        public ProposalStateCallback(final RtpSessionProposal proposal) {
+            this.proposal = proposal;
+        }
+
+        @Override
+        public void onCallIntegrationShowIncomingCallUi() {}
+
+        @Override
+        public void onCallIntegrationDisconnect() {
+            Log.d(Config.LOGTAG, "a phone call has just been started. retracting proposal");
+            retractSessionProposal(this.proposal);
+        }
+
+        @Override
+        public void onAudioDeviceChanged(
+                CallIntegration.AudioDevice selectedAudioDevice,
+                Set<CallIntegration.AudioDevice> availableAudioDevices) {}
+    }
 }