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