diff options
5 files changed, 71 insertions, 56 deletions
diff --git a/src/eu/siacs/conversations/entities/AbstractEntity.java b/src/eu/siacs/conversations/entities/AbstractEntity.java index 0297fa66..4891723e 100644 --- a/src/eu/siacs/conversations/entities/AbstractEntity.java +++ b/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"; diff --git a/src/eu/siacs/conversations/entities/Account.java b/src/eu/siacs/conversations/entities/Account.java index ac62cf7b..0910516c 100644 --- a/src/eu/siacs/conversations/entities/Account.java +++ b/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"; } diff --git a/src/eu/siacs/conversations/entities/Conversation.java b/src/eu/siacs/conversations/entities/Conversation.java index 70752adc..4e8c1834 100644 --- a/src/eu/siacs/conversations/entities/Conversation.java +++ b/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; diff --git a/src/eu/siacs/conversations/entities/Message.java b/src/eu/siacs/conversations/entities/Message.java index 8e669c65..49c5ce58 100644 --- a/src/eu/siacs/conversations/entities/Message.java +++ b/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"; diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java index bbc9861a..339438da 100644 --- a/src/eu/siacs/conversations/services/XmppConnectionService.java +++ b/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, |