diff options
6 files changed, 105 insertions, 81 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, diff --git a/src/eu/siacs/conversations/ui/ConversationFragment.java b/src/eu/siacs/conversations/ui/ConversationFragment.java index e33e2cf3..202bab2e 100644 --- a/src/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/eu/siacs/conversations/ui/ConversationFragment.java @@ -8,6 +8,7 @@ import java.util.Set; import net.java.otr4j.session.SessionStatus; import eu.siacs.conversations.R; import eu.siacs.conversations.crypto.PgpEngine; +import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Message; @@ -61,7 +62,7 @@ public class ConversationFragment extends Fragment { protected ArrayAdapter<Message> messageListAdapter; protected Contact contact; protected BitmapCache mBitmapCache = new BitmapCache(); - + protected int mPrimaryTextColor; protected int mSecondaryTextColor; @@ -113,20 +114,21 @@ public class ConversationFragment extends Fragment { } } }; - + private OnClickListener clickToMuc = new OnClickListener() { @Override public void onClick(View v) { - Intent intent = new Intent(getActivity(), ConferenceDetailsActivity.class); + Intent intent = new Intent(getActivity(), + ConferenceDetailsActivity.class); intent.setAction(ConferenceDetailsActivity.ACTION_VIEW_MUC); intent.putExtra("uuid", conversation.getUuid()); startActivity(intent); } }; - + private OnClickListener leaveMuc = new OnClickListener() { - + @Override public void onClick(View v) { activity.endConversation(conversation); @@ -187,12 +189,12 @@ public class ConversationFragment extends Fragment { mPrimaryTextColor = getResources().getColor(R.color.primarytext); mSecondaryTextColor = getResources().getColor(R.color.secondarytext); - + final View view = inflater.inflate(R.layout.fragment_conversation, container, false); chatMsg = (EditText) view.findViewById(R.id.textinput); chatMsg.setOnClickListener(new OnClickListener() { - + @Override public void onClick(View v) { if (activity.getSlidingPaneLayout().isSlideable()) { @@ -672,7 +674,8 @@ public class ConversationFragment extends Fragment { @Override public void userInputRequried(PendingIntent pi, Message message) { askForPassphraseIntent = pi.getIntentSender(); - showSnackbar(R.string.openpgp_messages_found,R.string.decrypt,clickToDecryptListener); + showSnackbar(R.string.openpgp_messages_found, + R.string.decrypt, clickToDecryptListener); } @Override @@ -724,11 +727,14 @@ public class ConversationFragment extends Fragment { makeFingerprintWarning(conversation.getLatestEncryption()); } } else { - if (!conversation.getMucOptions().online()) { + if (!conversation.getMucOptions().online() + && conversation.getAccount().getStatus() == Account.STATUS_ONLINE) { if (conversation.getMucOptions().getError() == MucOptions.ERROR_NICK_IN_USE) { - showSnackbar(R.string.nick_in_use, R.string.edit,clickToMuc); + showSnackbar(R.string.nick_in_use, R.string.edit, + clickToMuc); } else if (conversation.getMucOptions().getError() == MucOptions.ERROR_ROOM_NOT_FOUND) { - showSnackbar(R.string.conference_not_found,R.string.leave,leaveMuc); + showSnackbar(R.string.conference_not_found, + R.string.leave, leaveMuc); } } } @@ -783,28 +789,31 @@ public class ConversationFragment extends Fragment { && (conversation.hasValidOtrSession() && (conversation.getOtrSession().getSessionStatus() == SessionStatus.ENCRYPTED) && (!knownFingerprints .contains(conversation.getOtrFingerprint())))) { - showSnackbar(R.string.unknown_otr_fingerprint, R.string.verify, new OnClickListener() { + showSnackbar(R.string.unknown_otr_fingerprint, R.string.verify, + new OnClickListener() { - @Override - public void onClick(View v) { - if (conversation.getOtrFingerprint() != null) { - AlertDialog dialog = UIHelper.getVerifyFingerprintDialog( - (ConversationActivity) getActivity(), conversation, - snackbar); - dialog.show(); - } - } - }); + @Override + public void onClick(View v) { + if (conversation.getOtrFingerprint() != null) { + AlertDialog dialog = UIHelper + .getVerifyFingerprintDialog( + (ConversationActivity) getActivity(), + conversation, snackbar); + dialog.show(); + } + } + }); } } - - protected void showSnackbar(int message, int action, OnClickListener clickListener) { + + protected void showSnackbar(int message, int action, + OnClickListener clickListener) { snackbar.setVisibility(View.VISIBLE); snackbarMessage.setText(message); snackbarAction.setText(action); snackbarAction.setOnClickListener(clickListener); } - + protected void hideSnackbar() { snackbar.setVisibility(View.GONE); } |