diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java index c62aac754f3102e7652bcd6414bf6ed7fc0d2d81..2d22e8f4e9706b43b0129aafd374c6cd44a68404 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java @@ -48,7 +48,7 @@ public class AndroidPluginModule { appContext, locationUtils, reporter, eventBus, torSocketFactory, backoffFactory); DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, - backoffFactory, appContext); + scheduler, backoffFactory, appContext); Collection<DuplexPluginFactory> duplex = Arrays.asList(bluetooth, tor, lan); @NotNullByDefault 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 50a0057fcf573b61aefc357db68084dfac7d087f..506bc997f0dbc8b251cb12ecb038a14b51b39509 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 @@ -20,6 +20,7 @@ import java.net.Socket; import java.net.UnknownHostException; import java.util.Collection; import java.util.concurrent.Executor; +import java.util.concurrent.ScheduledExecutorService; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -33,6 +34,7 @@ import static android.net.wifi.WifiManager.EXTRA_WIFI_STATE; import static android.os.Build.VERSION.SDK_INT; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; +import static java.util.concurrent.TimeUnit.SECONDS; @NotNullByDefault class AndroidLanTcpPlugin extends LanTcpPlugin { @@ -58,6 +60,7 @@ class AndroidLanTcpPlugin extends LanTcpPlugin { } } + private final ScheduledExecutorService scheduler; private final Context appContext; private final ConnectivityManager connectivityManager; @Nullable @@ -67,10 +70,11 @@ class AndroidLanTcpPlugin extends LanTcpPlugin { private volatile BroadcastReceiver networkStateReceiver = null; private volatile SocketFactory socketFactory; - AndroidLanTcpPlugin(Executor ioExecutor, Backoff backoff, - Context appContext, DuplexPluginCallback callback, int maxLatency, - int maxIdleTime) { + AndroidLanTcpPlugin(Executor ioExecutor, ScheduledExecutorService scheduler, + Backoff backoff, Context appContext, DuplexPluginCallback callback, + int maxLatency, int maxIdleTime) { super(ioExecutor, backoff, callback, maxLatency, maxIdleTime); + this.scheduler = scheduler; this.appContext = appContext; ConnectivityManager connectivityManager = (ConnectivityManager) appContext.getSystemService(CONNECTIVITY_SERVICE); @@ -152,11 +156,20 @@ class AndroidLanTcpPlugin extends LanTcpPlugin { @Override public void onReceive(Context ctx, Intent i) { + if (!running) return; + if (isApEnabledEvent(i)) { + // The state change may be broadcast before the AP address is + // visible, so delay handling the event + scheduler.schedule(this::handleConnectivityChange, 1, SECONDS); + } else { + handleConnectivityChange(); + } + } + + private void handleConnectivityChange() { if (!running) return; Collection<InetAddress> addrs = getLocalIpAddresses(); - // The state change may be broadcast before the AP address is - // visible, so check the intent as well as the local addresses - if (isApEnabledEvent(i) || addrs.contains(WIFI_AP_ADDRESS)) { + if (addrs.contains(WIFI_AP_ADDRESS)) { LOG.info("Providing wifi hotspot"); // There's no corresponding Network object and thus no way // to get a suitable socket factory, so we won't be able to diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPluginFactory.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPluginFactory.java index 311219a66562ef91edad3a81ee7207f828f42e2f..da8149c9a00ed1d29083734514040f9a43aa41e6 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPluginFactory.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tcp/AndroidLanTcpPluginFactory.java @@ -11,6 +11,7 @@ import org.briarproject.bramble.api.plugin.duplex.DuplexPluginCallback; import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; import java.util.concurrent.Executor; +import java.util.concurrent.ScheduledExecutorService; import javax.annotation.concurrent.Immutable; @@ -27,12 +28,15 @@ public class AndroidLanTcpPluginFactory implements DuplexPluginFactory { private static final double BACKOFF_BASE = 1.2; private final Executor ioExecutor; + private final ScheduledExecutorService scheduler; private final BackoffFactory backoffFactory; private final Context appContext; public AndroidLanTcpPluginFactory(Executor ioExecutor, - BackoffFactory backoffFactory, Context appContext) { + ScheduledExecutorService scheduler, BackoffFactory backoffFactory, + Context appContext) { this.ioExecutor = ioExecutor; + this.scheduler = scheduler; this.backoffFactory = backoffFactory; this.appContext = appContext; } @@ -51,7 +55,7 @@ public class AndroidLanTcpPluginFactory implements DuplexPluginFactory { public DuplexPlugin createPlugin(DuplexPluginCallback callback) { Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, MAX_POLLING_INTERVAL, BACKOFF_BASE); - return new AndroidLanTcpPlugin(ioExecutor, backoff, appContext, - callback, MAX_LATENCY, MAX_IDLE_TIME); + return new AndroidLanTcpPlugin(ioExecutor, scheduler, backoff, + appContext, callback, MAX_LATENCY, MAX_IDLE_TIME); } }