androidxmpppingsmackasmack

How to enable the XEP-0199 in Smack?


I'm using aSmack. My app listens a chatroom and reacts to the messages but it never send a message. The app doesn't receive more messages if the chatroom remains in silence for a while and then a new message is sent. I researched and I think that XEP-0199 is the solution here. I see that @Flow (the current Smack maintainer) implemented it and the issue related was closed.

I think that I need to use PingProvider but I really don't know how to connect this class with the Connection.

How can I enable the XEP-0199? How can I use PingProvider?


Connection code:

smack = SmackAndroid.init(getActivity().getApplicationContext());
connection = new XMPPConnection(App.getServer());
connection.addConnectionListener(new ConnectionListener() {

    private final static String SMACK = "SMACK";

    @Override
    public void reconnectionSuccessful() {
        Log.i(SMACK , "reconnectionSuccessful");
    }

    @Override
    public void reconnectionFailed(Exception e) {
        Log.i(SMACK, "reconnectionFailed", e);
    }

    @Override
    public void reconnectingIn(int seconds) {
        Log.i(SMACK, "reconnectingIn " + seconds);
    }

    @Override
    public void connectionClosedOnError(Exception e) {
        Log.i(SMACK, "connectionClosedOnError", e);
    }

    @Override
    public void connectionClosed() {
        Log.i(SMACK, "connectionClosed");
    }
});
connection.connect();
connection.login(user, password);

Solution

  • I fix the problem implementing the ping response manually:

    connection.addPacketListener(new PacketListener() {
    
        @Override
        public void processPacket(Packet packet) {
            connection.sendPacket(new Pong((Ping) packet));
        }
    }, new PacketFilter() {
    
        @Override
        public boolean accept(Packet packet) {
            return packet instanceof Ping;
        }
    });