PresenceGenerator.java

  1package eu.siacs.conversations.generator;
  2
  3import android.text.TextUtils;
  4import eu.siacs.conversations.entities.Account;
  5import eu.siacs.conversations.entities.Contact;
  6import eu.siacs.conversations.entities.MucOptions;
  7import eu.siacs.conversations.services.XmppConnectionService;
  8import eu.siacs.conversations.xml.Element;
  9import eu.siacs.conversations.xml.Namespace;
 10import im.conversations.android.xmpp.model.stanza.Presence;
 11
 12public class PresenceGenerator extends AbstractGenerator {
 13
 14    public PresenceGenerator(XmppConnectionService service) {
 15        super(service);
 16    }
 17
 18    private im.conversations.android.xmpp.model.stanza.Presence subscription(
 19            String type, Contact contact) {
 20        im.conversations.android.xmpp.model.stanza.Presence packet =
 21                new im.conversations.android.xmpp.model.stanza.Presence();
 22        packet.setAttribute("type", type);
 23        packet.setTo(contact.getJid());
 24        packet.setFrom(contact.getAccount().getJid().asBareJid());
 25        return packet;
 26    }
 27
 28    public im.conversations.android.xmpp.model.stanza.Presence requestPresenceUpdatesFrom(
 29            final Contact contact) {
 30        return requestPresenceUpdatesFrom(contact, null);
 31    }
 32
 33    public im.conversations.android.xmpp.model.stanza.Presence requestPresenceUpdatesFrom(
 34            final Contact contact, final String preAuth) {
 35        im.conversations.android.xmpp.model.stanza.Presence packet =
 36                subscription("subscribe", contact);
 37        String displayName = contact.getAccount().getDisplayName();
 38        if (!TextUtils.isEmpty(displayName)) {
 39            packet.addChild("nick", Namespace.NICK).setContent(displayName);
 40        }
 41        if (preAuth != null) {
 42            packet.addChild("preauth", Namespace.PARS).setAttribute("token", preAuth);
 43        }
 44        return packet;
 45    }
 46
 47    public im.conversations.android.xmpp.model.stanza.Presence stopPresenceUpdatesFrom(
 48            Contact contact) {
 49        return subscription("unsubscribe", contact);
 50    }
 51
 52    public im.conversations.android.xmpp.model.stanza.Presence stopPresenceUpdatesTo(
 53            Contact contact) {
 54        return subscription("unsubscribed", contact);
 55    }
 56
 57    public im.conversations.android.xmpp.model.stanza.Presence sendPresenceUpdatesTo(
 58            Contact contact) {
 59        return subscription("subscribed", contact);
 60    }
 61
 62    public im.conversations.android.xmpp.model.stanza.Presence selfPresence(Account account, Presence.Availability status) {
 63        return selfPresence(account, status, true, null);
 64    }
 65
 66    public im.conversations.android.xmpp.model.stanza.Presence selfPresence(final Account account, final Presence.Availability status, final boolean personal, final String nickname) {
 67        final im.conversations.android.xmpp.model.stanza.Presence packet =
 68                new im.conversations.android.xmpp.model.stanza.Presence();
 69        if (personal) {
 70            final String sig = account.getPgpSignature();
 71            final String message = account.getPresenceStatusMessage();
 72            packet.setAvailability(status);
 73            packet.setStatus(message);
 74            if (sig != null && mXmppConnectionService.getPgpEngine() != null) {
 75                packet.addChild("x", "jabber:x:signed").setContent(sig);
 76            }
 77        }
 78        if (nickname != null) {
 79            Element nick = packet.addChild("nick", "http://jabber.org/protocol/nick");
 80            nick.setContent(nickname);
 81        }
 82        final String capHash = getCapHash(account);
 83        if (capHash != null) {
 84            Element cap = packet.addChild("c", "http://jabber.org/protocol/caps");
 85            cap.setAttribute("hash", "sha-1");
 86            cap.setAttribute("node", "https://cheogram.com");
 87            cap.setAttribute("ver", capHash);
 88        }
 89        return packet;
 90    }
 91
 92    public im.conversations.android.xmpp.model.stanza.Presence leave(final MucOptions mucOptions) {
 93        im.conversations.android.xmpp.model.stanza.Presence presence =
 94                new im.conversations.android.xmpp.model.stanza.Presence();
 95        presence.setTo(mucOptions.getSelf().getFullJid());
 96        presence.setFrom(mucOptions.getAccount().getJid());
 97        presence.setAttribute("type", "unavailable");
 98        return presence;
 99    }
100
101    public im.conversations.android.xmpp.model.stanza.Presence sendOfflinePresence(
102            Account account) {
103        im.conversations.android.xmpp.model.stanza.Presence packet =
104                new im.conversations.android.xmpp.model.stanza.Presence();
105        packet.setFrom(account.getJid());
106        packet.setAttribute("type", "unavailable");
107        return packet;
108    }
109}