invoke statusChanged callback after syncronization

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java | 36 ++--
1 file changed, 20 insertions(+), 16 deletions(-)

Detailed changes

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

@@ -218,26 +218,30 @@ public class XmppConnection implements Runnable {
 		mXmppConnectionService = service;
 	}
 
-	protected synchronized void changeStatus(final Account.State nextStatus) {
-		if (Thread.currentThread().isInterrupted()) {
-			Log.d(Config.LOGTAG,account.getJid().toBareJid()+": not changing status to "+nextStatus+" because thread was interrupted");
-			return;
-		}
-		if (account.getStatus() != nextStatus) {
-			if ((nextStatus == Account.State.OFFLINE)
-					&& (account.getStatus() != Account.State.CONNECTING)
-					&& (account.getStatus() != Account.State.ONLINE)
-					&& (account.getStatus() != Account.State.DISABLED)) {
+	protected void changeStatus(final Account.State nextStatus) {
+		synchronized (this) {
+			if (Thread.currentThread().isInterrupted()) {
+				Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": not changing status to " + nextStatus + " because thread was interrupted");
 				return;
-					}
-			if (nextStatus == Account.State.ONLINE) {
-				this.attempt = 0;
 			}
-			account.setStatus(nextStatus);
-			if (statusListener != null) {
-				statusListener.onStatusChanged(account);
+			if (account.getStatus() != nextStatus) {
+				if ((nextStatus == Account.State.OFFLINE)
+						&& (account.getStatus() != Account.State.CONNECTING)
+						&& (account.getStatus() != Account.State.ONLINE)
+						&& (account.getStatus() != Account.State.DISABLED)) {
+					return;
+				}
+				if (nextStatus == Account.State.ONLINE) {
+					this.attempt = 0;
+				}
+				account.setStatus(nextStatus);
+			} else {
+				return;
 			}
 		}
+		if (statusListener != null) {
+			statusListener.onStatusChanged(account);
+		}
 	}
 
 	public void prepareNewConnection() {