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.Element;
9import eu.siacs.conversations.xml.Namespace;
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(final Account account, final Presence.Availability status, final boolean personal, final String nickname) {
67 final im.conversations.android.xmpp.model.stanza.Presence packet =
68 new im.conversations.android.xmpp.model.stanza.Presence();
69 if (personal) {
70 final String sig = account.getPgpSignature();
71 final String message = account.getPresenceStatusMessage();
72 packet.setAvailability(status);
73 packet.setStatus(message);
74 if (sig != null && mXmppConnectionService.getPgpEngine() != null) {
75 packet.addChild("x", "jabber:x:signed").setContent(sig);
76 }
77 }
78 if (nickname != null) {
79 Element nick = packet.addChild("nick", "http://jabber.org/protocol/nick");
80 nick.setContent(nickname);
81 }
82 final String capHash = getCapHash(account);
83 if (capHash != null) {
84 Element cap = packet.addChild("c", "http://jabber.org/protocol/caps");
85 cap.setAttribute("hash", "sha-1");
86 cap.setAttribute("node", "https://cheogram.com");
87 cap.setAttribute("ver", capHash);
88 }
89 return packet;
90 }
91
92 public im.conversations.android.xmpp.model.stanza.Presence leave(final MucOptions mucOptions) {
93 im.conversations.android.xmpp.model.stanza.Presence presence =
94 new im.conversations.android.xmpp.model.stanza.Presence();
95 presence.setTo(mucOptions.getSelf().getFullJid());
96 presence.setFrom(mucOptions.getAccount().getJid());
97 presence.setAttribute("type", "unavailable");
98 return presence;
99 }
100
101 public im.conversations.android.xmpp.model.stanza.Presence sendOfflinePresence(
102 Account account) {
103 im.conversations.android.xmpp.model.stanza.Presence packet =
104 new im.conversations.android.xmpp.model.stanza.Presence();
105 packet.setFrom(account.getJid());
106 packet.setAttribute("type", "unavailable");
107 return packet;
108 }
109}