make rtp proposal tracked by SM. fixes #3983

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java      | 22 
src/main/java/eu/siacs/conversations/xmpp/OnMessageAcknowledged.java          |  2 
src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java                 | 10 
src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java | 11 
4 files changed, 34 insertions(+), 11 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -152,6 +152,7 @@ import eu.siacs.conversations.xmpp.chatstate.ChatState;
 import eu.siacs.conversations.xmpp.forms.Data;
 import eu.siacs.conversations.xmpp.jingle.AbstractJingleConnection;
 import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager;
+import eu.siacs.conversations.xmpp.jingle.JingleRtpConnection;
 import eu.siacs.conversations.xmpp.jingle.Media;
 import eu.siacs.conversations.xmpp.jingle.RtpEndUserState;
 import eu.siacs.conversations.xmpp.mam.MamReference;
@@ -251,10 +252,23 @@ public class XmppConnectionService extends Service {
     private final OnMessageAcknowledged mOnMessageAcknowledgedListener = new OnMessageAcknowledged() {
 
         @Override
-        public boolean onMessageAcknowledged(Account account, String uuid) {
+        public boolean onMessageAcknowledged(final Account account, final Jid to, final String id) {
+            if (id.startsWith(JingleRtpConnection.JINGLE_MESSAGE_PROPOSE_ID_PREFIX)) {
+                final String sessionId = id.substring(JingleRtpConnection.JINGLE_MESSAGE_PROPOSE_ID_PREFIX.length());
+                mJingleConnectionManager.updateProposedSessionDiscovered(
+                        account,
+                        to,
+                        sessionId,
+                        JingleConnectionManager.DeviceDiscoveryState.SEARCHING_ACKNOWLEDGED
+                );
+            }
+
+
+            final Jid bare = to.asBareJid();
+
             for (final Conversation conversation : getConversations()) {
-                if (conversation.getAccount() == account) {
-                    Message message = conversation.findUnsentMessageWithUuid(uuid);
+                if (conversation.getAccount() == account && conversation.getJid().asBareJid().equals(bare)) {
+                    final Message message = conversation.findUnsentMessageWithUuid(id);
                     if (message != null) {
                         message.setStatus(Message.STATUS_SEND);
                         message.setErrorMessage(null);
@@ -4281,7 +4295,7 @@ public class XmppConnectionService extends Service {
     }
 
     public void sendMessagePacket(Account account, MessagePacket packet) {
-        XmppConnection connection = account.getXmppConnection();
+        final XmppConnection connection = account.getXmppConnection();
         if (connection != null) {
             connection.sendMessagePacket(packet);
         }

src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -661,10 +661,14 @@ public class XmppConnection implements Runnable {
                 if (Config.EXTENDED_SM_LOGGING) {
                     Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": server acknowledged stanza #" + mStanzaQueue.keyAt(i));
                 }
-                AbstractAcknowledgeableStanza stanza = mStanzaQueue.valueAt(i);
+                final AbstractAcknowledgeableStanza stanza = mStanzaQueue.valueAt(i);
                 if (stanza instanceof MessagePacket && acknowledgedListener != null) {
-                    MessagePacket packet = (MessagePacket) stanza;
-                    acknowledgedMessages |= acknowledgedListener.onMessageAcknowledged(account, packet.getId());
+                    final MessagePacket packet = (MessagePacket) stanza;
+                    final String id = packet.getId();
+                    final Jid to = packet.getTo();
+                    if (id != null && to != null) {
+                        acknowledgedMessages |= acknowledgedListener.onMessageAcknowledged(account, to, id);
+                    }
                 }
                 mStanzaQueue.removeAt(i);
                 i--;

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

@@ -133,7 +133,9 @@ public class JingleConnectionManager extends AbstractConnectionManager {
             }
         }
         synchronized (this.rtpSessionProposals) {
-            return this.rtpSessionProposals.containsValue(DeviceDiscoveryState.DISCOVERED) || this.rtpSessionProposals.containsValue(DeviceDiscoveryState.SEARCHING);
+            return this.rtpSessionProposals.containsValue(DeviceDiscoveryState.DISCOVERED)
+                    || this.rtpSessionProposals.containsValue(DeviceDiscoveryState.SEARCHING)
+                    || this.rtpSessionProposals.containsValue(DeviceDiscoveryState.SEARCHING_ACKNOWLEDGED);
         }
     }
 
@@ -154,7 +156,9 @@ public class JingleConnectionManager extends AbstractConnectionManager {
             for (Map.Entry<RtpSessionProposal, DeviceDiscoveryState> entry : this.rtpSessionProposals.entrySet()) {
                 final RtpSessionProposal proposal = entry.getKey();
                 final DeviceDiscoveryState state = entry.getValue();
-                final boolean openProposal = state == DeviceDiscoveryState.DISCOVERED || state == DeviceDiscoveryState.SEARCHING;
+                final boolean openProposal = state == DeviceDiscoveryState.DISCOVERED
+                        || state == DeviceDiscoveryState.SEARCHING
+                        || state == DeviceDiscoveryState.SEARCHING_ACKNOWLEDGED;
                 if (openProposal
                         && proposal.account == account
                         && proposal.with.equals(with.asBareJid())
@@ -772,11 +776,12 @@ public class JingleConnectionManager extends AbstractConnectionManager {
     }
 
     public enum DeviceDiscoveryState {
-        SEARCHING, DISCOVERED, FAILED;
+        SEARCHING, SEARCHING_ACKNOWLEDGED, DISCOVERED, FAILED;
 
         public RtpEndUserState toEndUserState() {
             switch (this) {
                 case SEARCHING:
+                case SEARCHING_ACKNOWLEDGED:
                     return RtpEndUserState.FINDING_DEVICE;
                 case DISCOVERED:
                     return RtpEndUserState.RINGING;