diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPlugin.java index 4d507d0d1304d853413d7b4c06475f5e6eb3abce..ca6b4f6a85b8d56d2d3f1328437d4b1e5f1e6333 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPlugin.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPlugin.java @@ -4,21 +4,25 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.Backoff; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginCallback; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Collection; import java.util.concurrent.Executor; import java.util.logging.Logger; import javax.annotation.Nullable; -import static android.content.Context.CONNECTIVITY_SERVICE; +import static android.content.Context.WIFI_SERVICE; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; -import static android.net.ConnectivityManager.TYPE_WIFI; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; @NotNullByDefault class AndroidLanTcpPlugin extends LanTcpPlugin { @@ -27,6 +31,8 @@ class AndroidLanTcpPlugin extends LanTcpPlugin { Logger.getLogger(AndroidLanTcpPlugin.class.getName()); private final Context appContext; + @Nullable + private final WifiManager wifiManager; @Nullable private volatile BroadcastReceiver networkStateReceiver = null; @@ -36,6 +42,8 @@ class AndroidLanTcpPlugin extends LanTcpPlugin { int maxIdleTime) { super(ioExecutor, backoff, callback, maxLatency, maxIdleTime); this.appContext = appContext; + wifiManager = (WifiManager) appContext.getApplicationContext() + .getSystemService(WIFI_SERVICE); } @Override @@ -56,20 +64,40 @@ class AndroidLanTcpPlugin extends LanTcpPlugin { tryToClose(socket); } + @Override + protected Collection<InetAddress> getLocalIpAddresses() { + if (wifiManager == null) return emptyList(); + WifiInfo info = wifiManager.getConnectionInfo(); + if (info == null || info.getIpAddress() == 0) return emptyList(); + return singletonList(intToInetAddress(info.getIpAddress())); + } + + private InetAddress intToInetAddress(int ip) { + byte[] ipBytes = new byte[4]; + ipBytes[0] = (byte) (ip & 0xFF); + ipBytes[1] = (byte) ((ip >> 8) & 0xFF); + ipBytes[2] = (byte) ((ip >> 16) & 0xFF); + ipBytes[3] = (byte) ((ip >> 24) & 0xFF); + try { + return InetAddress.getByAddress(ipBytes); + } catch (UnknownHostException e) { + // Should only be thrown if address has illegal length + throw new AssertionError(e); + } + } + private class NetworkStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent i) { - if (!running) return; - Object o = ctx.getSystemService(CONNECTIVITY_SERVICE); - ConnectivityManager cm = (ConnectivityManager) o; - NetworkInfo net = cm.getActiveNetworkInfo(); - if (net != null && net.getType() == TYPE_WIFI && net.isConnected()) { - LOG.info("Connected to Wi-Fi"); - if (socket == null || socket.isClosed()) bind(); - } else { - LOG.info("Not connected to Wi-Fi"); + if (!running || wifiManager == null) return; + WifiInfo info = wifiManager.getConnectionInfo(); + if (info == null || info.getIpAddress() == 0) { + LOG.info("Not connected to wifi"); tryToClose(socket); + } else { + LOG.info("Connected to wifi"); + if (socket == null || socket.isClosed()) bind(); } } }