diff --git a/documentation/extensions/index.md b/documentation/extensions/index.md index b333e2024..4c8aad88d 100644 --- a/documentation/extensions/index.md +++ b/documentation/extensions/index.md @@ -70,6 +70,7 @@ Smack Extensions and currently supported XEPs of smack-extensions | Bits of Binary | [XEP-0231](https://xmpp.org/extensions/xep-0231.html) | n/a | Including or referring to small bits of binary data in an XML stanza. | | Best Practices for Resource Locking | [XEP-0296](https://xmpp.org/extensions/xep-0296.html) | n/a | Specifies best practices to be followed by Jabber/XMPP clients about when to lock into, and unlock away from, resources. | | Last Message Correction | [XEP-0308](https://xmpp.org/extensions/xep-0308.html) | n/a | Provides a method for indicating that a message is a correction of the last sent message. | +| Last User Interaction in Presence | [XEP-0319](https://xmpp.org/extensions/xep-0319.html) | n/a | Communicate time of last user interaction via XMPP presence notifications. | | [Group Chat Invitations](invitation.md) | n/a | n/a | Send invitations to other users to join a group chat room. | | [Jive Properties](properties.md) | n/a | n/a | TODO | diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/element/IdleElement.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/element/IdleElement.java new file mode 100644 index 000000000..85c383b2c --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/element/IdleElement.java @@ -0,0 +1,101 @@ +/** + * + * Copyright © 2018 Paul Schaub + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.last_interaction.element; + +import java.util.Date; + +import org.jivesoftware.smack.packet.ExtensionElement; +import org.jivesoftware.smack.packet.Presence; +import org.jivesoftware.smack.util.Objects; +import org.jivesoftware.smack.util.XmlStringBuilder; + +public class IdleElement implements ExtensionElement { + + public static final String NAMESPACE = "urn:xmpp:idle:1"; + public static final String ELEMENT = "idle"; + public static final String ATTR_SINCE = "since"; + + private final Date since; + + /** + * Create a new IdleElement with the current date as date of last user interaction. + */ + public IdleElement() { + this(new Date()); + } + + /** + * Create a new IdleElement. + * @param since date of last user interaction + */ + public IdleElement(Date since) { + this.since = Objects.requireNonNull(since); + } + + /** + * Return the value of last user interaction. + * @return date of last interaction + */ + public Date getSince() { + return since; + } + + /** + * Add an Idle element with current date to the presence. + * @param presence presence + */ + public static void addToPresence(Presence presence) { + presence.addExtension(new IdleElement()); + } + + /** + * Return the IdleElement from a presence. + * Returns null, if no IdleElement found. + * + * @param presence presence + * @return idleElement from presence or null + */ + public static IdleElement fromPresence(Presence presence) { + return presence.getExtension(ELEMENT, NAMESPACE); + } + + /** + * {@inheritDoc} + */ + @Override + public String getNamespace() { + return NAMESPACE; + } + + /** + * {@inheritDoc} + */ + @Override + public String getElementName() { + return ELEMENT; + } + + /** + * {@inheritDoc} + */ + @Override + public XmlStringBuilder toXML() { + return new XmlStringBuilder(this) + .attribute(ATTR_SINCE, since) + .closeEmptyElement(); + } +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/element/package-info.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/element/package-info.java new file mode 100644 index 000000000..28fb57a4a --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/element/package-info.java @@ -0,0 +1,21 @@ +/** + * + * Copyright © 2018 Paul Schaub + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Element classes for XEP-0319: Last User Interaction in Presence. + */ +package org.jivesoftware.smackx.last_interaction.element; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/package-info.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/package-info.java new file mode 100644 index 000000000..8a314022b --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/package-info.java @@ -0,0 +1,21 @@ +/** + * + * Copyright © 2018 Paul Schaub + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Smack's API for XEP-0319: Last User Interaction in Presence. + */ +package org.jivesoftware.smackx.last_interaction; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/provider/IdleProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/provider/IdleProvider.java new file mode 100644 index 000000000..102edc7df --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/provider/IdleProvider.java @@ -0,0 +1,40 @@ +/** + * + * Copyright © 2018 Paul Schaub + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.last_interaction.provider; + +import java.util.Date; + +import org.jivesoftware.smack.provider.ExtensionElementProvider; +import org.jivesoftware.smackx.last_interaction.element.IdleElement; + +import org.jxmpp.util.XmppDateTime; +import org.xmlpull.v1.XmlPullParser; + +public class IdleProvider extends ExtensionElementProvider { + + public static final IdleProvider TEST_INSTANCE = new IdleProvider(); + + /** + * {@inheritDoc} + */ + @Override + public IdleElement parse(XmlPullParser parser, int initialDepth) throws Exception { + String dateString = parser.getAttributeValue(null, IdleElement.ATTR_SINCE); + Date since = XmppDateTime.parseXEP0082Date(dateString); + return new IdleElement(since); + } +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/provider/package-info.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/provider/package-info.java new file mode 100644 index 000000000..99d31d50a --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/last_interaction/provider/package-info.java @@ -0,0 +1,21 @@ +/** + * + * Copyright © 2018 Paul Schaub + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Provider classes for XEP-0319: Last User Interaction in Presence. + */ +package org.jivesoftware.smackx.last_interaction.provider; diff --git a/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers b/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers index 41705f0ca..70e2c94e0 100644 --- a/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers +++ b/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers @@ -514,7 +514,14 @@ urn:xmpp:message-correct:0 org.jivesoftware.smackx.message_correct.provider.MessageCorrectProvider - + + + + idle + urn:xmpp:idle:1 + org.jivesoftware.smackx.last_interaction.provider.IdleProvider + + blocklist diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/last_interaction/IdleTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/last_interaction/IdleTest.java new file mode 100644 index 000000000..59bee0cf0 --- /dev/null +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/last_interaction/IdleTest.java @@ -0,0 +1,57 @@ +/** + * + * Copyright © 2018 Paul Schaub + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.last_interaction; + +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNotNull; +import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; + +import java.util.Date; + +import org.jivesoftware.smack.packet.Presence; +import org.jivesoftware.smack.test.util.SmackTestSuite; +import org.jivesoftware.smack.test.util.TestUtils; +import org.jivesoftware.smackx.last_interaction.element.IdleElement; +import org.jivesoftware.smackx.last_interaction.provider.IdleProvider; + +import org.junit.Test; +import org.jxmpp.util.XmppDateTime; +import org.xmlpull.v1.XmlPullParser; + +public class IdleTest extends SmackTestSuite { + + @Test + public void providerTest() throws Exception { + String xml = ""; + XmlPullParser parser = TestUtils.getParser(xml); + assertNotNull(parser); + IdleElement parsed = IdleProvider.TEST_INSTANCE.parse(parser); + Date date = XmppDateTime.parseXEP0082Date("1969-07-21T02:56:15Z"); + assertEquals(date, parsed.getSince()); + + IdleElement element = new IdleElement(date); + assertXMLEqual("", element.toXML().toString()); + } + + @Test + public void helperTest() { + Presence presence = new Presence(Presence.Type.available); + IdleElement.addToPresence(presence); + IdleElement element = IdleElement.fromPresence(presence); + assertNotNull(element); + } +}