diff options
Diffstat (limited to 'src/main/java/de/pixart/messenger/xmpp/XmppConnection.java')
-rw-r--r-- | src/main/java/de/pixart/messenger/xmpp/XmppConnection.java | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/main/java/de/pixart/messenger/xmpp/XmppConnection.java b/src/main/java/de/pixart/messenger/xmpp/XmppConnection.java index 48d4c631a..eedc8219d 100644 --- a/src/main/java/de/pixart/messenger/xmpp/XmppConnection.java +++ b/src/main/java/de/pixart/messenger/xmpp/XmppConnection.java @@ -122,6 +122,8 @@ public class XmppConnection implements Runnable { private long lastDiscoStarted = 0; private AtomicInteger mPendingServiceDiscoveries = new AtomicInteger(0); private AtomicBoolean mWaitForDisco = new AtomicBoolean(true); + private AtomicBoolean mWaitingForSmCatchup = new AtomicBoolean(false); + private AtomicInteger mSmCatchupMessageCounter = new AtomicInteger(0); private boolean mInteractive = false; private int attempt = 0; public static String errorMessage = null; @@ -249,9 +251,18 @@ public class XmppConnection implements Runnable { this.lastConnect = SystemClock.elapsedRealtime(); this.lastPingSent = SystemClock.elapsedRealtime(); this.lastDiscoStarted = Long.MAX_VALUE; + this.mWaitingForSmCatchup.set(false); this.changeStatus(Account.State.CONNECTING); } + public boolean isWaitingForSmCatchup() { + return mWaitingForSmCatchup.get(); + } + + public void incrementSmCatchupMessageCounter() { + this.mSmCatchupMessageCounter.incrementAndGet(); + } + protected void connect() { if (mXmppConnectionService.areMessagesInitialized()) { mXmppConnectionService.resetSendingToWaiting(account); @@ -644,6 +655,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); + } + } final Element ack = tagReader.readElement(nextTag); lastPacketReceived = SystemClock.elapsedRealtime(); try { @@ -869,7 +887,10 @@ public class XmppConnection implements Runnable { Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": resuming after stanza #" + stanzasReceived); } final ResumePacket resume = new ResumePacket(this.streamId, stanzasReceived, smVersion); + this.mSmCatchupMessageCounter.set(0); + this.mWaitingForSmCatchup.set(true); this.tagWriter.writeStanzaAsync(resume); + this.tagWriter.writeStanzaAsync(new RequestPacket(smVersion)); } else if (needsBinding) { if (this.streamFeatures.hasChild("bind")) { sendBindRequest(); |