PresenceGenerator.java

 1package eu.siacs.conversations.generator;
 2
 3import android.text.TextUtils;
 4import eu.siacs.conversations.entities.Account;
 5import eu.siacs.conversations.entities.Contact;
 6import eu.siacs.conversations.entities.MucOptions;
 7import eu.siacs.conversations.services.XmppConnectionService;
 8import eu.siacs.conversations.xml.Namespace;
 9import eu.siacs.conversations.xmpp.manager.PresenceManager;
10import im.conversations.android.xmpp.model.stanza.Presence;
11
12public class PresenceGenerator extends AbstractGenerator {
13
14    public PresenceGenerator(XmppConnectionService service) {
15        super(service);
16    }
17
18    private im.conversations.android.xmpp.model.stanza.Presence subscription(
19            String type, Contact contact) {
20        im.conversations.android.xmpp.model.stanza.Presence packet =
21                new im.conversations.android.xmpp.model.stanza.Presence();
22        packet.setAttribute("type", type);
23        packet.setTo(contact.getJid());
24        packet.setFrom(contact.getAccount().getJid().asBareJid());
25        return packet;
26    }
27
28    public im.conversations.android.xmpp.model.stanza.Presence requestPresenceUpdatesFrom(
29            final Contact contact) {
30        return requestPresenceUpdatesFrom(contact, null);
31    }
32
33    public im.conversations.android.xmpp.model.stanza.Presence requestPresenceUpdatesFrom(
34            final Contact contact, final String preAuth) {
35        im.conversations.android.xmpp.model.stanza.Presence packet =
36                subscription("subscribe", contact);
37        String displayName = contact.getAccount().getDisplayName();
38        if (!TextUtils.isEmpty(displayName)) {
39            packet.addChild("nick", Namespace.NICK).setContent(displayName);
40        }
41        if (preAuth != null) {
42            packet.addChild("preauth", Namespace.PARS).setAttribute("token", preAuth);
43        }
44        return packet;
45    }
46
47    public im.conversations.android.xmpp.model.stanza.Presence stopPresenceUpdatesFrom(
48            Contact contact) {
49        return subscription("unsubscribe", contact);
50    }
51
52    public im.conversations.android.xmpp.model.stanza.Presence stopPresenceUpdatesTo(
53            Contact contact) {
54        return subscription("unsubscribed", contact);
55    }
56
57    public im.conversations.android.xmpp.model.stanza.Presence sendPresenceUpdatesTo(
58            Contact contact) {
59        return subscription("subscribed", contact);
60    }
61
62    public im.conversations.android.xmpp.model.stanza.Presence selfPresence(Account account, Presence.Availability status) {
63        return selfPresence(account, status, true, null);
64    }
65
66    public im.conversations.android.xmpp.model.stanza.Presence selfPresence(
67            final Account account, final Presence.Availability status, final boolean personal, final String nickname) {
68        final var connection = account.getXmppConnection();
69        if (connection == null) {
70            return new Presence();
71        }
72        final var packet = connection.getManager(PresenceManager.class).getPresence(status, personal);
73        if (nickname != null) {
74            final var nick = packet.addChild("nick", "http://jabber.org/protocol/nick");
75            nick.setContent(nickname);
76        }
77        return packet;
78    }
79
80    public im.conversations.android.xmpp.model.stanza.Presence leave(final MucOptions mucOptions) {
81        im.conversations.android.xmpp.model.stanza.Presence presence =
82                new im.conversations.android.xmpp.model.stanza.Presence();
83        presence.setTo(mucOptions.getSelf().getFullJid());
84        presence.setFrom(mucOptions.getAccount().getJid());
85        presence.setAttribute("type", "unavailable");
86        return presence;
87    }
88
89    public im.conversations.android.xmpp.model.stanza.Presence sendOfflinePresence(
90            Account account) {
91        im.conversations.android.xmpp.model.stanza.Presence packet =
92                new im.conversations.android.xmpp.model.stanza.Presence();
93        packet.setFrom(account.getJid());
94        packet.setAttribute("type", "unavailable");
95        return packet;
96    }
97}