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}