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