pending leaves and joins for muc

iNPUTmice created

Change summary

src/eu/siacs/conversations/entities/AbstractEntity.java        |   5 
src/eu/siacs/conversations/entities/Account.java               |   6 
src/eu/siacs/conversations/entities/Conversation.java          |   3 
src/eu/siacs/conversations/entities/Message.java               |   2 
src/eu/siacs/conversations/services/XmppConnectionService.java | 111 ++-
5 files changed, 71 insertions(+), 56 deletions(-)

Detailed changes

src/eu/siacs/conversations/entities/AbstractEntity.java 🔗

@@ -1,12 +1,9 @@
 package eu.siacs.conversations.entities;
 
-import java.io.Serializable;
-
 import android.content.ContentValues;
 
-public abstract class AbstractEntity implements Serializable {
+public abstract class AbstractEntity {
 
-	private static final long serialVersionUID = -1895605706690653719L;
 	
 	public static final String UUID = "uuid";
 	

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

@@ -4,6 +4,7 @@ import java.security.interfaces.DSAPublicKey;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import net.java.otr4j.crypto.OtrCryptoEngineImpl;
 import net.java.otr4j.crypto.OtrCryptoException;
@@ -18,8 +19,6 @@ import android.content.Context;
 import android.database.Cursor;
 
 public class Account  extends AbstractEntity{
-
-	private static final long serialVersionUID = 6174825093869578035L;
 	
 	public static final String TABLENAME = "accounts";
 	
@@ -72,6 +71,9 @@ public class Account  extends AbstractEntity{
 
 	private List<Bookmark> bookmarks = new ArrayList<Bookmark>();
 	
+	public List<Conversation> pendingConferenceJoins = new CopyOnWriteArrayList<Conversation>();
+	public List<Conversation> pendingConferenceLeaves = new CopyOnWriteArrayList<Conversation>();
+	
 	public Account() {
 		this.uuid = "0";
 	}

src/eu/siacs/conversations/entities/Conversation.java 🔗

@@ -16,9 +16,6 @@ import android.database.Cursor;
 import android.net.Uri;
 
 public class Conversation extends AbstractEntity {
-
-	private static final long serialVersionUID = -6727528868973996739L;
-
 	public static final String TABLENAME = "conversations";
 
 	public static final int STATUS_AVAILABLE = 0;

src/eu/siacs/conversations/entities/Message.java 🔗

@@ -7,8 +7,6 @@ import android.content.Context;
 import android.database.Cursor;
 
 public class Message extends AbstractEntity {
-
-	private static final long serialVersionUID = 7222081895167103025L;
 	
 	public static final String TABLENAME = "messages";
 

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

@@ -148,6 +148,12 @@ public class XmppConnectionService extends Service {
 				mOnAccountUpdate.onAccountUpdate();;
 			}
 			if (account.getStatus() == Account.STATUS_ONLINE) {
+				for(Conversation conversation : account.pendingConferenceLeaves) {
+					leaveMuc(conversation);
+				}
+				for(Conversation conversation : account.pendingConferenceJoins) {
+					joinMuc(conversation);
+				}
 				mJingleConnectionManager.cancelInTransmission();
 				List<Conversation> conversations = getConversations();
 				for (int i = 0; i < conversations.size(); ++i) {
@@ -196,6 +202,21 @@ public class XmppConnectionService extends Service {
 	private PendingIntent pendingPingIntent = null;
 	private WakeLock wakeLock;
 	private PowerManager pm;
+	private OnBindListener mOnBindListener = new OnBindListener() {
+
+			@Override
+			public void onBind(final Account account) {
+				account.getRoster().clearPresences();
+				account.clearPresences(); // self presences
+				account.pendingConferenceJoins.clear();
+				account.pendingConferenceLeaves.clear();
+				fetchRosterFromServer(account);
+				fetchBookmarks(account);
+				sendPresencePacket(account, mPresenceGenerator.sendPresence(account));
+				connectMultiModeConversations(account);
+				updateConversationUi();
+			}
+		};
 
 	public PgpEngine getPgpEngine() {
 		if (pgpServiceConnection.isBound()) {
@@ -465,19 +486,7 @@ public class XmppConnectionService extends Service {
 						}
 					}
 				});
-		connection.setOnBindListener(new OnBindListener() {
-
-			@Override
-			public void onBind(final Account account) {
-				account.getRoster().clearPresences();
-				account.clearPresences(); // self presences
-				fetchRosterFromServer(account);
-				fetchBookmarks(account);
-				sendPresencePacket(account, mPresenceGenerator.sendPresence(account));
-				connectMultiModeConversations(account);
-				updateConversationUi();
-			}
-		});
+		connection.setOnBindListener(this.mOnBindListener);
 		return connection;
 	}
 
@@ -682,7 +691,6 @@ public class XmppConnectionService extends Service {
 				if (storage!=null) {
 					for(Element item : storage.getChildren()) {
 						if (item.getName().equals("conference")) {
-							Log.d(LOGTAG,item.toString());
 							Bookmark bookmark = Bookmark.parse(item,account);
 							bookmarks.add(bookmark);
 							Conversation conversation = findMuc(bookmark);
@@ -939,30 +947,36 @@ public class XmppConnectionService extends Service {
 	}
 
 	public void joinMuc(Conversation conversation) {
-		Log.d(LOGTAG,"joining conversation "+conversation.getContactJid());
 		Account account = conversation.getAccount();
-		String nick = conversation.getMucOptions().getProposedNick();
-		conversation.getMucOptions().setJoinNick(nick);
-		PresencePacket packet = new PresencePacket();
-		packet.setAttribute("to",conversation.getMucOptions().getJoinJid());
-		Element x = new Element("x");
-		x.setAttribute("xmlns", "http://jabber.org/protocol/muc");
-		String sig = account.getPgpSignature();
-		if (sig != null) {
-			packet.addChild("status").setContent("online");
-			packet.addChild("x", "jabber:x:signed").setContent(sig);
-		}
-		if (conversation.getMessages().size() != 0) {
-			final SimpleDateFormat mDateFormat = new SimpleDateFormat(
-					"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
-			mDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
-			Date date = new Date(
-					conversation.getLatestMessage().getTimeSent() + 1000);
-			x.addChild("history").setAttribute("since",
-					mDateFormat.format(date));
+		account.pendingConferenceJoins.remove(conversation);
+		account.pendingConferenceLeaves.remove(conversation);
+		if (account.getStatus() == Account.STATUS_ONLINE) {
+			Log.d(LOGTAG,"joining conversation "+conversation.getContactJid());
+			String nick = conversation.getMucOptions().getProposedNick();
+			conversation.getMucOptions().setJoinNick(nick);
+			PresencePacket packet = new PresencePacket();
+			packet.setAttribute("to",conversation.getMucOptions().getJoinJid());
+			Element x = new Element("x");
+			x.setAttribute("xmlns", "http://jabber.org/protocol/muc");
+			String sig = account.getPgpSignature();
+			if (sig != null) {
+				packet.addChild("status").setContent("online");
+				packet.addChild("x", "jabber:x:signed").setContent(sig);
+			}
+			if (conversation.getMessages().size() != 0) {
+				final SimpleDateFormat mDateFormat = new SimpleDateFormat(
+						"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
+				mDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+				Date date = new Date(
+						conversation.getLatestMessage().getTimeSent() + 1000);
+				x.addChild("history").setAttribute("since",
+						mDateFormat.format(date));
+			}
+			packet.addChild(x);
+			sendPresencePacket(account, packet);
+		} else {
+			account.pendingConferenceJoins.add(conversation);
 		}
-		packet.addChild(x);
-		sendPresencePacket(account, packet);
 	}
 
 	private OnRenameListener renameListener = null;
@@ -1020,14 +1034,21 @@ public class XmppConnectionService extends Service {
 	}
 
 	public void leaveMuc(Conversation conversation) {
-		PresencePacket packet = new PresencePacket();
-		packet.setAttribute("to", conversation.getMucOptions().getJoinJid());
-		packet.setAttribute("from", conversation.getAccount().getFullJid());
-		packet.setAttribute("type", "unavailable");
-		sendPresencePacket(conversation.getAccount(),packet);
-		conversation.getMucOptions().setOffline();
-		conversation.deregisterWithBookmark();
-		Log.d(LOGTAG,conversation.getAccount().getJid()+" leaving muc "+conversation.getContactJid());
+		Account account = conversation.getAccount();
+		account.pendingConferenceJoins.remove(conversation);
+		account.pendingConferenceLeaves.remove(conversation);
+		if (account.getStatus() == Account.STATUS_ONLINE) {
+			PresencePacket packet = new PresencePacket();
+			packet.setAttribute("to", conversation.getMucOptions().getJoinJid());
+			packet.setAttribute("from", conversation.getAccount().getFullJid());
+			packet.setAttribute("type", "unavailable");
+			sendPresencePacket(conversation.getAccount(),packet);
+			conversation.getMucOptions().setOffline();
+			conversation.deregisterWithBookmark();
+			Log.d(LOGTAG,conversation.getAccount().getJid()+" leaving muc "+conversation.getContactJid());
+		} else {
+			account.pendingConferenceLeaves.add(conversation);
+		}
 	}
 
 	public void disconnect(Account account, boolean force) {
@@ -1210,7 +1231,7 @@ public class XmppConnectionService extends Service {
 		x.addChild(invite);
 		packet.addChild(x);
 		sendMessagePacket(account,packet);
-
+		Log.d(LOGTAG,packet.toString());
 	}
 
 	public boolean markMessage(Account account, String recipient, String uuid,