Search in sources :

Example 1 with MucOptions

use of eu.siacs.conversations.entities.MucOptions in project Conversations by siacs.

the class XmppConnectionService method renameInMuc.

public boolean renameInMuc(final Conversation conversation, final String nick, final UiCallback<Conversation> callback) {
    final MucOptions options = conversation.getMucOptions();
    final Jid joinJid = options.createJoinJid(nick);
    if (joinJid == null) {
        return false;
    }
    if (options.online()) {
        Account account = conversation.getAccount();
        options.setOnRenameListener(new OnRenameListener() {

            @Override
            public void onSuccess() {
                callback.success(conversation);
            }

            @Override
            public void onFailure() {
                callback.error(R.string.nick_in_use, conversation);
            }
        });
        final PresencePacket packet = mPresenceGenerator.selfPresence(account, Presence.Status.ONLINE, options.nonanonymous());
        packet.setTo(joinJid);
        sendPresencePacket(account, packet);
    } else {
        conversation.setContactJid(joinJid);
        databaseBackend.updateConversation(conversation);
        if (conversation.getAccount().getStatus() == Account.State.ONLINE) {
            Bookmark bookmark = conversation.getBookmark();
            if (bookmark != null) {
                bookmark.setNick(nick);
                createBookmark(bookmark.getAccount(), bookmark);
            }
            joinMuc(conversation);
        }
    }
    return true;
}
Also used : Account(eu.siacs.conversations.entities.Account) OnRenameListener(eu.siacs.conversations.entities.MucOptions.OnRenameListener) MucOptions(eu.siacs.conversations.entities.MucOptions) Jid(eu.siacs.conversations.xmpp.Jid) Bookmark(eu.siacs.conversations.entities.Bookmark) PresencePacket(eu.siacs.conversations.xmpp.stanzas.PresencePacket)

Example 2 with MucOptions

use of eu.siacs.conversations.entities.MucOptions in project Conversations by siacs.

the class XmppConnectionService method fetchConferenceConfiguration.

public void fetchConferenceConfiguration(final Conversation conversation, final OnConferenceConfigurationFetched callback) {
    IqPacket request = mIqGenerator.queryDiscoInfo(conversation.getJid().asBareJid());
    sendIqPacket(conversation.getAccount(), request, new OnIqPacketReceived() {

        @Override
        public void onIqPacketReceived(Account account, IqPacket packet) {
            if (packet.getType() == IqPacket.TYPE.RESULT) {
                final MucOptions mucOptions = conversation.getMucOptions();
                final Bookmark bookmark = conversation.getBookmark();
                final boolean sameBefore = StringUtils.equals(bookmark == null ? null : bookmark.getBookmarkName(), mucOptions.getName());
                if (mucOptions.updateConfiguration(new ServiceDiscoveryResult(packet))) {
                    Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": muc configuration changed for " + conversation.getJid().asBareJid());
                    updateConversation(conversation);
                }
                if (bookmark != null && (sameBefore || bookmark.getBookmarkName() == null)) {
                    if (bookmark.setBookmarkName(StringUtils.nullOnEmpty(mucOptions.getName()))) {
                        createBookmark(account, bookmark);
                    }
                }
                if (callback != null) {
                    callback.onConferenceConfigurationFetched(conversation);
                }
                updateConversationUi();
            } else if (packet.getType() == IqPacket.TYPE.TIMEOUT) {
                Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received timeout waiting for conference configuration fetch");
            } else {
                if (callback != null) {
                    callback.onFetchFailed(conversation, packet.getErrorCondition());
                }
            }
        }
    });
}
Also used : Account(eu.siacs.conversations.entities.Account) MucOptions(eu.siacs.conversations.entities.MucOptions) OnIqPacketReceived(eu.siacs.conversations.xmpp.OnIqPacketReceived) Bookmark(eu.siacs.conversations.entities.Bookmark) ServiceDiscoveryResult(eu.siacs.conversations.entities.ServiceDiscoveryResult) IqPacket(eu.siacs.conversations.xmpp.stanzas.IqPacket)

Example 3 with MucOptions

use of eu.siacs.conversations.entities.MucOptions in project Conversations by siacs.

the class XmppConnectionService method notifyAccountAvatarHasChanged.

public void notifyAccountAvatarHasChanged(final Account account) {
    final XmppConnection connection = account.getXmppConnection();
    if (connection != null && connection.getFeatures().bookmarksConversion()) {
        Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": avatar changed. resending presence to online group chats");
        for (Conversation conversation : conversations) {
            if (conversation.getAccount() == account && conversation.getMode() == Conversational.MODE_MULTI) {
                final MucOptions mucOptions = conversation.getMucOptions();
                if (mucOptions.online()) {
                    PresencePacket packet = mPresenceGenerator.selfPresence(account, Presence.Status.ONLINE, mucOptions.nonanonymous());
                    packet.setTo(mucOptions.getSelf().getFullJid());
                    connection.sendPresencePacket(packet);
                }
            }
        }
    }
}
Also used : XmppConnection(eu.siacs.conversations.xmpp.XmppConnection) MucOptions(eu.siacs.conversations.entities.MucOptions) Conversation(eu.siacs.conversations.entities.Conversation) PresencePacket(eu.siacs.conversations.xmpp.stanzas.PresencePacket)

Example 4 with MucOptions

use of eu.siacs.conversations.entities.MucOptions in project Conversations by siacs.

the class XmppConnectionService method processModifiedBookmark.

private void processModifiedBookmark(Bookmark bookmark, final boolean pep, final boolean synchronizeWithBookmarks) {
    final Account account = bookmark.getAccount();
    Conversation conversation = find(bookmark);
    if (conversation != null) {
        if (conversation.getMode() != Conversation.MODE_MULTI) {
            return;
        }
        bookmark.setConversation(conversation);
        if (pep && synchronizeWithBookmarks && !bookmark.autojoin()) {
            Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": archiving conference (" + conversation.getJid() + ") after receiving pep");
            archiveConversation(conversation, false);
        } else {
            final MucOptions mucOptions = conversation.getMucOptions();
            if (mucOptions.getError() == MucOptions.Error.NICK_IN_USE) {
                final String current = mucOptions.getActualNick();
                final String proposed = mucOptions.getProposedNick();
                if (current != null && !current.equals(proposed)) {
                    Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": proposed nick changed after bookmark push " + current + "->" + proposed);
                    joinMuc(conversation);
                }
            }
        }
    } else if (synchronizeWithBookmarks && bookmark.autojoin()) {
        conversation = findOrCreateConversation(account, bookmark.getFullJid(), true, true, false);
        bookmark.setConversation(conversation);
    }
}
Also used : Account(eu.siacs.conversations.entities.Account) MucOptions(eu.siacs.conversations.entities.MucOptions) Conversation(eu.siacs.conversations.entities.Conversation)

Example 5 with MucOptions

use of eu.siacs.conversations.entities.MucOptions in project Conversations by siacs.

the class XmppConnectionService method joinMuc.

private void joinMuc(Conversation conversation, final OnConferenceJoined onConferenceJoined, final boolean followedInvite) {
    final Account account = conversation.getAccount();
    synchronized (account.pendingConferenceJoins) {
        account.pendingConferenceJoins.remove(conversation);
    }
    synchronized (account.pendingConferenceLeaves) {
        account.pendingConferenceLeaves.remove(conversation);
    }
    if (account.getStatus() == Account.State.ONLINE) {
        synchronized (account.inProgressConferenceJoins) {
            account.inProgressConferenceJoins.add(conversation);
        }
        if (Config.MUC_LEAVE_BEFORE_JOIN) {
            sendPresencePacket(account, mPresenceGenerator.leave(conversation.getMucOptions()));
        }
        conversation.resetMucOptions();
        if (onConferenceJoined != null) {
            conversation.getMucOptions().flagNoAutoPushConfiguration();
        }
        conversation.setHasMessagesLeftOnServer(false);
        fetchConferenceConfiguration(conversation, new OnConferenceConfigurationFetched() {

            private void join(Conversation conversation) {
                Account account = conversation.getAccount();
                final MucOptions mucOptions = conversation.getMucOptions();
                if (mucOptions.nonanonymous() && !mucOptions.membersOnly() && !conversation.getBooleanAttribute("accept_non_anonymous", false)) {
                    synchronized (account.inProgressConferenceJoins) {
                        account.inProgressConferenceJoins.remove(conversation);
                    }
                    mucOptions.setError(MucOptions.Error.NON_ANONYMOUS);
                    updateConversationUi();
                    if (onConferenceJoined != null) {
                        onConferenceJoined.onConferenceJoined(conversation);
                    }
                    return;
                }
                final Jid joinJid = mucOptions.getSelf().getFullJid();
                Log.d(Config.LOGTAG, account.getJid().asBareJid().toString() + ": joining conversation " + joinJid.toString());
                PresencePacket packet = mPresenceGenerator.selfPresence(account, Presence.Status.ONLINE, mucOptions.nonanonymous() || onConferenceJoined != null);
                packet.setTo(joinJid);
                Element x = packet.addChild("x", "http://jabber.org/protocol/muc");
                if (conversation.getMucOptions().getPassword() != null) {
                    x.addChild("password").setContent(mucOptions.getPassword());
                }
                if (mucOptions.mamSupport()) {
                    // Use MAM instead of the limited muc history to get history
                    x.addChild("history").setAttribute("maxchars", "0");
                } else {
                    // Fallback to muc history
                    x.addChild("history").setAttribute("since", PresenceGenerator.getTimestamp(conversation.getLastMessageTransmitted().getTimestamp()));
                }
                sendPresencePacket(account, packet);
                if (onConferenceJoined != null) {
                    onConferenceJoined.onConferenceJoined(conversation);
                }
                if (!joinJid.equals(conversation.getJid())) {
                    conversation.setContactJid(joinJid);
                    databaseBackend.updateConversation(conversation);
                }
                if (mucOptions.mamSupport()) {
                    getMessageArchiveService().catchupMUC(conversation);
                }
                if (mucOptions.isPrivateAndNonAnonymous()) {
                    fetchConferenceMembers(conversation);
                    if (followedInvite) {
                        final Bookmark bookmark = conversation.getBookmark();
                        if (bookmark != null) {
                            if (!bookmark.autojoin()) {
                                bookmark.setAutojoin(true);
                                createBookmark(account, bookmark);
                            }
                        } else {
                            saveConversationAsBookmark(conversation, null);
                        }
                    }
                }
                synchronized (account.inProgressConferenceJoins) {
                    account.inProgressConferenceJoins.remove(conversation);
                    sendUnsentMessages(conversation);
                }
            }

            @Override
            public void onConferenceConfigurationFetched(Conversation conversation) {
                if (conversation.getStatus() == Conversation.STATUS_ARCHIVED) {
                    Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": conversation (" + conversation.getJid() + ") got archived before IQ result");
                    return;
                }
                join(conversation);
            }

            @Override
            public void onFetchFailed(final Conversation conversation, final String errorCondition) {
                if (conversation.getStatus() == Conversation.STATUS_ARCHIVED) {
                    Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": conversation (" + conversation.getJid() + ") got archived before IQ result");
                    return;
                }
                if ("remote-server-not-found".equals(errorCondition)) {
                    synchronized (account.inProgressConferenceJoins) {
                        account.inProgressConferenceJoins.remove(conversation);
                    }
                    conversation.getMucOptions().setError(MucOptions.Error.SERVER_NOT_FOUND);
                    updateConversationUi();
                } else {
                    join(conversation);
                    fetchConferenceConfiguration(conversation);
                }
            }
        });
        updateConversationUi();
    } else {
        synchronized (account.pendingConferenceJoins) {
            account.pendingConferenceJoins.add(conversation);
        }
        conversation.resetMucOptions();
        conversation.setHasMessagesLeftOnServer(false);
        updateConversationUi();
    }
}
Also used : Account(eu.siacs.conversations.entities.Account) MucOptions(eu.siacs.conversations.entities.MucOptions) Jid(eu.siacs.conversations.xmpp.Jid) Bookmark(eu.siacs.conversations.entities.Bookmark) Element(eu.siacs.conversations.xml.Element) Conversation(eu.siacs.conversations.entities.Conversation) PresencePacket(eu.siacs.conversations.xmpp.stanzas.PresencePacket)

Aggregations

MucOptions (eu.siacs.conversations.entities.MucOptions)17 Conversation (eu.siacs.conversations.entities.Conversation)7 Jid (eu.siacs.conversations.xmpp.Jid)7 Account (eu.siacs.conversations.entities.Account)5 Bookmark (eu.siacs.conversations.entities.Bookmark)4 User (eu.siacs.conversations.entities.MucOptions.User)4 Contact (eu.siacs.conversations.entities.Contact)3 PresencePacket (eu.siacs.conversations.xmpp.stanzas.PresencePacket)3 Bundle (android.os.Bundle)2 SpannableStringBuilder (android.text.SpannableStringBuilder)2 MenuItem (android.view.MenuItem)2 Message (eu.siacs.conversations.entities.Message)2 EditMessage (eu.siacs.conversations.ui.widget.EditMessage)2 SuppressLint (android.annotation.SuppressLint)1 Activity (android.app.Activity)1 PendingIntent (android.app.PendingIntent)1 Context (android.content.Context)1 Intent (android.content.Intent)1 Uri (android.net.Uri)1 Editable (android.text.Editable)1