1package eu.siacs.conversations.xmpp.manager;
2
3import android.content.Context;
4import com.google.common.base.Strings;
5import eu.siacs.conversations.xmpp.Jid;
6import eu.siacs.conversations.xmpp.XmppConnection;
7import im.conversations.android.xmpp.EntityCapabilities;
8import im.conversations.android.xmpp.EntityCapabilities2;
9import im.conversations.android.xmpp.ServiceDescription;
10import im.conversations.android.xmpp.model.capabilties.Capabilities;
11import im.conversations.android.xmpp.model.capabilties.LegacyCapabilities;
12import im.conversations.android.xmpp.model.nick.Nick;
13import im.conversations.android.xmpp.model.pars.PreAuth;
14import im.conversations.android.xmpp.model.pgp.Signed;
15import im.conversations.android.xmpp.model.stanza.Presence;
16import java.util.HashMap;
17import java.util.Map;
18
19public class PresenceManager extends AbstractManager {
20
21 private final Map<EntityCapabilities.Hash, ServiceDescription> serviceDescriptions =
22 new HashMap<>();
23
24 public PresenceManager(Context context, XmppConnection connection) {
25 super(context, connection);
26 }
27
28 public void subscribe(final Jid address) {
29 subscribe(address, null);
30 }
31
32 public void subscribe(final Jid address, final String preAuth) {
33
34 var presence = new Presence(Presence.Type.SUBSCRIBE);
35 presence.setTo(address);
36
37 final var displayName = getAccount().getDisplayName();
38 if (!Strings.isNullOrEmpty(displayName)) {
39 presence.addExtension(new Nick(displayName));
40 }
41 if (preAuth != null) {
42 presence.addExtension(new PreAuth()).setToken(preAuth);
43 }
44 this.connection.sendPresencePacket(presence);
45 }
46
47 public void unsubscribe(final Jid address) {
48 var presence = new Presence(Presence.Type.UNSUBSCRIBE);
49 presence.setTo(address);
50 this.connection.sendPresencePacket(presence);
51 }
52
53 public void unsubscribed(final Jid address) {
54 var presence = new Presence(Presence.Type.UNSUBSCRIBED);
55 presence.setTo(address);
56 this.connection.sendPresencePacket(presence);
57 }
58
59 public void subscribed(final Jid address) {
60 var presence = new Presence(Presence.Type.SUBSCRIBED);
61 presence.setTo(address);
62 this.connection.sendPresencePacket(presence);
63 }
64
65 public Presence getPresence(final Presence.Availability availability, final boolean personal) {
66 final var account = connection.getAccount();
67 final var serviceDiscoveryFeatures = getManager(DiscoManager.class).getServiceDescription();
68 final var infoQuery = serviceDiscoveryFeatures.asInfoQuery();
69 final var capsHash = EntityCapabilities.hash(infoQuery);
70 final var caps2Hash = EntityCapabilities2.hash(infoQuery);
71 serviceDescriptions.put(capsHash, serviceDiscoveryFeatures);
72 serviceDescriptions.put(caps2Hash, serviceDiscoveryFeatures);
73 final var capabilities = new Capabilities();
74 capabilities.setHash(caps2Hash);
75 final var legacyCapabilities = new LegacyCapabilities();
76 legacyCapabilities.setNode(DiscoManager.CAPABILITY_NODE);
77 legacyCapabilities.setHash(capsHash);
78 final var presence = new Presence();
79 presence.addExtension(capabilities);
80 presence.addExtension(legacyCapabilities);
81
82 if (personal) {
83 final String pgpSignature = account.getPgpSignature();
84 final String message = account.getPresenceStatusMessage();
85 presence.setAvailability(availability);
86 presence.setStatus(message);
87 if (pgpSignature != null) {
88 final var signed = new Signed();
89 signed.setContent(pgpSignature);
90 presence.addExtension(new Signed());
91 }
92 }
93 return presence;
94 }
95
96 public ServiceDescription getCachedServiceDescription(final EntityCapabilities.Hash hash) {
97 return this.serviceDescriptions.get(hash);
98 }
99}