diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractConnectionListener.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractConnectionListener.java index bc8b27b8e..074bbe573 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractConnectionListener.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractConnectionListener.java @@ -31,7 +31,7 @@ public class AbstractConnectionListener implements ConnectionListener { } @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { // do nothing } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java index 677994b65..633ebdfb3 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java @@ -500,7 +500,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { if (config.isDebuggerEnabled() && debugger != null) { debugger.userHasLogged(user); } - callConnectionAuthenticatedListener(); + callConnectionAuthenticatedListener(resumed); // Set presence to online. It is important that this is done after // callConnectionAuthenticatedListener(), as this call will also @@ -1040,9 +1040,15 @@ public abstract class AbstractXMPPConnection implements XMPPConnection { } } - protected void callConnectionAuthenticatedListener() { + protected void callConnectionAuthenticatedListener(boolean resumed) { for (ConnectionListener listener : getConnectionListeners()) { - listener.authenticated(this); + try { + listener.authenticated(this, resumed); + } catch (Exception e) { + // Catch and print any exception so we can recover + // from a faulty listener and finish the shutdown process + LOGGER.log(Level.SEVERE, "Exception in authenticated listener", e); + } } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionListener.java b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionListener.java index 7df1827be..08da787ff 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/ConnectionListener.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/ConnectionListener.java @@ -38,7 +38,7 @@ public interface ConnectionListener { * TODO * @param connection */ - public void authenticated(XMPPConnection connection); + public void authenticated(XMPPConnection connection, boolean resumed); /** * Notification that the connection was closed normally or that the reconnection diff --git a/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java b/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java index b9273a66f..2c7c7e982 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/ReconnectionManager.java @@ -264,7 +264,7 @@ public class ReconnectionManager { } @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { done = false; } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/Roster.java b/smack-core/src/main/java/org/jivesoftware/smack/Roster.java index f7049957c..ac1861442 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/Roster.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/Roster.java @@ -138,7 +138,7 @@ public class Roster { connection.addConnectionListener(new AbstractConnectionClosedListener() { @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { // Anonymous users can't have a roster, but it is possible that a Roster instance is // retrieved if getRoster() is called *before* connect(). So we have to check here // again if it's an anonymous connection. @@ -146,6 +146,10 @@ public class Roster { return; if (!connection.isRosterLoadedAtLogin()) return; + // We are done here if the connection was resumed + if (resumed) { + return; + } try { Roster.this.reload(); } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/debugger/AbstractDebugger.java b/smack-core/src/main/java/org/jivesoftware/smack/debugger/AbstractDebugger.java index 4fce13d04..926fb7547 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/debugger/AbstractDebugger.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/debugger/AbstractDebugger.java @@ -80,8 +80,12 @@ public abstract class AbstractDebugger implements SmackDebugger { log("XMPPConnection connected (" + connection.getConnectionCounter() + ")"); } - public void authenticated(XMPPConnection connection) { - log("XMPPConnection authenticated (" + connection.getConnectionCounter() + ")"); + public void authenticated(XMPPConnection connection, boolean resumed) { + String logString = "XMPPConnection authenticated (" + connection.getConnectionCounter() + ")"; + if (resumed) { + logString += " and resumed"; + } + log(logString); } public void connectionClosed() { log( diff --git a/smack-debug-slf4j/src/main/java/org/jivesoftware/smackx/debugger/slf4j/SLF4JLoggingConnectionListener.java b/smack-debug-slf4j/src/main/java/org/jivesoftware/smackx/debugger/slf4j/SLF4JLoggingConnectionListener.java index 3a3309cef..ec25f3639 100644 --- a/smack-debug-slf4j/src/main/java/org/jivesoftware/smackx/debugger/slf4j/SLF4JLoggingConnectionListener.java +++ b/smack-debug-slf4j/src/main/java/org/jivesoftware/smackx/debugger/slf4j/SLF4JLoggingConnectionListener.java @@ -36,7 +36,7 @@ class SLF4JLoggingConnectionListener implements ConnectionListener { } @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { logger.debug("({}) Connection authenticated as {}", connection.hashCode(), connection.getUser()); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java index cf495478d..2c86e2440 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/caps/EntityCapsManager.java @@ -16,7 +16,7 @@ */ package org.jivesoftware.smackx.caps; -import org.jivesoftware.smack.AbstractConnectionClosedListener; +import org.jivesoftware.smack.AbstractConnectionListener; import org.jivesoftware.smack.SmackException.NoResponseException; import org.jivesoftware.smack.SmackException.NotConnectedException; import org.jivesoftware.smack.XMPPConnection; @@ -274,7 +274,7 @@ public class EntityCapsManager extends Manager { this.sdm = ServiceDiscoveryManager.getInstanceFor(connection); instances.put(connection, this); - connection.addConnectionListener(new AbstractConnectionClosedListener() { + connection.addConnectionListener(new AbstractConnectionListener() { @Override public void connected(XMPPConnection connection) { // It's not clear when a server would report the caps stream @@ -283,17 +283,17 @@ public class EntityCapsManager extends Manager { processCapsStreamFeatureIfAvailable(connection); } @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { // It's not clear when a server would report the caps stream // feature, so we try to process it after we are connected and // once after we are authenticated. processCapsStreamFeatureIfAvailable(connection); - } - @Override - public void connectionTerminated() { - presenceSend = false; - } + // Reset presenceSend when the connection was not resumed + if (!resumed) { + presenceSend = false; + } + } private void processCapsStreamFeatureIfAvailable(XMPPConnection connection) { CapsExtension capsExtension = connection.getFeature( CapsExtension.ELEMENT, CapsExtension.NAMESPACE); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java index 1334c50f7..95d8308a8 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/ping/PingManager.java @@ -137,7 +137,7 @@ public class PingManager extends Manager { }, PING_PACKET_FILTER); connection.addConnectionListener(new AbstractConnectionClosedListener() { @Override - public void authenticated(XMPPConnection connection) { + public void authenticated(XMPPConnection connection, boolean resumed) { maybeSchedulePingServerTask(); } @Override diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java index 57631a824..2c529743f 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/privacy/PrivacyListManager.java @@ -186,7 +186,11 @@ public class PrivacyListManager extends Manager { }, PRIVACY_RESULT); connection.addConnectionListener(new AbstractConnectionListener() { @Override - public void reconnectionSuccessful() { + public void authenticated(XMPPConnection connection, boolean resumed) { + // No need to reset the cache if the connection got resumed. + if (resumed) { + return; + } cachedActiveListName = cachedDefaultListName = null; } });