From be1992ce897d3b0551e545646a3e0f45cc6dd8c2 Mon Sep 17 00:00:00 2001 From: steckbrief Date: Sun, 6 Aug 2017 14:28:00 +0200 Subject: Implements XEP-0202 Entity Time, moves Software Version to xmpp package, moves namespace definitions for mam, carbons and avatar to xmpp package --- .../conversationsplus/entities/MucOptions.java | 3 +- .../generator/AbstractGenerator.java | 8 +++- .../conversationsplus/generator/IqGenerator.java | 13 ++---- .../generator/MessageGenerator.java | 3 +- .../conversationsplus/parser/IqParser.java | 12 ++++-- .../conversationsplus/parser/MessageParser.java | 50 ++++++++++++---------- .../services/XmppConnectionService.java | 5 ++- .../conversationsplus/xmpp/XmppConnection.java | 10 +++-- .../xmpp/avatar/AvatarPacket.java | 8 ++++ .../xmpp/avatar/AvatarPacketGenerator.java | 16 +++---- .../xmpp/avatar/AvatarPacketParser.java | 4 +- .../conversationsplus/xmpp/carbons/Carbons.java | 7 +++ .../xmpp/chatstate/ChatState.java | 3 +- .../xmpp/iqversion/IqVersionPacket.java | 23 ++++++++++ .../xmpp/iqversion/IqVersionPacketGenerator.java | 38 ++++++++++++++++ .../conversationsplus/xmpp/mam/Mam.java | 7 +++ .../conversationsplus/xmpp/time/TimePacket.java | 35 +++++++++++++++ .../xmpp/time/TimePacketGenerator.java | 38 ++++++++++++++++ 18 files changed, 225 insertions(+), 58 deletions(-) create mode 100644 src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacket.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/xmpp/carbons/Carbons.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/xmpp/iqversion/IqVersionPacket.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/xmpp/iqversion/IqVersionPacketGenerator.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/xmpp/mam/Mam.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/xmpp/time/TimePacket.java create mode 100644 src/main/java/de/thedevstack/conversationsplus/xmpp/time/TimePacketGenerator.java diff --git a/src/main/java/de/thedevstack/conversationsplus/entities/MucOptions.java b/src/main/java/de/thedevstack/conversationsplus/entities/MucOptions.java index 32cdb1a9..abc45f0b 100644 --- a/src/main/java/de/thedevstack/conversationsplus/entities/MucOptions.java +++ b/src/main/java/de/thedevstack/conversationsplus/entities/MucOptions.java @@ -16,6 +16,7 @@ import de.thedevstack.conversationsplus.xmpp.forms.Field; import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; import de.thedevstack.conversationsplus.dto.Avatar; +import de.thedevstack.conversationsplus.xmpp.mam.Mam; @SuppressLint("DefaultLocale") public class MucOptions { @@ -300,7 +301,7 @@ public class MucOptions { public boolean mamSupport() { // Update with "urn:xmpp:mam:1" once we support it - return hasFeature("urn:xmpp:mam:0"); + return hasFeature(Mam.NAMESPACE); } public boolean nonanonymous() { diff --git a/src/main/java/de/thedevstack/conversationsplus/generator/AbstractGenerator.java b/src/main/java/de/thedevstack/conversationsplus/generator/AbstractGenerator.java index abe137cf..7302b2df 100644 --- a/src/main/java/de/thedevstack/conversationsplus/generator/AbstractGenerator.java +++ b/src/main/java/de/thedevstack/conversationsplus/generator/AbstractGenerator.java @@ -13,6 +13,9 @@ import java.util.Locale; import java.util.TimeZone; import de.thedevstack.conversationsplus.ConversationsPlusApplication; +import de.thedevstack.conversationsplus.xmpp.chatstate.ChatState; +import de.thedevstack.conversationsplus.xmpp.iqversion.IqVersionPacket; +import de.thedevstack.conversationsplus.xmpp.time.TimePacket; import de.tzur.conversations.Settings; import de.thedevstack.conversationsplus.crypto.axolotl.AxolotlService; @@ -29,8 +32,9 @@ public abstract class AbstractGenerator { "urn:xmpp:avatar:metadata+notify", "http://jabber.org/protocol/nick+notify", "urn:xmpp:ping", - "jabber:iq:version", - "http://jabber.org/protocol/chatstates", + TimePacket.NAMESPACE, + IqVersionPacket.NAMESPACE, + ChatState.NAMESPACE, AxolotlService.PEP_DEVICE_LIST+"+notify"}; private static final String[] MESSAGE_CONFIRMATION_FEATURES = { "urn:xmpp:chat-markers:0", diff --git a/src/main/java/de/thedevstack/conversationsplus/generator/IqGenerator.java b/src/main/java/de/thedevstack/conversationsplus/generator/IqGenerator.java index e3e13328..aa279e40 100644 --- a/src/main/java/de/thedevstack/conversationsplus/generator/IqGenerator.java +++ b/src/main/java/de/thedevstack/conversationsplus/generator/IqGenerator.java @@ -25,6 +25,7 @@ import de.thedevstack.conversationsplus.utils.Xmlns; import de.thedevstack.conversationsplus.xml.Element; import de.thedevstack.conversationsplus.xmpp.forms.Data; import de.thedevstack.conversationsplus.xmpp.jid.Jid; +import de.thedevstack.conversationsplus.xmpp.mam.Mam; import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; public class IqGenerator extends AbstractGenerator { @@ -46,14 +47,6 @@ public class IqGenerator extends AbstractGenerator { return packet; } - public IqPacket versionResponse(final IqPacket request) { - final IqPacket packet = request.generateResponse(IqPacket.TYPE.RESULT); - Element query = packet.query("jabber:iq:version"); - query.addChild("name").setContent(ConversationsPlusApplication.getName()); - query.addChild("version").setContent(ConversationsPlusApplication.getVersion()); - return packet; - } - protected IqPacket publish(final String node, final Element item) { final IqPacket packet = new IqPacket(IqPacket.TYPE.SET); final Element pubsub = packet.addChild("pubsub", @@ -155,10 +148,10 @@ public class IqGenerator extends AbstractGenerator { public IqPacket queryMessageArchiveManagement(final MessageArchiveService.Query mam) { final IqPacket packet = new IqPacket(IqPacket.TYPE.SET); - final Element query = packet.query("urn:xmpp:mam:0"); + final Element query = packet.query(Mam.NAMESPACE); query.setAttribute("queryid", mam.getQueryId()); final Data data = new Data(); - data.setFormType("urn:xmpp:mam:0"); + data.setFormType(Mam.NAMESPACE); if (mam.muc()) { packet.setTo(mam.getWith()); } else if (mam.getWith()!=null) { diff --git a/src/main/java/de/thedevstack/conversationsplus/generator/MessageGenerator.java b/src/main/java/de/thedevstack/conversationsplus/generator/MessageGenerator.java index 678f2c75..e76d25f6 100644 --- a/src/main/java/de/thedevstack/conversationsplus/generator/MessageGenerator.java +++ b/src/main/java/de/thedevstack/conversationsplus/generator/MessageGenerator.java @@ -16,6 +16,7 @@ import de.thedevstack.conversationsplus.entities.Conversation; import de.thedevstack.conversationsplus.entities.FileParams; import de.thedevstack.conversationsplus.entities.Message; import de.thedevstack.conversationsplus.xml.Element; +import de.thedevstack.conversationsplus.xmpp.carbons.Carbons; import de.thedevstack.conversationsplus.xmpp.chatstate.ChatState; import de.thedevstack.conversationsplus.xmpp.httpuploadim.HttpUploadHint; import de.thedevstack.conversationsplus.xmpp.jid.Jid; @@ -81,7 +82,7 @@ public class MessageGenerator extends AbstractGenerator { } public static void addMessageHints(MessagePacket packet) { - packet.addChild("private", "urn:xmpp:carbons:2"); + packet.addChild("private", Carbons.NAMESPACE); packet.addChild("no-copy", "urn:xmpp:hints"); packet.addChild("no-permanent-store", "urn:xmpp:hints"); packet.addChild("no-permanent-storage", "urn:xmpp:hints"); //do not copy this. this is wrong. it is *store* diff --git a/src/main/java/de/thedevstack/conversationsplus/parser/IqParser.java b/src/main/java/de/thedevstack/conversationsplus/parser/IqParser.java index 8af05df5..35b41d61 100644 --- a/src/main/java/de/thedevstack/conversationsplus/parser/IqParser.java +++ b/src/main/java/de/thedevstack/conversationsplus/parser/IqParser.java @@ -31,11 +31,16 @@ import de.thedevstack.conversationsplus.services.avatar.AvatarCache; import de.thedevstack.conversationsplus.services.avatar.AvatarService; import de.thedevstack.conversationsplus.services.XmppConnectionService; import de.thedevstack.conversationsplus.utils.Xmlns; +import de.thedevstack.conversationsplus.utils.XmppSendUtil; import de.thedevstack.conversationsplus.xml.Element; import de.thedevstack.conversationsplus.xmpp.OnIqPacketReceived; import de.thedevstack.conversationsplus.xmpp.OnUpdateBlocklist; +import de.thedevstack.conversationsplus.xmpp.iqversion.IqVersionPacket; +import de.thedevstack.conversationsplus.xmpp.iqversion.IqVersionPacketGenerator; import de.thedevstack.conversationsplus.xmpp.jid.Jid; import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; +import de.thedevstack.conversationsplus.xmpp.time.TimePacket; +import de.thedevstack.conversationsplus.xmpp.time.TimePacketGenerator; public class IqParser extends AbstractParser implements OnIqPacketReceived { @@ -323,12 +328,13 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { } else if (packet.hasChild("query", "http://jabber.org/protocol/disco#info")) { final IqPacket response = mXmppConnectionService.getIqGenerator().discoResponse(packet); mXmppConnectionService.sendIqPacket(account, response, null); - } else if (packet.hasChild("query","jabber:iq:version")) { - final IqPacket response = mXmppConnectionService.getIqGenerator().versionResponse(packet); - mXmppConnectionService.sendIqPacket(account,response,null); + } else if (packet.hasChild("query", IqVersionPacket.NAMESPACE)) { + XmppSendUtil.sendIqPacket(account, IqVersionPacketGenerator.generateResponse(packet), null); } else if (packet.hasChild("ping", "urn:xmpp:ping")) { final IqPacket response = packet.generateResponse(IqPacket.TYPE.RESULT); mXmppConnectionService.sendIqPacket(account, response, null); + } else if (packet.hasChild("time", TimePacket.NAMESPACE)) { + XmppSendUtil.sendIqPacket(account, TimePacketGenerator.generateResponse(packet), null); } else { if (packet.getType() == IqPacket.TYPE.GET || packet.getType() == IqPacket.TYPE.SET) { final IqPacket response = packet.generateResponse(IqPacket.TYPE.ERROR); diff --git a/src/main/java/de/thedevstack/conversationsplus/parser/MessageParser.java b/src/main/java/de/thedevstack/conversationsplus/parser/MessageParser.java index f282ae01..52d35f58 100644 --- a/src/main/java/de/thedevstack/conversationsplus/parser/MessageParser.java +++ b/src/main/java/de/thedevstack/conversationsplus/parser/MessageParser.java @@ -5,12 +5,18 @@ import android.util.Pair; import de.thedevstack.conversationsplus.entities.FileParams; import de.thedevstack.conversationsplus.enums.FileStatus; +import de.thedevstack.conversationsplus.persistance.DatabaseBackend; import de.thedevstack.conversationsplus.services.avatar.AvatarCache; import de.thedevstack.conversationsplus.services.filetransfer.http.download.AutomaticFileDownload; import de.thedevstack.conversationsplus.services.filetransfer.http.download.HttpRetrieveHead; import de.thedevstack.conversationsplus.utils.MessageUtil; +import de.thedevstack.conversationsplus.utils.UiUpdateHelper; +import de.thedevstack.conversationsplus.utils.XmppSendUtil; +import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacket; import de.thedevstack.conversationsplus.xmpp.avatar.AvatarPacketParser; +import de.thedevstack.conversationsplus.xmpp.carbons.Carbons; import de.thedevstack.conversationsplus.xmpp.httpuploadim.HttpUploadHint; +import de.thedevstack.conversationsplus.xmpp.mam.Mam; import de.tzur.conversations.Settings; import net.java.otr4j.session.Session; @@ -99,7 +105,7 @@ public class MessageParser extends AbstractParser implements return null; } else if (body == null && status == SessionStatus.FINISHED) { conversation.resetOtrSession(); - mXmppConnectionService.updateConversationUi(); + UiUpdateHelper.updateConversationUi(); return null; } else if (body == null || (body.isEmpty())) { return null; @@ -148,9 +154,9 @@ public class MessageParser extends AbstractParser implements Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, jid, true); if (!conversation.getMucOptions().online()) { conversation.getMucOptions().setPassword(password); - mXmppConnectionService.databaseBackend.updateConversation(conversation); + DatabaseBackend.getInstance().updateConversation(conversation); mXmppConnectionService.joinMuc(conversation); - mXmppConnectionService.updateConversationUi(); + UiUpdateHelper.updateConversationUi(); } return true; } @@ -189,24 +195,24 @@ public class MessageParser extends AbstractParser implements private void parseEvent(final Element event, final Jid from, final Account account) { Element items = event.findChild("items"); String node = items == null ? null : items.getAttribute("node"); - if ("urn:xmpp:avatar:metadata".equals(node)) { + if (AvatarPacket.NAMESPACE_AVATAR_METADATA.equals(node)) { Avatar avatar = AvatarPacketParser.parseMetadata(items); if (avatar != null) { avatar.owner = from.toBareJid(); if (AvatarUtil.isAvatarCached(avatar)) { if (account.getJid().toBareJid().equals(from)) { if (account.setAvatar(avatar.getFilename())) { - mXmppConnectionService.databaseBackend.updateAccount(account); + DatabaseBackend.getInstance().updateAccount(account); } AvatarCache.clear(account); - mXmppConnectionService.updateConversationUi(); - mXmppConnectionService.updateAccountUi(); + UiUpdateHelper.updateConversationUi(); + UiUpdateHelper.updateAccountUi(); } else { Contact contact = account.getRoster().getContact(from); contact.setAvatar(avatar); AvatarCache.clear(contact); - mXmppConnectionService.updateConversationUi(); - mXmppConnectionService.updateRosterUi(); + UiUpdateHelper.updateConversationUi(); + UiUpdateHelper.updateRosterUi(); } } else { AvatarService.getInstance().fetchAvatar(account, avatar); @@ -219,8 +225,8 @@ public class MessageParser extends AbstractParser implements Contact contact = account.getRoster().getContact(from); contact.setPresenceName(nick.getContent()); AvatarCache.clear(account); - mXmppConnectionService.updateConversationUi(); - mXmppConnectionService.updateAccountUi(); + UiUpdateHelper.updateConversationUi(); + UiUpdateHelper.updateAccountUi(); } } else if (ConversationsPlusPreferences.omemoEnabled() && AxolotlService.PEP_DEVICE_LIST.equals(node)) { Log.d(Config.LOGTAG, AxolotlServiceImpl.getLogprefix(account)+"Received PEP device list update from "+ from + ", processing..."); @@ -228,7 +234,7 @@ public class MessageParser extends AbstractParser implements Set deviceIds = mXmppConnectionService.getIqParser().deviceIds(item); AxolotlService axolotlService = account.getAxolotlService(); axolotlService.registerDevices(from, deviceIds); - mXmppConnectionService.updateAccountUi(); + UiUpdateHelper.updateAccountUi(); } } @@ -266,15 +272,15 @@ public class MessageParser extends AbstractParser implements final boolean isForwarded; boolean isCarbon = false; String serverMsgId = null; - final Element fin = original.findChild("fin", "urn:xmpp:mam:0"); + final Element fin = original.findChild("fin", Mam.NAMESPACE); if (fin != null) { mXmppConnectionService.getMessageArchiveService().processFin(fin,original.getFrom()); return; } - final Element result = original.findChild("result","urn:xmpp:mam:0"); + final Element result = original.findChild("result", Mam.NAMESPACE); final MessageArchiveService.Query query = result == null ? null : mXmppConnectionService.getMessageArchiveService().findQuery(result.getAttribute("queryid")); if (query != null && query.validFrom(original.getFrom())) { - Pair f = original.getForwardedMessagePacket("result", "urn:xmpp:mam:0"); + Pair f = original.getForwardedMessagePacket("result", Mam.NAMESPACE); if (f == null) { return; } @@ -288,8 +294,8 @@ public class MessageParser extends AbstractParser implements return; } else if (original.fromServer(account)) { Pair f; - f = original.getForwardedMessagePacket("received", "urn:xmpp:carbons:2"); - f = f == null ? original.getForwardedMessagePacket("sent", "urn:xmpp:carbons:2") : f; + f = original.getForwardedMessagePacket("received", Carbons.NAMESPACE); + f = f == null ? original.getForwardedMessagePacket("sent", Carbons.NAMESPACE) : f; packet = f != null ? f.first : original; if (handleErrorMessage(account, packet)) { return; @@ -339,7 +345,7 @@ public class MessageParser extends AbstractParser implements } if (extractChatState(mXmppConnectionService.find(account, counterpart.toBareJid()), packet)) { - mXmppConnectionService.updateConversationUi(); + UiUpdateHelper.updateConversationUi(); } if ((body != null || pgpEncrypted != null || axolotlEncrypted != null) && !isMucStatusMessage) { @@ -455,7 +461,7 @@ public class MessageParser extends AbstractParser implements } if (query == null) { - mXmppConnectionService.updateConversationUi(); + UiUpdateHelper.updateConversationUi(); } if (Settings.CONFIRM_MESSAGE_READ && remoteMsgId != null && !isForwarded && !isTypeGroupChat) { @@ -477,7 +483,7 @@ public class MessageParser extends AbstractParser implements } } if (message.getEncryption() == Message.ENCRYPTION_NONE || !ConversationsPlusPreferences.dontSaveEncrypted()) { - mXmppConnectionService.databaseBackend.createMessage(message); + DatabaseBackend.getInstance().createMessage(message); } if (message.trusted() && message.treatAsDownloadable() != Message.Decision.NEVER @@ -511,7 +517,7 @@ public class MessageParser extends AbstractParser implements mXmppConnectionService.pushBookmarks(account); } } - mXmppConnectionService.updateConversationUi(); + UiUpdateHelper.updateConversationUi(); return; } } @@ -580,7 +586,7 @@ public class MessageParser extends AbstractParser implements packet, receiptsNamespaces, packet.getType()); - mXmppConnectionService.sendMessagePacket(account, receipt); + XmppSendUtil.sendMessagePacket(account, receipt); } } } diff --git a/src/main/java/de/thedevstack/conversationsplus/services/XmppConnectionService.java b/src/main/java/de/thedevstack/conversationsplus/services/XmppConnectionService.java index 51aee921..ac6ef464 100644 --- a/src/main/java/de/thedevstack/conversationsplus/services/XmppConnectionService.java +++ b/src/main/java/de/thedevstack/conversationsplus/services/XmppConnectionService.java @@ -64,6 +64,7 @@ import de.thedevstack.conversationsplus.utils.MessageUtil; import de.thedevstack.conversationsplus.utils.UiUpdateHelper; import de.thedevstack.conversationsplus.utils.XmppConnectionServiceAccessor; import de.thedevstack.conversationsplus.utils.XmppSendUtil; +import de.thedevstack.conversationsplus.xmpp.mam.Mam; import de.tzur.conversations.Settings; import de.thedevstack.conversationsplus.Config; import de.thedevstack.conversationsplus.R; @@ -2621,11 +2622,11 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa public void fetchMamPreferences(Account account, final OnMamPreferencesFetched callback) { IqPacket request = new IqPacket(IqPacket.TYPE.GET); - request.addChild("prefs","urn:xmpp:mam:0"); + request.addChild("prefs", Mam.NAMESPACE); sendIqPacket(account, request, new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { - Element prefs = packet.findChild("prefs","urn:xmpp:mam:0"); + Element prefs = packet.findChild("prefs", Mam.NAMESPACE); if (packet.getType() == IqPacket.TYPE.RESULT && prefs != null) { callback.onPreferencesFetched(prefs); } else { diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java index dfea06c8..54db5346 100644 --- a/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/XmppConnection.java @@ -71,6 +71,7 @@ import de.thedevstack.conversationsplus.xml.Element; import de.thedevstack.conversationsplus.xml.Tag; import de.thedevstack.conversationsplus.xml.TagWriter; import de.thedevstack.conversationsplus.xml.XmlReader; +import de.thedevstack.conversationsplus.xmpp.carbons.Carbons; import de.thedevstack.conversationsplus.xmpp.filetransfer.http.FileTransferHttp; import de.thedevstack.conversationsplus.xmpp.filetransfer.http.upload.HttpUpload; import de.thedevstack.conversationsplus.xmpp.forms.Data; @@ -79,6 +80,7 @@ import de.thedevstack.conversationsplus.xmpp.jid.InvalidJidException; import de.thedevstack.conversationsplus.xmpp.jid.Jid; import de.thedevstack.conversationsplus.xmpp.jingle.OnJinglePacketReceived; import de.thedevstack.conversationsplus.xmpp.jingle.stanzas.JinglePacket; +import de.thedevstack.conversationsplus.xmpp.mam.Mam; import de.thedevstack.conversationsplus.xmpp.stanzas.AbstractAcknowledgeableStanza; import de.thedevstack.conversationsplus.xmpp.stanzas.AbstractStanza; import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; @@ -1133,7 +1135,7 @@ public class XmppConnection implements Runnable { private void sendEnableCarbons() { final IqPacket iq = new IqPacket(IqPacket.TYPE.SET); - iq.addChild("enable", "urn:xmpp:carbons:2"); + iq.addChild("enable", Carbons.NAMESPACE); this.sendIqPacket(iq, new OnIqPacketReceived() { @Override @@ -1490,7 +1492,7 @@ public class XmppConnection implements Runnable { } public boolean carbons() { - return hasDiscoFeature(account.getServer(), "urn:xmpp:carbons:2"); + return hasDiscoFeature(account.getServer(), Carbons.NAMESPACE); } public boolean blocking() { @@ -1525,8 +1527,8 @@ public class XmppConnection implements Runnable { } public boolean mam() { - return hasDiscoFeature(account.getJid().toBareJid(), "urn:xmpp:mam:0") - || hasDiscoFeature(account.getServer(), "urn:xmpp:mam:0"); + return hasDiscoFeature(account.getJid().toBareJid(), Mam.NAMESPACE) + || hasDiscoFeature(account.getServer(), Mam.NAMESPACE); } public boolean push() { diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacket.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacket.java new file mode 100644 index 00000000..86cb2274 --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacket.java @@ -0,0 +1,8 @@ +package de.thedevstack.conversationsplus.xmpp.avatar; + +/** + */ +public class AvatarPacket { + public static final String NAMESPACE_AVATAR_DATA = "urn:xmpp:avatar:data"; + public static final String NAMESPACE_AVATAR_METADATA = "urn:xmpp:avatar:metadata"; +} diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacketGenerator.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacketGenerator.java index 4534e870..f9e04122 100644 --- a/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacketGenerator.java +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacketGenerator.java @@ -9,11 +9,9 @@ import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; /** * Generates the IQ Packets for handling Avatars * as defined in XEP-0084. - * @see {@link http://xmpp.org/extensions/xep-0084.html} + * @see http://xmpp.org/extensions/xep-0084.html */ public final class AvatarPacketGenerator { - public static final String NAMESPACE_AVATAR_DATA = "urn:xmpp:avatar:data"; - public static final String NAMESPACE_AVATAR_METADATA = "urn:xmpp:avatar:metadata"; /** * Generates an IqPacket for publishing avatar data. @@ -37,9 +35,9 @@ public final class AvatarPacketGenerator { public static IqPacket generatePublishAvatarPacket(Avatar avatar) { final Element item = new Element("item"); item.setAttribute("id", avatar.sha1sum); - final Element data = item.addChild("data", NAMESPACE_AVATAR_DATA); + final Element data = item.addChild("data", AvatarPacket.NAMESPACE_AVATAR_DATA); data.setContent(avatar.image); - return PubSubPacketGenerator.generatePubSubPublishPacket(NAMESPACE_AVATAR_DATA, item); + return PubSubPacketGenerator.generatePubSubPublishPacket(AvatarPacket.NAMESPACE_AVATAR_DATA, item); } /** @@ -60,7 +58,7 @@ public final class AvatarPacketGenerator { public static IqPacket generateRetrieveAvatarPacket(Avatar avatar) { final Element item = new Element("item"); item.setAttribute("id", avatar.sha1sum); - final IqPacket packet = PubSubPacketGenerator.generatePubSubRetrievePacket(NAMESPACE_AVATAR_DATA, item); + final IqPacket packet = PubSubPacketGenerator.generatePubSubRetrievePacket(AvatarPacket.NAMESPACE_AVATAR_DATA, item); packet.setTo(avatar.owner); return packet; } @@ -91,14 +89,14 @@ public final class AvatarPacketGenerator { public static IqPacket generatePublishAvatarMetadataPacket(Avatar avatar) { final Element item = new Element("item"); item.setAttribute("id", avatar.sha1sum); - final Element metadata = item.addChild("metadata", NAMESPACE_AVATAR_METADATA); + final Element metadata = item.addChild("metadata", AvatarPacket.NAMESPACE_AVATAR_METADATA); final Element info = metadata.addChild("info"); info.setAttribute("bytes", avatar.size); info.setAttribute("id", avatar.sha1sum); info.setAttribute("height", avatar.height); info.setAttribute("width", avatar.height); info.setAttribute("type", avatar.type); - return PubSubPacketGenerator.generatePubSubPublishPacket(NAMESPACE_AVATAR_METADATA, item); + return PubSubPacketGenerator.generatePubSubPublishPacket(AvatarPacket.NAMESPACE_AVATAR_METADATA, item); } /** @@ -108,7 +106,7 @@ public final class AvatarPacketGenerator { * @return the IqPacket */ public static IqPacket generateRetrieveAvatarMetadataPacket(Jid to) { - final IqPacket packet = PubSubPacketGenerator.generatePubSubRetrievePacket(NAMESPACE_AVATAR_METADATA, null); + final IqPacket packet = PubSubPacketGenerator.generatePubSubRetrievePacket(AvatarPacket.NAMESPACE_AVATAR_METADATA, null); if (to != null) { packet.setTo(to); } diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacketParser.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacketParser.java index 175f54bd..e9f90898 100644 --- a/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacketParser.java +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/avatar/AvatarPacketParser.java @@ -8,7 +8,7 @@ import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; /** * Parses the IQ Packets for handling Avatars * as defined in XEP-0084. - * @see {@link http://xmpp.org/extensions/xep-0084.html} + * @see http://xmpp.org/extensions/xep-0084.html */ public class AvatarPacketParser { /** @@ -22,7 +22,7 @@ public class AvatarPacketParser { if (null != items) { Element item = items.findChild("item"); if (null != item) { - base64Avatar = item.findChildContent("data", AvatarPacketGenerator.NAMESPACE_AVATAR_DATA); + base64Avatar = item.findChildContent("data", AvatarPacket.NAMESPACE_AVATAR_DATA); } } return base64Avatar; diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/carbons/Carbons.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/carbons/Carbons.java new file mode 100644 index 00000000..89b9317b --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/carbons/Carbons.java @@ -0,0 +1,7 @@ +package de.thedevstack.conversationsplus.xmpp.carbons; + +/** + */ +public interface Carbons { + String NAMESPACE = "urn:xmpp:carbons:2"; +} diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/chatstate/ChatState.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/chatstate/ChatState.java index 323d99c2..805e1f33 100644 --- a/src/main/java/de/thedevstack/conversationsplus/xmpp/chatstate/ChatState.java +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/chatstate/ChatState.java @@ -5,9 +5,9 @@ import de.thedevstack.conversationsplus.xml.Element; public enum ChatState { ACTIVE, INACTIVE, GONE, COMPOSING, PAUSED; + public static final String NAMESPACE = "http://jabber.org/protocol/chatstates"; public static ChatState parse(Element element) { - final String NAMESPACE = "http://jabber.org/protocol/chatstates"; if (element.hasChild("active",NAMESPACE)) { return ACTIVE; } else if (element.hasChild("inactive",NAMESPACE)) { @@ -24,7 +24,6 @@ public enum ChatState { } public static Element toElement(ChatState state) { - final String NAMESPACE = "http://jabber.org/protocol/chatstates"; final Element element = new Element(state.toString().toLowerCase()); element.setAttribute("xmlns",NAMESPACE); return element; diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/iqversion/IqVersionPacket.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/iqversion/IqVersionPacket.java new file mode 100644 index 00000000..a3cecdac --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/iqversion/IqVersionPacket.java @@ -0,0 +1,23 @@ +package de.thedevstack.conversationsplus.xmpp.iqversion; + +import android.os.Build; + +import de.thedevstack.conversationsplus.ConversationsPlusApplication; +import de.thedevstack.conversationsplus.xml.Element; +import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; + +/** + * Representation of an software version packet as defined in XEP-0092. + * @see http://xmpp.org/extensions/xep-0092.html + */ +public class IqVersionPacket extends IqPacket { + public static final String NAMESPACE = "jabber:iq:version"; + + IqVersionPacket() { + super(IqPacket.TYPE.RESULT); + Element query = this.addChild("query", NAMESPACE); + query.addChild("name").setContent(ConversationsPlusApplication.getName()); + query.addChild("version").setContent(ConversationsPlusApplication.getVersion()); + query.addChild("os").setContent("Android " + Build.VERSION.RELEASE); + } +} diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/iqversion/IqVersionPacketGenerator.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/iqversion/IqVersionPacketGenerator.java new file mode 100644 index 00000000..97a7e90d --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/iqversion/IqVersionPacketGenerator.java @@ -0,0 +1,38 @@ +package de.thedevstack.conversationsplus.xmpp.iqversion; + +import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; + +/** + * Generates the IQ Packets for Software Version + * as defined in XEP-0092. + * @see http://xmpp.org/extensions/xep-0092.html + */ +public final class IqVersionPacketGenerator { + + /** + * Generates the IqPacket to reply the software version. + *
+     * 
+     *   
+     *     Exodus
+     *     0.7.0.4
+     *     Windows-XP 5.01.2600
+     *   
+     * 
+     * 
+ * @param packet the packet to respond to + * @return + */ + public static IqVersionPacket generateResponse(IqPacket packet) { + IqVersionPacket iqVersionPacket = new IqVersionPacket(); + iqVersionPacket.setTo(packet.getFrom()); + iqVersionPacket.setId(packet.getId()); + + return iqVersionPacket; + } + + private IqVersionPacketGenerator() {} +} diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/mam/Mam.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/mam/Mam.java new file mode 100644 index 00000000..e2228b32 --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/mam/Mam.java @@ -0,0 +1,7 @@ +package de.thedevstack.conversationsplus.xmpp.mam; + +/** + */ +public interface Mam { + String NAMESPACE = "urn:xmpp:mam:0"; +} diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/time/TimePacket.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/time/TimePacket.java new file mode 100644 index 00000000..d8756d41 --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/time/TimePacket.java @@ -0,0 +1,35 @@ +package de.thedevstack.conversationsplus.xmpp.time; + +import java.util.Locale; +import java.util.TimeZone; + +import de.thedevstack.conversationsplus.generator.AbstractGenerator; +import de.thedevstack.conversationsplus.xml.Element; +import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; + +/** + * Representation of an software version packet as defined in XEP-0202. + * @see http://xmpp.org/extensions/xep-0202.html + */ +public class TimePacket extends IqPacket { + public static final String NAMESPACE = "urn:xmpp:time"; + + TimePacket() { + super(IqPacket.TYPE.RESULT); + Element time = this.addChild("time", NAMESPACE); + final long now = System.currentTimeMillis(); + time.addChild("utc").setContent(AbstractGenerator.getTimestamp(now)); + TimeZone ourTimezone = TimeZone.getDefault(); + long offsetSeconds = ourTimezone.getOffset(now) / 1000; + long offsetMinutes = Math.abs((offsetSeconds % 3600) / 60); + long offsetHours = offsetSeconds / 3600; + String hours; + if (offsetHours < 0) { + hours = String.format(Locale.US, "%03d", offsetHours); + } else { + hours = String.format(Locale.US, "%02d", offsetHours); + } + String minutes = String.format(Locale.US, "%02d", offsetMinutes); + time.addChild("tzo").setContent(hours + ":" + minutes); + } +} diff --git a/src/main/java/de/thedevstack/conversationsplus/xmpp/time/TimePacketGenerator.java b/src/main/java/de/thedevstack/conversationsplus/xmpp/time/TimePacketGenerator.java new file mode 100644 index 00000000..344beb9e --- /dev/null +++ b/src/main/java/de/thedevstack/conversationsplus/xmpp/time/TimePacketGenerator.java @@ -0,0 +1,38 @@ +package de.thedevstack.conversationsplus.xmpp.time; + +import de.thedevstack.conversationsplus.xmpp.iqversion.IqVersionPacket; +import de.thedevstack.conversationsplus.xmpp.stanzas.IqPacket; + +/** + * Generates the IQ Packets for Entity Time + * as defined in XEP-0202. + * @see http://xmpp.org/extensions/xep-0202.html + */ +public final class TimePacketGenerator { + + /** + * Generates the IqPacket to reply the entity time. + *
+     * 
+     *   
+     * 
+     * 
+ * @param packet + * @return + */ + public static TimePacket generateResponse(IqPacket packet) { + TimePacket timePacket = new TimePacket(); + timePacket.setTo(packet.getFrom()); + timePacket.setId(packet.getId()); + + return timePacket; + } + + private TimePacketGenerator() {} +} -- cgit v1.2.3