interrupt XMPPConnection Thread

Daniel Gultsch created

in some cases the the DNS query might take too long (even though we specified a timeout)
if that happens we need a secondary solution (besides killing the socket) to stop the thread

Change summary

src/main/java/eu/siacs/conversations/utils/DNSHelper.java     | 7 +++
src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java | 9 +++++
2 files changed, 15 insertions(+), 1 deletion(-)

Detailed changes

src/main/java/eu/siacs/conversations/utils/DNSHelper.java 🔗

@@ -51,14 +51,19 @@ public class DNSHelper {
         final String host = jid.getDomainpart();
 		final List<InetAddress> servers = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? getDnsServers(context) : getDnsServersPreLollipop();
 		Bundle b = new Bundle();
+		boolean interrupted = false;
 		for(InetAddress server : servers) {
+			if (Thread.currentThread().isInterrupted()) {
+				interrupted = true;
+				break;
+			}
 			b = queryDNS(host, server);
 			if (b.containsKey("values")) {
 				return b;
 			}
 		}
 		if (!b.containsKey("values")) {
-			Log.d(Config.LOGTAG,"all dns queries failed. provide fallback A record");
+			Log.d(Config.LOGTAG,(interrupted ? "Thread interrupted during DNS query" :"all dns queries failed") + ". provide fallback A record");
 			ArrayList<Parcelable> values = new ArrayList<>();
 			values.add(createNamePortBundle(host, 5222, false));
 			b.putParcelableArrayList("values",values);

src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -280,6 +280,10 @@ public class XmppConnection implements Runnable {
 				final Bundle result = DNSHelper.getSRVRecord(account.getServer(), mXmppConnectionService);
 				final ArrayList<Parcelable>values = result.getParcelableArrayList("values");
 				for(Iterator<Parcelable> iterator = values.iterator(); iterator.hasNext();) {
+					if (Thread.currentThread().isInterrupted()) {
+						Log.d(Config.LOGTAG,account.getJid().toBareJid()+": Thread was interrupted");
+						return;
+					}
 					final Bundle namePort = (Bundle) iterator.next();
 					try {
 						String srvRecordServer;
@@ -1334,7 +1338,12 @@ public class XmppConnection implements Runnable {
 		}
 	}
 
+	public void interrupt() {
+		Thread.currentThread().interrupt();
+	}
+
 	public void disconnect(final boolean force) {
+		interrupt();
 		Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": disconnecting force="+Boolean.valueOf(force));
 		if (force) {
 			forceCloseSocket();