PingManager.java

 1package eu.siacs.conversations.xmpp.manager;
 2
 3import android.content.Context;
 4import androidx.annotation.NonNull;
 5import com.google.common.util.concurrent.FutureCallback;
 6import com.google.common.util.concurrent.Futures;
 7import com.google.common.util.concurrent.MoreExecutors;
 8import eu.siacs.conversations.xmpp.XmppConnection;
 9import im.conversations.android.xmpp.model.ping.Ping;
10import im.conversations.android.xmpp.model.stanza.Iq;
11import java.util.concurrent.TimeoutException;
12
13public class PingManager extends AbstractManager {
14
15    public PingManager(final Context context, final XmppConnection connection) {
16        super(context, connection);
17    }
18
19    public void ping() {
20        if (connection.getStreamFeatures().sm()) {
21            this.connection.sendRequestStanza();
22        } else {
23            this.connection.sendIqPacket(new Iq(Iq.Type.GET, new Ping()));
24        }
25    }
26
27    public void ping(final Runnable runnable) {
28        final var pingFuture = this.connection.sendIqPacket(new Iq(Iq.Type.GET, new Ping()));
29        Futures.addCallback(
30                pingFuture,
31                new FutureCallback<Iq>() {
32                    @Override
33                    public void onSuccess(Iq result) {
34                        runnable.run();
35                    }
36
37                    @Override
38                    public void onFailure(final @NonNull Throwable t) {
39                        if (t instanceof TimeoutException) {
40                            return;
41                        }
42                        runnable.run();
43                    }
44                },
45                MoreExecutors.directExecutor());
46    }
47
48    public void pong(final Iq packet) {
49        this.connection.sendResultFor(packet);
50    }
51}