1package eu.siacs.conversations.xmpp.manager;
2
3import android.content.Context;
4import eu.siacs.conversations.services.XmppConnectionService;
5import eu.siacs.conversations.xmpp.XmppConnection;
6import im.conversations.android.xmpp.EntityCapabilities;
7import im.conversations.android.xmpp.EntityCapabilities2;
8import im.conversations.android.xmpp.ServiceDescription;
9import im.conversations.android.xmpp.model.capabilties.Capabilities;
10import im.conversations.android.xmpp.model.capabilties.LegacyCapabilities;
11import im.conversations.android.xmpp.model.pgp.Signed;
12import im.conversations.android.xmpp.model.stanza.Presence;
13import java.util.HashMap;
14import java.util.Map;
15
16public class PresenceManager extends AbstractManager {
17
18 private final Map<EntityCapabilities.Hash, ServiceDescription> serviceDescriptions =
19 new HashMap<>();
20
21 public PresenceManager(XmppConnectionService context, XmppConnection connection) {
22 super(context, connection);
23 }
24
25 public Presence getPresence(final Presence.Availability availability, final boolean personal) {
26 final var account = connection.getAccount();
27 final var serviceDiscoveryFeatures = getManager(DiscoManager.class).getServiceDescription();
28 final var infoQuery = serviceDiscoveryFeatures.asInfoQuery();
29 final var capsHash = EntityCapabilities.hash(infoQuery);
30 final var caps2Hash = EntityCapabilities2.hash(infoQuery);
31 serviceDescriptions.put(capsHash, serviceDiscoveryFeatures);
32 serviceDescriptions.put(caps2Hash, serviceDiscoveryFeatures);
33 final var capabilities = new Capabilities();
34 capabilities.setHash(caps2Hash);
35 final var legacyCapabilities = new LegacyCapabilities();
36 legacyCapabilities.setNode(DiscoManager.CAPABILITY_NODE);
37 legacyCapabilities.setHash(capsHash);
38 final var presence = new Presence();
39 presence.addExtension(capabilities);
40 presence.addExtension(legacyCapabilities);
41
42 if (personal) {
43 final String pgpSignature = account.getPgpSignature();
44 final String message = account.getPresenceStatusMessage();
45 presence.setAvailability(availability);
46 presence.setStatus(message);
47 if (pgpSignature != null) {
48 final var signed = new Signed();
49 signed.setContent(pgpSignature);
50 presence.addExtension(new Signed());
51 }
52 }
53 return presence;
54 }
55
56 public ServiceDescription getCachedServiceDescription(final EntityCapabilities.Hash hash) {
57 return this.serviceDescriptions.get(hash);
58 }
59}