From 84baa3ae68363fa475aaa976d802423f62af3011 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 30 Apr 2017 16:19:39 +0200 Subject: [PATCH] avoid race conditions when downloading files or decrypting pgp messages and waiting for sm catchup --- .../conversations/parser/MessageParser.java | 5 +---- .../services/NotificationService.java | 13 +++++++++++++ .../siacs/conversations/xmpp/XmppConnection.java | 16 +++++++++------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index cef8bd1af..d8f4097a9 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -624,9 +624,6 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece } else if (notify) { if (query != null && query.isCatchup()) { mXmppConnectionService.getNotificationService().pushFromBacklog(message); - } else if (account.getXmppConnection().isWaitingForSmCatchup()) { - account.getXmppConnection().incrementSmCatchupMessageCounter(); - mXmppConnectionService.getNotificationService().pushFromBacklog(message); } else { mXmppConnectionService.getNotificationService().push(message); } @@ -700,7 +697,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece if (displayed != null) { if (packet.fromAccount(account)) { Conversation conversation = mXmppConnectionService.find(account,counterpart.toBareJid()); - if (conversation != null) { + if (conversation != null && (query == null || query.isCatchup())) { mXmppConnectionService.markRead(conversation); } } else { diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 29da2d4ca..c81860ac9 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -46,6 +46,7 @@ import eu.siacs.conversations.ui.SettingsActivity; import eu.siacs.conversations.ui.TimePreference; import eu.siacs.conversations.utils.GeoHelper; import eu.siacs.conversations.utils.UIHelper; +import eu.siacs.conversations.xmpp.XmppConnection; public class NotificationService { @@ -170,6 +171,18 @@ public class NotificationService { } public void push(final Message message) { + synchronized (message.getConversation().getAccount()) { + final XmppConnection connection = message.getConversation().getAccount().getXmppConnection(); + if (connection.isWaitingForSmCatchup()) { + connection.incrementSmCatchupMessageCounter(); + pushFromBacklog(message); + } else { + pushNow(message); + } + } + } + + private void pushNow(final Message message) { mXmppConnectionService.updateUnreadCountBadge(); if (!notify(message)) { Log.d(Config.LOGTAG,message.getConversation().getAccount().getJid().toBareJid()+": suppressing notification because turned off"); diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index a55147e4b..aca225691 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -96,7 +96,7 @@ public class XmppConnection implements Runnable { private static final int PACKET_IQ = 0; private static final int PACKET_MESSAGE = 1; private static final int PACKET_PRESENCE = 2; - protected Account account; + protected final Account account; private final WakeLock wakeLock; private Socket socket; private XmlReader tagReader; @@ -133,7 +133,7 @@ public class XmppConnection implements Runnable { private OnBindListener bindListener = null; private final ArrayList advancedStreamFeaturesLoadedListeners = new ArrayList<>(); private OnMessageAcknowledged acknowledgedListener = null; - private XmppConnectionService mXmppConnectionService = null; + private final XmppConnectionService mXmppConnectionService; private SaslMechanism saslMechanism; @@ -626,11 +626,13 @@ public class XmppConnection implements Runnable { final AckPacket ack = new AckPacket(this.stanzasReceived, smVersion); tagWriter.writeStanzaAsync(ack); } else if (nextTag.isStart("a")) { - if (mWaitingForSmCatchup.compareAndSet(true,false)) { - int count = mSmCatchupMessageCounter.get(); - Log.d(Config.LOGTAG,account.getJid().toBareJid()+": SM catchup complete ("+count+")"); - if (count > 0) { - mXmppConnectionService.getNotificationService().finishBacklog(true,account); + synchronized (account) { + if (mWaitingForSmCatchup.compareAndSet(true, false)) { + int count = mSmCatchupMessageCounter.get(); + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": SM catchup complete (" + count + ")"); + if (count > 0) { + mXmppConnectionService.getNotificationService().finishBacklog(true, account); + } } } final Element ack = tagReader.readElement(nextTag);