Search in sources :

Example 1 with PresencePacket

use of eu.siacs.conversations.xmpp.stanzas.PresencePacket 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 PresencePacket

use of eu.siacs.conversations.xmpp.stanzas.PresencePacket in project Conversations by siacs.

the class XmppConnectionService method sendPresence.

private void sendPresence(final Account account, final boolean includeIdleTimestamp) {
    final Presence.Status status;
    if (manuallyChangePresence()) {
        status = account.getPresenceStatus();
    } else {
        status = getTargetPresence();
    }
    final PresencePacket packet = mPresenceGenerator.selfPresence(account, status);
    if (mLastActivity > 0 && includeIdleTimestamp) {
        // don't send future dates
        long since = Math.min(mLastActivity, System.currentTimeMillis());
        packet.addChild("idle", Namespace.IDLE).setAttribute("since", AbstractGenerator.getTimestamp(since));
    }
    sendPresencePacket(account, packet);
}
Also used : Presence(eu.siacs.conversations.entities.Presence) PresencePacket(eu.siacs.conversations.xmpp.stanzas.PresencePacket)

Example 3 with PresencePacket

use of eu.siacs.conversations.xmpp.stanzas.PresencePacket 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 PresencePacket

use of eu.siacs.conversations.xmpp.stanzas.PresencePacket 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)

Example 5 with PresencePacket

use of eu.siacs.conversations.xmpp.stanzas.PresencePacket in project Conversations by siacs.

the class PresenceGenerator method subscription.

private PresencePacket subscription(String type, Contact contact) {
    PresencePacket packet = new PresencePacket();
    packet.setAttribute("type", type);
    packet.setTo(contact.getJid());
    packet.setFrom(contact.getAccount().getJid().asBareJid());
    return packet;
}
Also used : PresencePacket(eu.siacs.conversations.xmpp.stanzas.PresencePacket)

Aggregations

PresencePacket (eu.siacs.conversations.xmpp.stanzas.PresencePacket)11 MucOptions (eu.siacs.conversations.entities.MucOptions)3 Element (eu.siacs.conversations.xml.Element)3 Account (eu.siacs.conversations.entities.Account)2 Bookmark (eu.siacs.conversations.entities.Bookmark)2 Conversation (eu.siacs.conversations.entities.Conversation)2 Jid (eu.siacs.conversations.xmpp.Jid)2 NonNull (androidx.annotation.NonNull)1 OnRenameListener (eu.siacs.conversations.entities.MucOptions.OnRenameListener)1 Presence (eu.siacs.conversations.entities.Presence)1 Tag (eu.siacs.conversations.xml.Tag)1 XmppConnection (eu.siacs.conversations.xmpp.XmppConnection)1 IqPacket (eu.siacs.conversations.xmpp.stanzas.IqPacket)1 MessagePacket (eu.siacs.conversations.xmpp.stanzas.MessagePacket)1 IOException (java.io.IOException)1