From 76ce6f52062aa802482497bc79aa05ee3e73244b Mon Sep 17 00:00:00 2001 From: steckbrief Date: Wed, 2 Aug 2017 12:43:47 +0200 Subject: Using a generator approach for generating PresencePackets --- .../generator/AbstractGenerator.java | 10 +-- .../generator/PresenceGenerator.java | 95 +++++++++++++++++----- 2 files changed, 80 insertions(+), 25 deletions(-) (limited to 'src/main/java/de/thedevstack/conversationsplus/generator') diff --git a/src/main/java/de/thedevstack/conversationsplus/generator/AbstractGenerator.java b/src/main/java/de/thedevstack/conversationsplus/generator/AbstractGenerator.java index 2d825f2c..abe137cf 100644 --- a/src/main/java/de/thedevstack/conversationsplus/generator/AbstractGenerator.java +++ b/src/main/java/de/thedevstack/conversationsplus/generator/AbstractGenerator.java @@ -17,7 +17,7 @@ import de.tzur.conversations.Settings; import de.thedevstack.conversationsplus.crypto.axolotl.AxolotlService; public abstract class AbstractGenerator { - private final String[] FEATURES = { + private static final String[] FEATURES = { "urn:xmpp:jingle:1", "urn:xmpp:jingle:apps:file-transfer:3", "urn:xmpp:jingle:transports:s5b:1", @@ -32,15 +32,15 @@ public abstract class AbstractGenerator { "jabber:iq:version", "http://jabber.org/protocol/chatstates", AxolotlService.PEP_DEVICE_LIST+"+notify"}; - private final String[] MESSAGE_CONFIRMATION_FEATURES = { + private static final String[] MESSAGE_CONFIRMATION_FEATURES = { "urn:xmpp:chat-markers:0", "urn:xmpp:receipts" }; - protected final String IDENTITY_TYPE = "phone"; + protected static final String IDENTITY_TYPE = "phone"; private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); - public String getCapHash() { + public static String getCapHash() { StringBuilder s = new StringBuilder(); s.append("client/" + IDENTITY_TYPE + "//" + ConversationsPlusApplication.getNameAndVersion() + "<"); MessageDigest md; @@ -62,7 +62,7 @@ public abstract class AbstractGenerator { return DATE_FORMAT.format(time); } - public List getFeatures() { + public static List getFeatures() { ArrayList features = new ArrayList<>(); features.addAll(Arrays.asList(FEATURES)); if (Settings.CONFIRM_MESSAGE_RECEIVED) { diff --git a/src/main/java/de/thedevstack/conversationsplus/generator/PresenceGenerator.java b/src/main/java/de/thedevstack/conversationsplus/generator/PresenceGenerator.java index f370c6e0..fbe7c911 100644 --- a/src/main/java/de/thedevstack/conversationsplus/generator/PresenceGenerator.java +++ b/src/main/java/de/thedevstack/conversationsplus/generator/PresenceGenerator.java @@ -2,41 +2,55 @@ package de.thedevstack.conversationsplus.generator; import de.thedevstack.conversationsplus.entities.Account; import de.thedevstack.conversationsplus.entities.Contact; +import de.thedevstack.conversationsplus.entities.MucOptions; import de.thedevstack.conversationsplus.entities.Presence; import de.thedevstack.conversationsplus.xml.Element; +import de.thedevstack.conversationsplus.xmpp.jid.Jid; import de.thedevstack.conversationsplus.xmpp.stanzas.PresencePacket; public class PresenceGenerator extends AbstractGenerator { - private PresencePacket subscription(String type, Contact contact) { - PresencePacket packet = new PresencePacket(); - packet.setAttribute("type", type); - packet.setTo(contact.getJid()); - packet.setFrom(contact.getAccount().getJid().toBareJid()); - return packet; + private static PresencePacket generatePresencePacket(String type, Jid from, Jid to) { + PresencePacket packet = new PresencePacket(); + if (null != type) { + packet.setAttribute("type", type); + } + + if (null != to) { + packet.setTo(to); + } + + if (null != from) { + packet.setFrom(from); + } + + return packet; + + } + + private static PresencePacket subscription(String type, Contact contact) { + return generatePresencePacket(type, contact.getAccount().getJid().toBareJid(), contact.getJid()); } - public PresencePacket requestPresenceUpdatesFrom(Contact contact) { + public static PresencePacket requestPresenceUpdatesFrom(Contact contact) { return subscription("subscribe", contact); } - public PresencePacket stopPresenceUpdatesFrom(Contact contact) { + public static PresencePacket stopPresenceUpdatesFrom(Contact contact) { return subscription("unsubscribe", contact); } - public PresencePacket stopPresenceUpdatesTo(Contact contact) { + public static PresencePacket stopPresenceUpdatesTo(Contact contact) { return subscription("unsubscribed", contact); } - public PresencePacket sendPresenceUpdatesTo(Contact contact) { + public static PresencePacket sendPresenceUpdatesTo(Contact contact) { return subscription("subscribed", contact); } - public PresencePacket selfPresence(Account account, Presence.Status status) { - PresencePacket packet = new PresencePacket(); - if(status.toShowString() != null) { - packet.addChild("show").setContent(status.toShowString()); - } + public static PresencePacket selfPresence(Account account, Presence.Status status) { + PresencePacket packet = new PresencePacket(status); + packet.setFrom(account.getJid()); String sig = account.getPgpSignature(); if (sig != null) { @@ -53,10 +67,51 @@ public class PresenceGenerator extends AbstractGenerator { return packet; } - public PresencePacket sendOfflinePresence(Account account) { - PresencePacket packet = new PresencePacket(); - packet.setFrom(account.getJid()); - packet.setAttribute("type","unavailable"); - return packet; + private static PresencePacket generateOfflinePresencePacket(Jid from, Jid to) { + return generatePresencePacket("unavailable", from, to); + + } + + public static PresencePacket generateOfflinePresencePacketTo(Account account, Jid to) { + return generateOfflinePresencePacket(account.getJid(), to); + } + + public static PresencePacket generateOfflinePresencePacket(Account account) { + return generateOfflinePresencePacket(account.getJid(), null); } + + public static PresencePacket generateMucJoin(Account account, Jid joinJid, MucOptions mucOptions, long lastMessageTransmitted) { + PresencePacket packet = generatePresencePacket(null, account.getJid(), joinJid); + Element x = packet.addChild("x", "http://jabber.org/protocol/muc"); + if (mucOptions.getPassword() != null) { + x.addChild("password").setContent(mucOptions.getPassword()); + } + + Element historyElement = x.addChild("history"); + if (mucOptions.mamSupport()) { + // Use MAM instead of the limited muc history to get history + historyElement.setAttribute("maxchars", "0"); + } else { + // Fallback to muc history + historyElement.setAttribute("since", PresenceGenerator.getTimestamp(lastMessageTransmitted)); + } + String sig = account.getPgpSignature(); + if (sig != null) { + packet.addChild("x", "jabber:x:signed").setContent(sig); + } + + return packet; + } + + public static PresencePacket generateMucRename(Account account, Jid joinJid) { + PresencePacket packet = generatePresencePacket(null, account.getJid(), joinJid); + + String sig = account.getPgpSignature(); + if (sig != null) { + packet.addChild("status").setContent("online"); + packet.addChild("x", "jabber:x:signed").setContent(sig); + } + + return packet; + } } -- cgit v1.2.3