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