PresenceManager.java

 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}