PresenceGenerator.java

 1package eu.siacs.conversations.generator;
 2
 3import android.text.TextUtils;
 4
 5import eu.siacs.conversations.entities.Account;
 6import eu.siacs.conversations.entities.Contact;
 7import eu.siacs.conversations.entities.MucOptions;
 8import eu.siacs.conversations.entities.Presence;
 9import eu.siacs.conversations.services.XmppConnectionService;
10import eu.siacs.conversations.xml.Element;
11import eu.siacs.conversations.xml.Namespace;
12import eu.siacs.conversations.xmpp.stanzas.PresencePacket;
13
14public class PresenceGenerator extends AbstractGenerator {
15
16    public PresenceGenerator(XmppConnectionService service) {
17        super(service);
18    }
19
20    private PresencePacket subscription(String type, Contact contact) {
21        PresencePacket packet = new PresencePacket();
22        packet.setAttribute("type", type);
23        packet.setTo(contact.getJid());
24        packet.setFrom(contact.getAccount().getJid().asBareJid());
25        return packet;
26    }
27
28    public PresencePacket requestPresenceUpdatesFrom(Contact contact) {
29        PresencePacket packet = subscription("subscribe", contact);
30        String displayName = contact.getAccount().getDisplayName();
31        if (!TextUtils.isEmpty(displayName)) {
32            packet.addChild("nick", Namespace.NICK).setContent(displayName);
33        }
34        return packet;
35    }
36
37    public PresencePacket stopPresenceUpdatesFrom(Contact contact) {
38        return subscription("unsubscribe", contact);
39    }
40
41    public PresencePacket stopPresenceUpdatesTo(Contact contact) {
42        return subscription("unsubscribed", contact);
43    }
44
45    public PresencePacket sendPresenceUpdatesTo(Contact contact) {
46        return subscription("subscribed", contact);
47    }
48
49    public PresencePacket selfPresence(Account account, Presence.Status status) {
50        return selfPresence(account, status, true);
51    }
52
53    public PresencePacket selfPresence(final Account account, final Presence.Status status, final boolean personal) {
54        final PresencePacket packet = new PresencePacket();
55        if (personal) {
56            final String sig = account.getPgpSignature();
57            final String message = account.getPresenceStatusMessage();
58            if (status.toShowString() != null) {
59                packet.addChild("show").setContent(status.toShowString());
60            }
61            if (!TextUtils.isEmpty(message)) {
62                packet.addChild(new Element("status").setContent(message));
63            }
64            if (sig != null && mXmppConnectionService.getPgpEngine() != null) {
65                packet.addChild("x", "jabber:x:signed").setContent(sig);
66            }
67        }
68        final String capHash = getCapHash(account);
69        if (capHash != null) {
70            Element cap = packet.addChild("c",
71                    "http://jabber.org/protocol/caps");
72            cap.setAttribute("hash", "sha-1");
73            cap.setAttribute("node", "http://conversations.im");
74            cap.setAttribute("ver", capHash);
75        }
76        return packet;
77    }
78
79    public PresencePacket leave(final MucOptions mucOptions) {
80        PresencePacket presencePacket = new PresencePacket();
81        presencePacket.setTo(mucOptions.getSelf().getFullJid());
82        presencePacket.setFrom(mucOptions.getAccount().getJid());
83        presencePacket.setAttribute("type", "unavailable");
84        return presencePacket;
85    }
86
87    public PresencePacket sendOfflinePresence(Account account) {
88        PresencePacket packet = new PresencePacket();
89        packet.setFrom(account.getJid());
90        packet.setAttribute("type", "unavailable");
91        return packet;
92    }
93}