From 4ec2cde387114e21ba5a6f59775f50fd5409f540 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 9 Mar 2025 14:23:09 +0100 Subject: [PATCH] Check if interface provides internet --- .../eu/faircode/email/ConnectionHelper.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/faircode/email/ConnectionHelper.java b/app/src/main/java/eu/faircode/email/ConnectionHelper.java index de3ecd35c2..1462953499 100644 --- a/app/src/main/java/eu/faircode/email/ConnectionHelper.java +++ b/app/src/main/java/eu/faircode/email/ConnectionHelper.java @@ -714,10 +714,34 @@ public class ConnectionHelper { } */ try { + ConnectivityManager cm = Helper.getSystemService(context, ConnectivityManager.class); + Network[] networks = (cm == null ? null : cm.getAllNetworks()); + Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces != null && interfaces.hasMoreElements()) { NetworkInterface ni = interfaces.nextElement(); - if (ni != null && ni.isUp()) + if (ni != null && ni.isUp()) { + if (networks != null) { + boolean someInternet = false; + try { + for (Network network : networks) { + LinkProperties props = cm.getLinkProperties(network); + if (props != null && Objects.equals(ni.getName(), props.getInterfaceName())) { + NetworkCapabilities caps = cm.getNetworkCapabilities(network); + if (caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) + someInternet = true; + else + EntityLog.log(context, EntityLog.Type.Network, "Interface=" + ni + " provides no internet"); + } + } + } catch (Throwable ex) { + Log.e(ex); + someInternet = true; + } + if (!someInternet) + continue; + } + for (InterfaceAddress iaddr : ni.getInterfaceAddresses()) { InetAddress addr = iaddr.getAddress(); boolean local = (addr.isLoopbackAddress() || addr.isLinkLocalAddress()); @@ -729,6 +753,7 @@ public class ConnectionHelper { else if (addr instanceof Inet6Address) has6 = true; } + } } } catch (Throwable ex) { Log.e(ex);