PresenceManager.java

 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}