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 d4a8a417b..b0eddcddb 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 @@ -36,7 +36,6 @@ import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE; -import static org.briarproject.bramble.api.plugin.TcpConstants.PREF_TCP_ENABLE; import static org.briarproject.bramble.util.IoUtils.tryToClose; @NotNullByDefault @@ -85,7 +84,7 @@ class AndroidLanTcpPlugin extends LanTcpPlugin { public void start() { if (used.getAndSet(true)) throw new IllegalStateException(); Settings settings = callback.getSettings(); - state.setStarted(settings.getBoolean(PREF_TCP_ENABLE, false)); + state.setStarted(settings.getBoolean(PREF_PLUGIN_ENABLE, false)); updateConnectionStatus(); } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/BluetoothConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/BluetoothConstants.java index 915dfbbab..1752ba10f 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/BluetoothConstants.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/BluetoothConstants.java @@ -9,8 +9,6 @@ public interface BluetoothConstants { String PROP_ADDRESS = "address"; String PROP_UUID = "uuid"; - String PREF_BT_ENABLE = "enable"; - // Reason code returned by Plugin#getReasonDisabled() int REASON_NO_BT_ADAPTER = 2; } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/Plugin.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/Plugin.java index ee26500f1..4ecd851e2 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/Plugin.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/Plugin.java @@ -3,6 +3,7 @@ package org.briarproject.bramble.api.plugin; import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.properties.TransportProperties; +import org.briarproject.bramble.api.settings.SettingsManager; import java.util.Collection; @@ -34,6 +35,12 @@ public interface Plugin { INACTIVE } + /** + * The string for the boolean preference + * to use with the {@link SettingsManager} to enable or disable the plugin. + */ + String PREF_PLUGIN_ENABLE = "enable"; + /** * Reason code returned by {@link #getReasonDisabled()} to indicate that * the plugin is disabled because it has not been started or has been diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/PluginManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/PluginManager.java index 9c34b434d..5132ba3c6 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/PluginManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/PluginManager.java @@ -41,4 +41,17 @@ public interface PluginManager { * Returns any duplex plugins that support rendezvous. */ Collection getRendezvousPlugins(); + + /** + * Enables or disables the plugin + * identified by the given {@link TransportId}. + *

+ * Note that this applies the change asynchronously + * and there are no order guarantees. + *

+ * If no plugin with the given {@link TransportId} is registered, + * this is a no-op. + */ + void setPluginEnabled(TransportId t, boolean enabled); + } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TcpConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TcpConstants.java deleted file mode 100644 index 503f2cb88..000000000 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TcpConstants.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.briarproject.bramble.api.plugin; - -public interface TcpConstants { - - String PREF_TCP_ENABLE = "enable"; -} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java index 727dab4b4..a9ae3c5ae 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/plugin/TorConstants.java @@ -13,7 +13,6 @@ public interface TorConstants { int CONNECT_TO_PROXY_TIMEOUT = 5000; // Milliseconds int EXTRA_SOCKET_TIMEOUT = 30000; // Milliseconds - String PREF_TOR_ENABLE = "enable"; String PREF_TOR_NETWORK = "network2"; String PREF_TOR_PORT = "port"; String PREF_TOR_MOBILE = "useMobileData"; 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 c1e9ced33..9c91abeff 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 @@ -48,6 +48,7 @@ import static java.util.logging.Level.FINE; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE; import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED; import static org.briarproject.bramble.util.LogUtils.logDuration; @@ -182,6 +183,26 @@ class PluginManagerImpl implements PluginManager, Service { return supported; } + @Override + public void setPluginEnabled(TransportId t, boolean enabled) { + Plugin plugin = plugins.get(t); + if (plugin == null) return; + + Settings s = new Settings(); + s.putBoolean(PREF_PLUGIN_ENABLE, enabled); + ioExecutor.execute(() -> mergeSettings(s, t.getString())); + } + + private void mergeSettings(Settings s, String namespace) { + try { + long start = now(); + settingsManager.mergeSettings(s, namespace); + logDuration(LOG, "Merging settings", start); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + } + private class PluginStarter implements Runnable { private final Plugin plugin; @@ -284,11 +305,7 @@ class PluginManagerImpl implements PluginManager, Service { @Override public void mergeSettings(Settings s) { - try { - settingsManager.mergeSettings(s, id.getString()); - } catch (DbException e) { - logException(LOG, WARNING, e); - } + PluginManagerImpl.this.mergeSettings(s, id.getString()); } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java index a8c53b417..b807e8956 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java @@ -46,7 +46,6 @@ import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.TRANSPORT_ID_BLUETOOTH; import static org.briarproject.bramble.api.plugin.BluetoothConstants.ID; -import static org.briarproject.bramble.api.plugin.BluetoothConstants.PREF_BT_ENABLE; import static org.briarproject.bramble.api.plugin.BluetoothConstants.PROP_ADDRESS; import static org.briarproject.bramble.api.plugin.BluetoothConstants.PROP_UUID; import static org.briarproject.bramble.api.plugin.BluetoothConstants.REASON_NO_BT_ADAPTER; @@ -168,7 +167,7 @@ abstract class BluetoothPlugin implements DuplexPlugin, EventListener { } updateProperties(); Settings settings = callback.getSettings(); - boolean enabledByUser = settings.getBoolean(PREF_BT_ENABLE, false); + boolean enabledByUser = settings.getBoolean(PREF_PLUGIN_ENABLE, false); state.setStarted(enabledByUser); if (enabledByUser) { if (isAdapterEnabled()) bind(); @@ -434,7 +433,7 @@ abstract class BluetoothPlugin implements DuplexPlugin, EventListener { @IoExecutor private void onSettingsUpdated(Settings settings) { - boolean enabledByUser = settings.getBoolean(PREF_BT_ENABLE, false); + boolean enabledByUser = settings.getBoolean(PREF_PLUGIN_ENABLE, false); SS ss = state.setEnabledByUser(enabledByUser); State s = getState(); if (ss != null) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpPlugin.java index 215a47ea1..7c60e7790 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpPlugin.java @@ -51,7 +51,6 @@ import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED; import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE; -import static org.briarproject.bramble.api.plugin.TcpConstants.PREF_TCP_ENABLE; import static org.briarproject.bramble.util.IoUtils.tryToClose; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.PrivacyUtils.scrubSocketAddress; @@ -126,7 +125,7 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener { public void start() { if (used.getAndSet(true)) throw new IllegalStateException(); Settings settings = callback.getSettings(); - state.setStarted(settings.getBoolean(PREF_TCP_ENABLE, false)); + state.setStarted(settings.getBoolean(PREF_PLUGIN_ENABLE, false)); bind(); } @@ -349,7 +348,7 @@ abstract class TcpPlugin implements DuplexPlugin, EventListener { @IoExecutor private void onSettingsUpdated(Settings settings) { - boolean enabledByUser = settings.getBoolean(PREF_TCP_ENABLE, false); + boolean enabledByUser = settings.getBoolean(PREF_PLUGIN_ENABLE, false); ServerSocket ss = state.setEnabledByUser(enabledByUser); State s = getState(); if (ss != null) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java index afdeb6dd6..db69469f1 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java @@ -75,7 +75,6 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING; import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE; import static org.briarproject.bramble.api.plugin.TorConstants.CONTROL_PORT; import static org.briarproject.bramble.api.plugin.TorConstants.ID; -import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_ENABLE; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_MOBILE; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_AUTOMATIC; @@ -294,7 +293,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { PREF_TOR_NETWORK_AUTOMATIC); if (network == PREF_TOR_NETWORK_NEVER) { settings.putInt(PREF_TOR_NETWORK, PREF_TOR_NETWORK_AUTOMATIC); - settings.putBoolean(PREF_TOR_ENABLE, false); + settings.putBoolean(PREF_PLUGIN_ENABLE, false); callback.mergeSettings(settings); } return settings; @@ -775,7 +774,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { String country = locationUtils.getCurrentCountry(); boolean blocked = circumventionProvider.isTorProbablyBlocked(country); - boolean enabledByUser = settings.getBoolean(PREF_TOR_ENABLE, true); + boolean enabledByUser = settings.getBoolean(PREF_PLUGIN_ENABLE, true); int network = settings.getInt(PREF_TOR_NETWORK, PREF_TOR_NETWORK_AUTOMATIC); boolean useMobile = settings.getBoolean(PREF_TOR_MOBILE, true); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java index af5f23da9..7766d0909 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java @@ -34,7 +34,7 @@ import static java.util.concurrent.Executors.newCachedThreadPool; import static java.util.concurrent.TimeUnit.SECONDS; import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.COMMIT_LENGTH; import static org.briarproject.bramble.api.keyagreement.KeyAgreementConstants.TRANSPORT_ID_LAN; -import static org.briarproject.bramble.api.plugin.TcpConstants.PREF_TCP_ENABLE; +import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -349,7 +349,7 @@ public class LanTcpPluginTest extends BrambleTestCase { private final Settings settings = new Settings(); private Callback() { - settings.putBoolean(PREF_TCP_ENABLE, true); + settings.putBoolean(PREF_PLUGIN_ENABLE, true); } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java index 771c17cdc..72e7b69c8 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/KeyAgreementActivity.java @@ -8,11 +8,9 @@ import android.content.IntentFilter; import android.os.Bundle; import android.view.MenuItem; -import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.event.EventListener; -import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.plugin.BluetoothConstants; @@ -20,11 +18,8 @@ import org.briarproject.bramble.api.plugin.LanTcpConstants; import org.briarproject.bramble.api.plugin.Plugin; import org.briarproject.bramble.api.plugin.Plugin.State; import org.briarproject.bramble.api.plugin.PluginManager; -import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.plugin.event.BluetoothEnabledEvent; import org.briarproject.bramble.api.plugin.event.TransportStateEvent; -import org.briarproject.bramble.api.settings.Settings; -import org.briarproject.bramble.api.settings.SettingsManager; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.activity.BriarActivity; @@ -34,7 +29,6 @@ import org.briarproject.briar.android.keyagreement.IntroFragment.IntroScreenSeen import org.briarproject.briar.android.keyagreement.KeyAgreementFragment.KeyAgreementEventListener; import org.briarproject.briar.android.util.UiUtils; -import java.util.concurrent.Executor; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -54,15 +48,11 @@ import static android.bluetooth.BluetoothAdapter.ACTION_SCAN_MODE_CHANGED; import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; -import static org.briarproject.bramble.api.plugin.BluetoothConstants.PREF_BT_ENABLE; import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.DISABLED; import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE; -import static org.briarproject.bramble.api.plugin.TcpConstants.PREF_TCP_ENABLE; -import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_BLUETOOTH_DISCOVERABLE; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PERMISSION_CAMERA_LOCATION; @@ -112,13 +102,6 @@ public abstract class KeyAgreementActivity extends BriarActivity implements @Inject PluginManager pluginManager; - @Inject - @IoExecutor - Executor ioExecutor; - - @Inject - SettingsManager settingsManager; - /** * Set to true in onPostResume() and false in onPause(). This prevents the * QR code fragment from being shown if onRequestPermissionsResult() is @@ -220,14 +203,14 @@ public abstract class KeyAgreementActivity extends BriarActivity implements if (shouldEnableWifi()) { LOG.info("Enabling wifi plugin"); hasEnabledWifi = true; - enablePlugin(LanTcpConstants.ID, PREF_TCP_ENABLE); + pluginManager.setPluginEnabled(LanTcpConstants.ID, true); } if (bluetoothDecision == BluetoothDecision.UNKNOWN) { requestBluetoothDiscoverable(); } else if (shouldEnableBluetooth()) { LOG.info("Enabling Bluetooth plugin"); hasEnabledBluetooth = true; - enablePlugin(BluetoothConstants.ID, PREF_BT_ENABLE); + pluginManager.setPluginEnabled(BluetoothConstants.ID, true); } } } @@ -278,18 +261,6 @@ public abstract class KeyAgreementActivity extends BriarActivity implements return p != null && p.getState() == DISABLED; } - private void enablePlugin(TransportId t, String settingKey) { - ioExecutor.execute(() -> { - try { - Settings s = new Settings(); - s.putBoolean(settingKey, true); - settingsManager.mergeSettings(s, t.getString()); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); - } - private void requestBluetoothDiscoverable() { BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter(); if (bt == null) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java index 4e2ab8f83..5d284376c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsFragment.java @@ -73,9 +73,7 @@ import static android.widget.Toast.LENGTH_SHORT; import static androidx.core.view.ViewCompat.LAYOUT_DIRECTION_LTR; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; -import static org.briarproject.bramble.api.plugin.BluetoothConstants.PREF_BT_ENABLE; -import static org.briarproject.bramble.api.plugin.TcpConstants.PREF_TCP_ENABLE; -import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_ENABLE; +import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_MOBILE; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK; import static org.briarproject.bramble.api.plugin.TorConstants.PREF_TOR_NETWORK_AUTOMATIC; @@ -379,15 +377,15 @@ public class SettingsFragment extends PreferenceFragmentCompat if (!settingsLoaded) return; boolean btEnabledSetting = - btSettings.getBoolean(PREF_BT_ENABLE, false); + btSettings.getBoolean(PREF_PLUGIN_ENABLE, false); enableBluetooth.setChecked(btEnabledSetting); boolean wifiEnabledSetting = - wifiSettings.getBoolean(PREF_TCP_ENABLE, false); + wifiSettings.getBoolean(PREF_PLUGIN_ENABLE, false); enableWifi.setChecked(wifiEnabledSetting); boolean torEnabledSetting = - torSettings.getBoolean(PREF_TOR_ENABLE, true); + torSettings.getBoolean(PREF_PLUGIN_ENABLE, true); enableTor.setChecked(torEnabledSetting); int torNetworkSetting = torSettings.getInt(PREF_TOR_NETWORK, @@ -639,7 +637,7 @@ public class SettingsFragment extends PreferenceFragmentCompat private void storeTorEnabledSetting(boolean torEnabledSetting) { Settings s = new Settings(); - s.putBoolean(PREF_TOR_ENABLE, torEnabledSetting); + s.putBoolean(PREF_PLUGIN_ENABLE, torEnabledSetting); mergeSettings(s, TOR_NAMESPACE); } @@ -663,13 +661,13 @@ public class SettingsFragment extends PreferenceFragmentCompat private void storeBluetoothSetting(boolean btSetting) { Settings s = new Settings(); - s.putBoolean(PREF_BT_ENABLE, btSetting); + s.putBoolean(PREF_PLUGIN_ENABLE, btSetting); mergeSettings(s, BT_NAMESPACE); } private void storeWifiSetting(boolean wifiSetting) { Settings s = new Settings(); - s.putBoolean(PREF_TCP_ENABLE, wifiSetting); + s.putBoolean(PREF_PLUGIN_ENABLE, wifiSetting); mergeSettings(s, WIFI_NAMESPACE); }