PresenceManager.java

 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}