don't resume old session when changing resource

iNPUTmice created

Change summary

src/main/java/eu/siacs/conversations/entities/Account.java               | 14 
src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java    |  7 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  5 
src/main/java/eu/siacs/conversations/ui/SettingsActivity.java            | 12 
src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java            |  4 
5 files changed, 35 insertions(+), 7 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Account.java 🔗

@@ -229,11 +229,17 @@ public class Account extends AbstractEntity {
 		return jid.getResourcepart();
 	}
 
-	public void setResource(final String resource) {
-		try {
-			jid = Jid.fromParts(jid.getLocalpart(), jid.getDomainpart(), resource);
-		} catch (final InvalidJidException ignored) {
+	public boolean setResource(final String resource) {
+		final String oldResource = jid.getResourcepart();
+		if (oldResource == null || !oldResource.equals(resource)) {
+			try {
+				jid = Jid.fromParts(jid.getLocalpart(), jid.getDomainpart(), resource);
+				return true;
+			} catch (final InvalidJidException ignored) {
+				return true;
+			}
 		}
+		return false;
 	}
 
 	public Jid getJid() {

src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java 🔗

@@ -54,4 +54,11 @@ public class PresenceGenerator extends AbstractGenerator {
 		}
 		return packet;
 	}
+
+	public PresencePacket sendOfflinePresence(Account account) {
+		PresencePacket packet = new PresencePacket();
+		packet.setFrom(account.getJid());
+		packet.setAttribute("type","unavailable");
+		return packet;
+	}
 }

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -1701,6 +1701,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 						}
 					}
 				}
+				sendOfflinePresence(account);
 			}
 			account.getXmppConnection().disconnect(force);
 		}
@@ -2261,6 +2262,10 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 		sendPresencePacket(account, mPresenceGenerator.sendPresence(account));
 	}
 
+	public void sendOfflinePresence(final Account account) {
+		sendPresencePacket(account, mPresenceGenerator.sendOfflinePresence(account));
+	}
+
 	public MessageGenerator getMessageGenerator() {
 		return this.mMessageGenerator;
 	}

src/main/java/eu/siacs/conversations/ui/SettingsActivity.java 🔗

@@ -5,6 +5,7 @@ import java.util.Arrays;
 import java.util.Locale;
 
 import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.xmpp.XmppConnection;
 
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
@@ -63,9 +64,14 @@ public class SettingsActivity extends XmppActivity implements
 					.toLowerCase(Locale.US);
 			if (xmppConnectionServiceBound) {
 				for (Account account : xmppConnectionService.getAccounts()) {
-                    account.setResource(resource);
-                    if (!account.isOptionSet(Account.OPTION_DISABLED)) {
-						xmppConnectionService.reconnectAccountInBackground(account);
+					if (account.setResource(resource)) {
+						if (!account.isOptionSet(Account.OPTION_DISABLED)) {
+							XmppConnection connection = account.getXmppConnection();
+							if (connection != null) {
+								connection.resetStreamId();
+							}
+							xmppConnectionService.reconnectAccountInBackground(account);
+						}
 					}
 				}
 			}

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

@@ -981,6 +981,10 @@ public class XmppConnection implements Runnable {
 		}
 	}
 
+	public void resetStreamId() {
+		this.streamId = null;
+	}
+
 	public List<String> findDiscoItemsByFeature(final String feature) {
 		final List<String> items = new ArrayList<>();
 		for (final Entry<String, List<String>> cursor : disco.entrySet()) {