Search code examples
androidsmack

onReceiptReceived is never handled for DelieveryReceipts


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,


Solution

  • 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());
                            }
                        }
    ......