diff --git a/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java b/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java index dd5e9c39425dea9cd8621a5c45b4802dced3eca9..1ec2563482dab905b11ea6f6ea20422ef6390d05 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java @@ -1,12 +1,10 @@ package org.briarproject.bramble; -import org.briarproject.bramble.plugin.AndroidPluginModule; import org.briarproject.bramble.system.AndroidSystemModule; import dagger.Module; @Module(includes = { - AndroidPluginModule.class, AndroidSystemModule.class }) public class BrambleAndroidModule { 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 deleted file mode 100644 index 0714b8d478ed87e7e001681e6c51c9a9f91ad3f9..0000000000000000000000000000000000000000 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/AndroidPluginModule.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.briarproject.bramble.plugin; - -import android.app.Application; -import android.content.Context; - -import org.briarproject.bramble.api.event.EventBus; -import org.briarproject.bramble.api.lifecycle.IoExecutor; -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.plugin.BackoffFactory; -import org.briarproject.bramble.api.plugin.PluginConfig; -import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; -import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; -import org.briarproject.bramble.api.system.AndroidExecutor; -import org.briarproject.bramble.api.system.LocationUtils; -import org.briarproject.bramble.api.system.Scheduler; -import org.briarproject.bramble.plugin.bluetooth.AndroidBluetoothPluginFactory; -import org.briarproject.bramble.plugin.tcp.AndroidLanTcpPluginFactory; -import org.briarproject.bramble.plugin.tor.TorPluginFactory; - -import java.security.SecureRandom; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.Executor; -import java.util.concurrent.ScheduledExecutorService; - -import javax.net.SocketFactory; - -import dagger.Module; -import dagger.Provides; - -@Module -public class AndroidPluginModule { - - @Provides - PluginConfig providePluginConfig(@IoExecutor Executor ioExecutor, - @Scheduler ScheduledExecutorService scheduler, - AndroidExecutor androidExecutor, SecureRandom random, - SocketFactory torSocketFactory, BackoffFactory backoffFactory, - Application app, LocationUtils locationUtils, EventBus eventBus) { - Context appContext = app.getApplicationContext(); - DuplexPluginFactory bluetooth = - new AndroidBluetoothPluginFactory(ioExecutor, androidExecutor, - appContext, random, eventBus, backoffFactory); - DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, scheduler, - appContext, locationUtils, eventBus, torSocketFactory, - backoffFactory); - DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, - scheduler, backoffFactory, appContext); - Collection<DuplexPluginFactory> duplex = - Arrays.asList(bluetooth, tor, lan); - @NotNullByDefault - PluginConfig pluginConfig = new PluginConfig() { - - @Override - public Collection<DuplexPluginFactory> getDuplexFactories() { - return duplex; - } - - @Override - public Collection<SimplexPluginFactory> getSimplexFactories() { - return Collections.emptyList(); - } - }; - return pluginConfig; - } -} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/PluginConfig.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/PluginConfig.java index 5518b7c6bc59bc5413cd774947c03213503a9e9e..6bf13ceddeda77f1e200787a7285cf5ae2dabad6 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/PluginConfig.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/PluginConfig.java @@ -12,4 +12,6 @@ public interface PluginConfig { Collection<DuplexPluginFactory> getDuplexFactories(); Collection<SimplexPluginFactory> getSimplexFactories(); + + boolean shouldPoll(); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginManagerImpl.java index 7e05f5b347506d568a2d78cdc5527ac2e52b2f7a..a534eb357e3d89b94c9f01bbb24479ef245491dc 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginManagerImpl.java @@ -8,6 +8,7 @@ import org.briarproject.bramble.api.lifecycle.Service; import org.briarproject.bramble.api.lifecycle.ServiceException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.ConnectionManager; +import org.briarproject.bramble.api.plugin.ConnectionRegistry; import org.briarproject.bramble.api.plugin.Plugin; import org.briarproject.bramble.api.plugin.PluginCallback; import org.briarproject.bramble.api.plugin.PluginConfig; @@ -29,8 +30,11 @@ import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.SettingsManager; +import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.system.Scheduler; import org.briarproject.bramble.api.ui.UiCallback; +import java.security.SecureRandom; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -40,6 +44,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; @@ -57,11 +62,15 @@ class PluginManagerImpl implements PluginManager, Service { Logger.getLogger(PluginManagerImpl.class.getName()); private final Executor ioExecutor; + private final ScheduledExecutorService scheduler; private final EventBus eventBus; private final PluginConfig pluginConfig; private final ConnectionManager connectionManager; + private final ConnectionRegistry connectionRegistry; private final SettingsManager settingsManager; private final TransportPropertyManager transportPropertyManager; + private final SecureRandom random; + private final Clock clock; private final UiCallback uiCallback; private final Map<TransportId, Plugin> plugins; private final List<SimplexPlugin> simplexPlugins; @@ -70,22 +79,30 @@ class PluginManagerImpl implements PluginManager, Service { private final AtomicBoolean used = new AtomicBoolean(false); @Inject - PluginManagerImpl(@IoExecutor Executor ioExecutor, EventBus eventBus, + PluginManagerImpl(@IoExecutor Executor ioExecutor, + @Scheduler ScheduledExecutorService scheduler, EventBus eventBus, PluginConfig pluginConfig, ConnectionManager connectionManager, + ConnectionRegistry connectionRegistry, SettingsManager settingsManager, TransportPropertyManager transportPropertyManager, + SecureRandom random, Clock clock, UiCallback uiCallback) { this.ioExecutor = ioExecutor; + this.scheduler = scheduler; this.eventBus = eventBus; this.pluginConfig = pluginConfig; this.connectionManager = connectionManager; + this.connectionRegistry = connectionRegistry; this.settingsManager = settingsManager; this.transportPropertyManager = transportPropertyManager; + this.random = random; + this.clock = clock; this.uiCallback = uiCallback; plugins = new ConcurrentHashMap<>(); simplexPlugins = new CopyOnWriteArrayList<>(); duplexPlugins = new CopyOnWriteArrayList<>(); startLatches = new ConcurrentHashMap<>(); + } @Override @@ -123,6 +140,13 @@ class PluginManagerImpl implements PluginManager, Service { ioExecutor.execute(new PluginStarter(d, startLatch)); } } + // Instantiate the poller + if (pluginConfig.shouldPoll()) { + LOG.info("Starting poller"); + Poller poller = new Poller(ioExecutor, scheduler, connectionManager, + connectionRegistry, this, random, clock); + eventBus.addListener(poller); + } } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginModule.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginModule.java index 43ed215557969a2aefbfef6f78de067adb81e2dd..773910481b366c8b5166b1a074e4a15f26d991fc 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/PluginModule.java @@ -26,8 +26,6 @@ public class PluginModule { public static class EagerSingletons { @Inject PluginManager pluginManager; - @Inject - Poller poller; } @Provides @@ -35,19 +33,6 @@ public class PluginModule { return new BackoffFactoryImpl(); } - @Provides - @Singleton - Poller providePoller(@IoExecutor Executor ioExecutor, - @Scheduler ScheduledExecutorService scheduler, - ConnectionManager connectionManager, - ConnectionRegistry connectionRegistry, PluginManager pluginManager, - SecureRandom random, Clock clock, EventBus eventBus) { - Poller poller = new Poller(ioExecutor, scheduler, connectionManager, - connectionRegistry, pluginManager, random, clock); - eventBus.addListener(poller); - return poller; - } - @Provides @Singleton ConnectionManager provideConnectionManager( diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java index 61a5c6137aa492c292b6c41d3256f1ce91ffbfcf..c68126282a6e9f16f9eb9468407cc1227562f1c6 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java @@ -54,7 +54,6 @@ class Poller implements EventListener { private final Lock lock; private final Map<TransportId, ScheduledPollTask> tasks; // Locking: lock - @Inject Poller(@IoExecutor Executor ioExecutor, @Scheduler ScheduledExecutorService scheduler, ConnectionManager connectionManager, diff --git a/bramble-core/src/test/java/org/briarproject/bramble/plugin/PluginManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PluginManagerImplTest.java index aa96dc3966e3ba984ea03994180c865f3766bfc2..958f1218df668bae8566ab9eddf284f430125f96 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/plugin/PluginManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PluginManagerImplTest.java @@ -2,6 +2,7 @@ package org.briarproject.bramble.plugin; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.plugin.ConnectionManager; +import org.briarproject.bramble.api.plugin.ConnectionRegistry; import org.briarproject.bramble.api.plugin.PluginConfig; import org.briarproject.bramble.api.plugin.PluginException; import org.briarproject.bramble.api.plugin.TransportId; @@ -13,6 +14,7 @@ import org.briarproject.bramble.api.plugin.simplex.SimplexPluginCallback; import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.settings.SettingsManager; +import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.api.ui.UiCallback; import org.briarproject.bramble.test.BrambleTestCase; import org.jmock.Expectations; @@ -20,9 +22,13 @@ import org.jmock.Mockery; import org.jmock.lib.concurrent.Synchroniser; import org.junit.Test; +import java.security.SecureRandom; import java.util.Arrays; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; import static org.briarproject.bramble.test.TestUtils.getTransportId; @@ -34,10 +40,16 @@ public class PluginManagerImplTest extends BrambleTestCase { setThreadingPolicy(new Synchroniser()); }}; Executor ioExecutor = Executors.newSingleThreadExecutor(); + RejectedExecutionHandler policy = + new ScheduledThreadPoolExecutor.DiscardPolicy(); + ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1, policy); + SecureRandom random = new SecureRandom(); + Clock clock = context.mock(Clock.class); EventBus eventBus = context.mock(EventBus.class); PluginConfig pluginConfig = context.mock(PluginConfig.class); ConnectionManager connectionManager = context.mock(ConnectionManager.class); + ConnectionRegistry connectionRegistry = context.mock(ConnectionRegistry.class); SettingsManager settingsManager = context.mock(SettingsManager.class); TransportPropertyManager transportPropertyManager = @@ -71,6 +83,8 @@ public class PluginManagerImplTest extends BrambleTestCase { will(returnValue(simplexFailId)); allowing(duplexPlugin).getId(); will(returnValue(duplexId)); + allowing(pluginConfig).shouldPoll(); + will(returnValue(false)); // start() // First simplex plugin oneOf(pluginConfig).getSimplexFactories(); @@ -112,9 +126,9 @@ public class PluginManagerImplTest extends BrambleTestCase { oneOf(duplexPlugin).stop(); }}); - PluginManagerImpl p = new PluginManagerImpl(ioExecutor, eventBus, - pluginConfig, connectionManager, settingsManager, - transportPropertyManager, uiCallback); + PluginManagerImpl p = new PluginManagerImpl(ioExecutor, scheduler, eventBus, + pluginConfig, connectionManager, connectionRegistry, settingsManager, + transportPropertyManager, random, clock, uiCallback); // Two plugins should be started and stopped p.startService(); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/TestPluginConfigModule.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestPluginConfigModule.java index e016abc4d9a0ee6328fc77e6ebfc3a8348faf126..9617834595389d3923df4d67462fe9ec29cb1a47 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/TestPluginConfigModule.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestPluginConfigModule.java @@ -58,6 +58,11 @@ public class TestPluginConfigModule { public Collection<SimplexPluginFactory> getSimplexFactories() { return Collections.singletonList(simplex); } + + @Override + public boolean shouldPoll() { + return false; + } }; return pluginConfig; } diff --git a/bramble-j2se/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java b/bramble-j2se/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java index 288a34b901d93c7f936e2fa1b948806d4bd1bb09..2a44d0e44f6bbf2667734c3635f640c42158342c 100644 --- a/bramble-j2se/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java +++ b/bramble-j2se/src/main/java/org/briarproject/bramble/plugin/DesktopPluginModule.java @@ -59,6 +59,11 @@ public class DesktopPluginModule extends PluginModule { public Collection<SimplexPluginFactory> getSimplexFactories() { return simplex; } + + @Override + public boolean shouldPoll() { + return true; + } }; return pluginConfig; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index ed954e2414e1544cf18df754b7129f608c247893..a8c958ea8a0de7bb7717e36ca6184de42aba624b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -1,6 +1,7 @@ package org.briarproject.briar.android; import android.app.Application; +import android.content.Context; import android.content.SharedPreferences; import android.os.StrictMode; @@ -8,13 +9,25 @@ import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.db.DatabaseConfig; import org.briarproject.bramble.api.event.EventBus; +import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; +import org.briarproject.bramble.api.plugin.BackoffFactory; +import org.briarproject.bramble.api.plugin.PluginConfig; +import org.briarproject.bramble.api.plugin.duplex.DuplexPluginFactory; +import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory; import org.briarproject.bramble.api.reporting.DevConfig; +import org.briarproject.bramble.api.reporting.DevReporter; +import org.briarproject.bramble.api.system.AndroidExecutor; +import org.briarproject.bramble.api.system.LocationUtils; +import org.briarproject.bramble.api.system.Scheduler; import org.briarproject.bramble.api.ui.UiCallback; import org.briarproject.bramble.util.AndroidUtils; +import org.briarproject.bramble.plugin.bluetooth.AndroidBluetoothPluginFactory; +import org.briarproject.bramble.plugin.tcp.AndroidLanTcpPluginFactory; +import org.briarproject.bramble.plugin.tor.TorPluginFactory; import org.briarproject.bramble.util.StringUtils; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.android.DozeWatchdog; @@ -23,9 +36,16 @@ import org.briarproject.briar.api.android.ScreenFilterMonitor; import java.io.File; import java.security.GeneralSecurityException; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.Executor; +import java.util.concurrent.ScheduledExecutorService; import javax.inject.Inject; import javax.inject.Singleton; +import javax.net.SocketFactory; import dagger.Module; import dagger.Provides; @@ -97,6 +117,46 @@ public class AppModule { return databaseConfig; } + @Provides + PluginConfig providePluginConfig(@IoExecutor Executor ioExecutor, + @Scheduler ScheduledExecutorService scheduler, + AndroidExecutor androidExecutor, SecureRandom random, + SocketFactory torSocketFactory, BackoffFactory backoffFactory, + Application app, LocationUtils locationUtils, DevReporter reporter, + EventBus eventBus) { + Context appContext = app.getApplicationContext(); + DuplexPluginFactory bluetooth = + new AndroidBluetoothPluginFactory(ioExecutor, androidExecutor, + appContext, random, eventBus, backoffFactory); + DuplexPluginFactory tor = new TorPluginFactory(ioExecutor, scheduler, + appContext, locationUtils, eventBus, + torSocketFactory, backoffFactory); + DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, + scheduler, backoffFactory, appContext); + Collection<DuplexPluginFactory> duplex = + Arrays.asList(bluetooth, tor, lan); + @NotNullByDefault + PluginConfig pluginConfig = new PluginConfig() { + + @Override + public Collection<DuplexPluginFactory> getDuplexFactories() { + return duplex; + } + + @Override + public Collection<SimplexPluginFactory> getSimplexFactories() { + return Collections.emptyList(); + } + + @Override + public boolean shouldPoll() { + return true; + } + + }; + return pluginConfig; + } + @Provides @Singleton DevConfig provideDevConfig(Application app, CryptoComponent crypto) {