diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/ChatMarkersManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/ChatMarkersManager.java index e203edcc73..c26ee433a3 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/ChatMarkersManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/chat_markers/ChatMarkersManager.java @@ -37,11 +37,13 @@ import org.jivesoftware.smack.filter.MessageTypeFilter; import org.jivesoftware.smack.filter.MessageWithBodiesFilter; import org.jivesoftware.smack.filter.NotFilter; +import org.jivesoftware.smack.filter.OrFilter; import org.jivesoftware.smack.filter.PossibleFromTypeFilter; import org.jivesoftware.smack.filter.StanzaExtensionFilter; import org.jivesoftware.smack.filter.StanzaFilter; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Stanza; +import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements; import org.jivesoftware.smackx.chat_markers.filter.ChatMarkersFilter; import org.jivesoftware.smackx.chat_markers.filter.EligibleForChatMarkerFilter; @@ -73,14 +75,14 @@ public void connectionCreated(XMPPConnection connection) { // @FORMATTER:OFF private static final StanzaFilter INCOMING_MESSAGE_FILTER = new AndFilter( - MessageTypeFilter.NORMAL_OR_CHAT, + new OrFilter(MessageTypeFilter.NORMAL_OR_CHAT, MessageTypeFilter.GROUPCHAT), new StanzaExtensionFilter(ChatMarkersElements.NAMESPACE), PossibleFromTypeFilter.ENTITY_BARE_JID, EligibleForChatMarkerFilter.INSTANCE ); private static final StanzaFilter OUTGOING_MESSAGE_FILTER = new AndFilter( - MessageTypeFilter.NORMAL_OR_CHAT, + new OrFilter(MessageTypeFilter.NORMAL_OR_CHAT, MessageTypeFilter.GROUPCHAT), MessageWithBodiesFilter.INSTANCE, new NotFilter(ChatMarkersFilter.INSTANCE), EligibleForChatMarkerFilter.INSTANCE @@ -144,7 +146,6 @@ public void processStanza(Stanza packet) // Note that this listener is used together with a PossibleFromTypeFilter.ENTITY_BARE_JID filter, hence // every message is guaranteed to have a from address which is representable as bare JID. EntityBareJid bareFrom = message.getFrom().asEntityBareJidOrThrow(); - final Chat chat = chatManager.chatWith(bareFrom); asyncButOrdered.performAsyncButOrdered(chat, new Runnable() { @@ -218,4 +219,45 @@ public synchronized boolean removeIncomingChatMarkerMessageListener(ChatMarkersL } return res; } + + /** + * Send a message stanza to the recipient defined in the To getter from the Message. + * + * @param message instance of {@link Message} with a To previous defined. + * @param chatMarkersState one of the values given in {@link ChatMarkersState}. + * @param messageId id of the message to be updated. + * @throws NotConnectedException if the connection is not connected. + * @throws InterruptedException if the connection is interrupted. + * @throws IllegalStateException if one of the params don't match the rules. + */ + public void markMessage(Message message, ChatMarkersState chatMarkersState, String messageId) + throws + NotConnectedException, + InterruptedException, + IllegalStateException { + Objects.requireNonNull(message, "Message must not be null"); + + if (message.getTo() == null) { + throw new IllegalStateException("To attribute must not be null"); + } + + if (!message.hasStanzaIdSet()) { + message.setStanzaId(); + } + + switch (chatMarkersState) { + case received: + message.addExtension(new ChatMarkersElements.ReceivedExtension(messageId)); + break; + case displayed: + message.addExtension(new ChatMarkersElements.DisplayedExtension(messageId)); + break; + case acknowledged: + message.addExtension(new ChatMarkersElements.AcknowledgedExtension(messageId)); + break; + default: + throw new IllegalStateException("markable is automatically set in outgoing messages."); + } + connection().sendStanza(message); + } }