experimental: wait for SM catchup before triggering notifications

wait for a first SM ACK before calculating if we need to trigger any notifications
might have to be changed to an XEP-0199 ping later on. for now sending <r/> after resume seems to work outfine
This commit is contained in:
Daniel Gultsch 2017-03-21 17:58:08 +01:00
parent 76b9010c39
commit c97c5def2c
2 changed files with 27 additions and 3 deletions

View File

@ -606,10 +606,13 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
if (message.trusted() && message.treatAsDownloadable() != Message.Decision.NEVER && manager.getAutoAcceptFileSize() > 0) { if (message.trusted() && message.treatAsDownloadable() != Message.Decision.NEVER && manager.getAutoAcceptFileSize() > 0) {
manager.createNewDownloadConnection(message); manager.createNewDownloadConnection(message);
} else if (notify) { } else if (notify) {
if (query == null) { if (query != null && query.isCatchup()) {
mXmppConnectionService.getNotificationService().push(message);
} else if (query.isCatchup()) { // mam catchup
mXmppConnectionService.getNotificationService().pushFromBacklog(message); mXmppConnectionService.getNotificationService().pushFromBacklog(message);
} else if (account.getXmppConnection().isWaitingForSmCatchup()) {
account.getXmppConnection().incrementSmCatchupMessageCounter();
mXmppConnectionService.getNotificationService().pushFromBacklog(message);
} else {
mXmppConnectionService.getNotificationService().push(message);
} }
} }
} else if (!packet.hasChild("body")){ //no body } else if (!packet.hasChild("body")){ //no body

View File

@ -120,6 +120,8 @@ public class XmppConnection implements Runnable {
private long lastDiscoStarted = 0; private long lastDiscoStarted = 0;
private AtomicInteger mPendingServiceDiscoveries = new AtomicInteger(0); private AtomicInteger mPendingServiceDiscoveries = new AtomicInteger(0);
private AtomicBoolean mWaitForDisco = new AtomicBoolean(true); private AtomicBoolean mWaitForDisco = new AtomicBoolean(true);
private AtomicBoolean mWaitingForSmCatchup = new AtomicBoolean(false);
private AtomicInteger mSmCatchupMessageCounter = new AtomicInteger(0);
private boolean mInteractive = false; private boolean mInteractive = false;
private int attempt = 0; private int attempt = 0;
private final Hashtable<String, Pair<IqPacket, OnIqPacketReceived>> packetCallbacks = new Hashtable<>(); private final Hashtable<String, Pair<IqPacket, OnIqPacketReceived>> packetCallbacks = new Hashtable<>();
@ -239,9 +241,18 @@ public class XmppConnection implements Runnable {
this.lastConnect = SystemClock.elapsedRealtime(); this.lastConnect = SystemClock.elapsedRealtime();
this.lastPingSent = SystemClock.elapsedRealtime(); this.lastPingSent = SystemClock.elapsedRealtime();
this.lastDiscoStarted = Long.MAX_VALUE; this.lastDiscoStarted = Long.MAX_VALUE;
this.mWaitingForSmCatchup.set(false);
this.changeStatus(Account.State.CONNECTING); this.changeStatus(Account.State.CONNECTING);
} }
public boolean isWaitingForSmCatchup() {
return mWaitingForSmCatchup.get();
}
public void incrementSmCatchupMessageCounter() {
this.mSmCatchupMessageCounter.incrementAndGet();
}
protected void connect() { protected void connect() {
if (mXmppConnectionService.areMessagesInitialized()) { if (mXmppConnectionService.areMessagesInitialized()) {
mXmppConnectionService.resetSendingToWaiting(account); mXmppConnectionService.resetSendingToWaiting(account);
@ -613,6 +624,13 @@ public class XmppConnection implements Runnable {
final AckPacket ack = new AckPacket(this.stanzasReceived, smVersion); final AckPacket ack = new AckPacket(this.stanzasReceived, smVersion);
tagWriter.writeStanzaAsync(ack); tagWriter.writeStanzaAsync(ack);
} else if (nextTag.isStart("a")) { } 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); final Element ack = tagReader.readElement(nextTag);
lastPacketReceived = SystemClock.elapsedRealtime(); lastPacketReceived = SystemClock.elapsedRealtime();
try { try {
@ -839,7 +857,10 @@ public class XmppConnection implements Runnable {
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": resuming after stanza #"+stanzasReceived); Log.d(Config.LOGTAG,account.getJid().toBareJid()+": resuming after stanza #"+stanzasReceived);
} }
final ResumePacket resume = new ResumePacket(this.streamId, stanzasReceived, smVersion); final ResumePacket resume = new ResumePacket(this.streamId, stanzasReceived, smVersion);
this.mSmCatchupMessageCounter.set(0);
this.mWaitingForSmCatchup.set(true);
this.tagWriter.writeStanzaAsync(resume); this.tagWriter.writeStanzaAsync(resume);
this.tagWriter.writeStanzaAsync(new RequestPacket(smVersion));
} else if (needsBinding) { } else if (needsBinding) {
if (this.streamFeatures.hasChild("bind")) { if (this.streamFeatures.hasChild("bind")) {
sendBindRequest(); sendBindRequest();