Openfire 4.0.2
smack 4.1.7
Android Studio 2.1.2
I am trying to use DeliveryReceipts so that I know that the message has been sent. However, onReceiptReceived
is never called.
I have done the following:
DeliveryReceiptManager deliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(mClientConnection);
deliveryReceiptManager.autoAddDeliveryReceiptRequests();
DeliveryReceiptManager.setDefaultAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
deliveryReceiptManager.addReceiptReceivedListener(new ReceiptReceivedListener() {
@Override
public void onReceiptReceived(String fromJid, String toJid, String receiptId, Stanza receipt) {
log.log(Level.INFO, "OnReceiptReceived fromJid: " + fromJid + " toJid: " + toJid + " receiptId: " + receiptId);
}
});
Sending the message:
ChatManager chatManager = ChatManager.getInstanceFor(mClientConnection);
Message msg = new Message(username, Message.Type.chat);
msg.setBody(message);
final String msgReceipt = DeliveryReceiptRequest.addTo(msg);
log.log(Level.INFO, "msgReceiptRequest: " + msgReceipt);
Chat chat = chatManager.createChat(username, mChatMessageListener);
chat.sendMessage(message);
Send from the client
SENT (0): <message to='97.steve@xmpp1.call-genie.com' id='6xS4w-43' type='chat'><body>hello</body><thread>32091ad3-8da9-4758-9656-c06eb72532a2</thread><request xmlns='urn:xmpp:receipts'/></message>
On the receiving client
<message to='97.steve@xmpp1.call-genie.com' id='6xS4w-43' type='chat'><body>hello</body><thread>32091ad3-8da9-4758-9656-c06eb72532a2</thread><request xmlns='urn:xmpp:receipts'/></message>
onReceiptReceived
is never handled so I don't know if the receiving client received the message
I have tried to do something like this when the client receives the message which I was thinking to send back which might trigger the onReceiptReceived event
chat.addMessageListener(new ChatMessageListener() {
@Override
public void processMessage(Chat chat, Message msg) {
if(!msg.getBody().isEmpty()) {
Message ms = new Message();
ms.addBody("EN", "delivered");
ms.setTo(msg.getFrom());
ms.setStanzaId(msg.getStanzaId());
DeliveryReceiptRequest.addTo(ms);
mClientConnection.sendStanza(ms);
}
log.log(Level.INFO, "receiveChatMessages Received prompted message: " + msg.getBody());
}
}
Many thanks for any suggestions,
I have managed to solve this by manually sending the receipt. When the client how received the message I have manually sent back the receipt to the sender.
mChatMessageListener = new ChatMessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
log.log(Level.INFO, "Received message: " + message.getBody() + " from: " + chat.getParticipant());
if(message != null || !message.getBody().isEmpty()) {
DeliveryReceiptManager deliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(mClientConnection);
if(DeliveryReceiptManager.hasDeliveryReceiptRequest(message)) {
log.log(Level.INFO, "hasDeliveryReceiptRequest == true");
Stanza received = new Message();
received.addExtension(new DeliveryReceipt(message.getStanzaId()));
received.setTo(message.getFrom());
try {
mClientConnection.sendStanza(received);
}
catch(NotConnectedException ex) {
log.log(Level.SEVERE, "NotConnectedException: " + ex.getMessage());
}
catch(Exception ex) {
log.log(Level.SEVERE, "Exception: " + ex.getMessage());
}
}
......