use all networks if active network has no DNS

Daniel Gultsch created

Change summary

src/main/java/de/gultsch/minidns/AndroidDNSClient.java | 59 ++++++-----
1 file changed, 31 insertions(+), 28 deletions(-)

Detailed changes

src/main/java/de/gultsch/minidns/AndroidDNSClient.java 🔗

@@ -6,31 +6,24 @@ import android.net.LinkProperties;
 import android.net.Network;
 import android.os.Build;
 import android.util.Log;
-
+import androidx.annotation.NonNull;
 import androidx.collection.LruCache;
-
 import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
-
-import org.minidns.AbstractDnsClient;
-import org.minidns.dnsmessage.DnsMessage;
-import org.minidns.dnsqueryresult.DirectCachedDnsQueryResult;
-import org.minidns.dnsqueryresult.DnsQueryResult;
-import org.minidns.dnsqueryresult.StandardDnsQueryResult;
-import org.minidns.dnsqueryresult.SynthesizedCachedDnsQueryResult;
-import org.minidns.record.Data;
-
-import org.minidns.record.Record;
-
 import eu.siacs.conversations.Config;
-
 import java.io.IOException;
 import java.net.InetAddress;
 import java.time.Duration;
 import java.util.Collections;
 import java.util.List;
+import org.minidns.AbstractDnsClient;
+import org.minidns.dnsmessage.DnsMessage;
+import org.minidns.dnsqueryresult.DnsQueryResult;
+import org.minidns.dnsqueryresult.StandardDnsQueryResult;
+import org.minidns.record.Data;
+import org.minidns.record.Record;
 
 public class AndroidDNSClient extends AbstractDnsClient {
 
@@ -95,7 +88,8 @@ public class AndroidDNSClient extends AbstractDnsClient {
                     continue;
             }
             cacheQuery(cacheKey, response);
-            return new StandardDnsQueryResult(dnsServer.inetAddress, dnsServer.port,result.queryMethod,question,response);
+            return new StandardDnsQueryResult(
+                    dnsServer.inetAddress, dnsServer.port, result.queryMethod, question, response);
         }
         return null;
     }
@@ -109,9 +103,29 @@ public class AndroidDNSClient extends AbstractDnsClient {
     }
 
     private List<DNSServer> getDNSServers() {
+        final ConnectivityManager connectivityManager =
+                context.getSystemService(ConnectivityManager.class);
+        if (connectivityManager == null) {
+            Log.w(Config.LOGTAG, "no DNS servers found. ConnectivityManager was null");
+            return Collections.emptyList();
+        }
+        final Network activeNetwork = connectivityManager.getActiveNetwork();
+        final List<DNSServer> activeDnsServers =
+                activeNetwork == null
+                        ? Collections.emptyList()
+                        : getDNSServers(connectivityManager, new Network[] {activeNetwork});
+        if (activeDnsServers.isEmpty()) {
+            Log.d(Config.LOGTAG, "no DNS servers on active networks. looking at all networks");
+            return getDNSServers(connectivityManager, connectivityManager.getAllNetworks());
+        } else {
+            return activeDnsServers;
+        }
+    }
+
+    private List<DNSServer> getDNSServers(
+            @NonNull final ConnectivityManager connectivityManager,
+            @NonNull final Network[] networks) {
         final ImmutableList.Builder<DNSServer> dnsServerBuilder = new ImmutableList.Builder<>();
-        final ConnectivityManager connectivityManager = context.getSystemService(ConnectivityManager.class);
-        final Network[] networks = getActiveNetworks(connectivityManager);
         for (final Network network : networks) {
             final LinkProperties linkProperties = connectivityManager.getLinkProperties(network);
             if (linkProperties == null) {
@@ -134,17 +148,6 @@ public class AndroidDNSClient extends AbstractDnsClient {
         return dnsServerBuilder.build();
     }
 
-    private Network[] getActiveNetworks(final ConnectivityManager connectivityManager) {
-        if (connectivityManager == null) {
-            return new Network[0];
-        }
-        final Network activeNetwork = connectivityManager.getActiveNetwork();
-        if (activeNetwork != null) {
-                return new Network[] {activeNetwork};
-        }
-        return connectivityManager.getAllNetworks();
-    }
-
     private DnsMessage queryCache(final QuestionServerTuple key) {
         final DnsMessage cachedResponse;
         synchronized (QUERY_CACHE) {