diff --git a/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaEagerSingletons.java b/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaEagerSingletons.java new file mode 100644 index 000000000..348a83f0e --- /dev/null +++ b/bramble-java/src/main/java/org/briarproject/bramble/BrambleJavaEagerSingletons.java @@ -0,0 +1,17 @@ +package org.briarproject.bramble; + +import org.briarproject.bramble.network.JavaNetworkModule; +import org.briarproject.nullsafety.NotNullByDefault; + +@NotNullByDefault +public interface BrambleJavaEagerSingletons { + + void inject(JavaNetworkModule.EagerSingletons init); + + class Helper { + + public static void injectEagerSingletons(BrambleJavaEagerSingletons c) { + c.inject(new JavaNetworkModule.EagerSingletons()); + } + } +} diff --git a/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkManager.java b/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkManager.java index a4df22b33..7d7eb9721 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkManager.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkManager.java @@ -1,33 +1,47 @@ package org.briarproject.bramble.network; +import org.briarproject.bramble.api.event.EventBus; +import org.briarproject.bramble.api.lifecycle.IoExecutor; +import org.briarproject.bramble.api.lifecycle.Service; import org.briarproject.bramble.api.network.NetworkManager; import org.briarproject.bramble.api.network.NetworkStatus; -import org.briarproject.nullsafety.MethodsNotNullByDefault; -import org.briarproject.nullsafety.ParametersNotNullByDefault; +import org.briarproject.bramble.api.network.event.NetworkStatusEvent; +import org.briarproject.bramble.api.system.TaskScheduler; +import org.briarproject.nullsafety.NotNullByDefault; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; +import java.util.concurrent.Executor; import java.util.logging.Logger; import javax.inject.Inject; import static java.util.Collections.list; +import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.NetworkUtils.getNetworkInterfaces; -@MethodsNotNullByDefault -@ParametersNotNullByDefault -class JavaNetworkManager implements NetworkManager { +@NotNullByDefault +class JavaNetworkManager implements NetworkManager, Service { private static final Logger LOG = getLogger(JavaNetworkManager.class.getName()); + private final TaskScheduler scheduler; + private final Executor ioExecutor; + private final EventBus eventBus; + @Inject - JavaNetworkManager() { + JavaNetworkManager(TaskScheduler scheduler, + @IoExecutor Executor ioExecutor, + EventBus eventBus) { + this.scheduler = scheduler; + this.ioExecutor = ioExecutor; + this.eventBus = eventBus; } @Override @@ -51,4 +65,17 @@ class JavaNetworkManager implements NetworkManager { return new NetworkStatus(connected, false, !hasIpv4 && hasIpv6Unicast); } + private void broadcastNetworkStatus() { + eventBus.broadcast(new NetworkStatusEvent(getNetworkStatus())); + } + + @Override + public void startService() { + scheduler.scheduleWithFixedDelay(this::broadcastNetworkStatus, + ioExecutor, 0, 1, MINUTES); + } + + @Override + public void stopService() { + } } diff --git a/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkModule.java b/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkModule.java index 308f56cc2..d7dbc4940 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkModule.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkModule.java @@ -1,7 +1,9 @@ package org.briarproject.bramble.network; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.network.NetworkManager; +import javax.inject.Inject; import javax.inject.Singleton; import dagger.Module; @@ -10,9 +12,16 @@ import dagger.Provides; @Module public class JavaNetworkModule { + public static class EagerSingletons { + @Inject + NetworkManager networkManager; + } + @Provides @Singleton - NetworkManager provideNetworkManager(JavaNetworkManager networkManager) { + NetworkManager provideNetworkManager(LifecycleManager lifecycleManager, + JavaNetworkManager networkManager) { + lifecycleManager.registerService(networkManager); return networkManager; } } diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.kt index b3016d119..bdadf3421 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.kt @@ -3,6 +3,7 @@ package org.briarproject.briar.headless import dagger.Component import org.briarproject.bramble.BrambleCoreEagerSingletons import org.briarproject.bramble.BrambleCoreModule +import org.briarproject.bramble.BrambleJavaEagerSingletons import org.briarproject.bramble.BrambleJavaModule import org.briarproject.briar.BriarCoreEagerSingletons import org.briarproject.briar.BriarCoreModule @@ -19,7 +20,7 @@ import javax.inject.Singleton ) @Singleton internal interface BriarHeadlessApp : BrambleCoreEagerSingletons, BriarCoreEagerSingletons, - HeadlessEagerSingletons { + BrambleJavaEagerSingletons, HeadlessEagerSingletons { fun getRouter(): Router diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/Main.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/Main.kt index 410781441..b6b898b15 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/Main.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/Main.kt @@ -8,6 +8,7 @@ import com.github.ajalt.clikt.parameters.options.option import com.github.ajalt.clikt.parameters.types.int import org.bouncycastle.util.encoders.Base64.toBase64String import org.briarproject.bramble.BrambleCoreEagerSingletons +import org.briarproject.bramble.BrambleJavaEagerSingletons import org.briarproject.bramble.util.OsUtils.isLinux import org.briarproject.bramble.util.OsUtils.isMac import org.briarproject.briar.BriarCoreEagerSingletons @@ -77,6 +78,7 @@ private class Main : CliktCommand( // We need to load the eager singletons directly after making the // dependency graphs BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app) + BrambleJavaEagerSingletons.Helper.injectEagerSingletons(app) BriarCoreEagerSingletons.Helper.injectEagerSingletons(app) HeadlessEagerSingletons.Helper.injectEagerSingletons(app) diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/BriarHeadlessTestApp.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/BriarHeadlessTestApp.kt index ace7d937d..8a2bb50a5 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/BriarHeadlessTestApp.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/BriarHeadlessTestApp.kt @@ -3,6 +3,7 @@ package org.briarproject.briar.headless import dagger.Component import org.briarproject.bramble.BrambleCoreEagerSingletons import org.briarproject.bramble.BrambleCoreModule +import org.briarproject.bramble.BrambleJavaEagerSingletons import org.briarproject.bramble.BrambleJavaModule import org.briarproject.bramble.api.crypto.CryptoComponent import org.briarproject.briar.BriarCoreEagerSingletons @@ -20,7 +21,7 @@ import javax.inject.Singleton ) @Singleton internal interface BriarHeadlessTestApp : BrambleCoreEagerSingletons, BriarCoreEagerSingletons, - HeadlessEagerSingletons { + BrambleJavaEagerSingletons, HeadlessEagerSingletons { fun getRouter(): Router diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/IntegrationTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/IntegrationTest.kt index 3c66aac4f..c5a08fb34 100644 --- a/briar-headless/src/test/java/org/briarproject/briar/headless/IntegrationTest.kt +++ b/briar-headless/src/test/java/org/briarproject/briar/headless/IntegrationTest.kt @@ -8,6 +8,7 @@ import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import org.briarproject.bramble.BrambleCoreEagerSingletons +import org.briarproject.bramble.BrambleJavaEagerSingletons import org.briarproject.bramble.api.crypto.CryptoComponent import org.briarproject.briar.BriarCoreEagerSingletons import org.briarproject.briar.api.test.TestDataCreator @@ -38,6 +39,7 @@ abstract class IntegrationTest { .headlessTestModule(HeadlessTestModule(dataDir)) .build() BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app) + BrambleJavaEagerSingletons.Helper.injectEagerSingletons(app) BriarCoreEagerSingletons.Helper.injectEagerSingletons(app) HeadlessEagerSingletons.Helper.injectEagerSingletons(app) router = app.getRouter()