3

I'm developing IM application. I want to get acknowledgement at the time of

when message is received by the Openfire server

I have used below gradles

//XMPP Gradles
compile 'org.igniterealtime.smack:smack-android:4.1.0'
compile 'org.igniterealtime.smack:smack-tcp:4.1.0'
compile 'org.igniterealtime.smack:smack-im:4.1.0'
compile 'org.igniterealtime.smack:smack-extensions:4.1.0'

Note: I have already gone through each and every StackOverflow links and conclude that Openfire doesn't support XEP-0184, and it describes a mechanism for delivery receipts only.

I have also tried DeliveryReceiptManager and set their addReceiptReceivedListener but its not working.

Any workarounds or suggestions will be appreciated.

Maddy
  • 4,525
  • 4
  • 33
  • 53
Radhey
  • 2,139
  • 2
  • 24
  • 42

2 Answers2

1

It is better to attach a common listener to every sent message and update your database(and hence your UI) accordingly.

Define a random UUID for each outgoing message:

String stanzaId = UUID.randomUUID().toString()

Attach the listener to your message:

xmppTcpConnection.addStanzaIdAcknowledgedListener(stanzaId , new StanzaListener()
{
    @Override
    public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException
    {
     // You can match your stanzaId here!
     // packet.getStanzaId()   
    }
});

add:

compile "org.igniterealtime.smack:smack-tcp:4.2.0"

to get XMPPTCPConnection object.

Update: Try adding the listener before calling connect() on the xmppTcpConnection object.

Sarthak Mittal
  • 5,794
  • 2
  • 24
  • 44
0

while sending message attach DeliveryReceiptRequest.addTo(msg);

like this

Message msg = new Message(oppositeUserId, Message.Type.chat);
msg.setBody(mMessageBody);
msg.setStanzaId(messageId);
msg.setFrom(loginUserId);

DeliveryReceiptRequest.addTo(msg);

mXMPPTCPConnection.sendStanza(msg);

XmppDeliveryReceiptManager.java

public class XmppDeliveryReceiptManager implements ReceiptReceivedListener {


    private static final String TAG = XmppDeliveryReceiptManager.class.getSimpleName();

    Context mContext;


    public XmppDeliveryReceiptManager(Context mContext) {
       this.mContext = mContext;
       Log.d(TAG, "XmppDeliveryReceiptManager : initialized ");
    }

    @Override
    public void onReceiptReceived(String fromJid, String toJid, String receiptId, Stanza receipt) {
        Log.d(TAG, "onReceiptReceived : receiptId = " + receiptId);
        // do need full with "receiptId"         
    }
}

add this to your XMPP configuration

/*  Add XMPP DeliveryReceiptManager */
ProviderManager.addExtensionProvider(DeliveryReceipt.ELEMENT,
            DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());
ProviderManager.addExtensionProvider(DeliveryReceiptRequest.ELEMENT,
            new DeliveryReceiptRequest().getNamespace(), new DeliveryReceiptRequest.Provider());

mXmppDeliveryReceiptManager = new XmppDeliveryReceiptManager(mContext);
mDeliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(mXMPPTCPConnection);
mDeliveryReceiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
        mDeliveryReceiptManager.addReceiptReceivedListener(mXmppDeliveryReceiptManager);
Maddy
  • 4,525
  • 4
  • 33
  • 53