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 713c007c5..470634fa1 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/BrambleAndroidModule.java @@ -1,5 +1,6 @@ package org.briarproject.bramble; +import org.briarproject.bramble.battery.AndroidBatteryModule; import org.briarproject.bramble.network.AndroidNetworkModule; import org.briarproject.bramble.plugin.tor.CircumventionModule; import org.briarproject.bramble.system.AndroidSystemModule; @@ -7,6 +8,7 @@ import org.briarproject.bramble.system.AndroidSystemModule; import dagger.Module; @Module(includes = { + AndroidBatteryModule.class, AndroidNetworkModule.class, AndroidSystemModule.class, CircumventionModule.class diff --git a/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryManager.java b/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryManager.java new file mode 100644 index 000000000..3b8250dad --- /dev/null +++ b/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryManager.java @@ -0,0 +1,84 @@ +package org.briarproject.bramble.battery; + +import android.app.Application; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + +import org.briarproject.bramble.api.battery.BatteryManager; +import org.briarproject.bramble.api.battery.event.BatteryEvent; +import org.briarproject.bramble.api.event.EventBus; +import org.briarproject.bramble.api.lifecycle.Service; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Logger; + +import javax.inject.Inject; + +import static android.content.Intent.ACTION_BATTERY_CHANGED; +import static android.content.Intent.ACTION_POWER_CONNECTED; +import static android.content.Intent.ACTION_POWER_DISCONNECTED; +import static android.os.BatteryManager.BATTERY_STATUS_CHARGING; +import static android.os.BatteryManager.BATTERY_STATUS_FULL; +import static android.os.BatteryManager.EXTRA_STATUS; +import static java.util.logging.Level.INFO; +import static java.util.logging.Logger.getLogger; + +class AndroidBatteryManager implements BatteryManager, Service { + + private static final Logger LOG = + getLogger(AndroidBatteryManager.class.getName()); + + private final Context appContext; + private final EventBus eventBus; + private final AtomicBoolean used = new AtomicBoolean(false); + + private volatile BroadcastReceiver batteryReceiver = null; + + @Inject + AndroidBatteryManager(Application app, EventBus eventBus) { + this.appContext = app.getApplicationContext(); + this.eventBus = eventBus; + } + + @Override + public boolean isCharging() { + // Get the sticky intent for ACTION_BATTERY_CHANGED + IntentFilter filter = new IntentFilter(ACTION_BATTERY_CHANGED); + Intent i = appContext.registerReceiver(null, filter); + if (i == null) return false; + int status = i.getIntExtra(EXTRA_STATUS, -1); + return status == BATTERY_STATUS_CHARGING || + status == BATTERY_STATUS_FULL; + } + + @Override + public void startService() { + if (used.getAndSet(true)) throw new IllegalStateException(); + batteryReceiver = new BatteryReceiver(); + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_POWER_CONNECTED); + filter.addAction(ACTION_POWER_DISCONNECTED); + appContext.registerReceiver(batteryReceiver, filter); + } + + @Override + public void stopService() { + if (batteryReceiver != null) + appContext.unregisterReceiver(batteryReceiver); + } + + private class BatteryReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context ctx, Intent i) { + String action = i.getAction(); + if (LOG.isLoggable(INFO)) LOG.info("Received broadcast " + action); + if (ACTION_POWER_CONNECTED.equals(action)) + eventBus.broadcast(new BatteryEvent(true)); + else if (ACTION_POWER_DISCONNECTED.equals(action)) + eventBus.broadcast(new BatteryEvent(false)); + } + } +} diff --git a/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryModule.java b/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryModule.java new file mode 100644 index 000000000..65895dde0 --- /dev/null +++ b/bramble-android/src/main/java/org/briarproject/bramble/battery/AndroidBatteryModule.java @@ -0,0 +1,21 @@ +package org.briarproject.bramble.battery; + +import org.briarproject.bramble.api.battery.BatteryManager; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class AndroidBatteryModule { + + @Provides + @Singleton + BatteryManager provideBatteryManager(LifecycleManager lifecycleManager, + AndroidBatteryManager batteryManager) { + lifecycleManager.registerService(batteryManager); + return batteryManager; + } +} diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPlugin.java index c2cdac186..12093ae89 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPlugin.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPlugin.java @@ -6,6 +6,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.PowerManager; +import org.briarproject.bramble.api.battery.BatteryManager; import org.briarproject.bramble.api.network.NetworkManager; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; @@ -41,17 +42,18 @@ class AndroidTorPlugin extends TorPlugin { Context appContext, NetworkManager networkManager, LocationUtils locationUtils, SocketFactory torSocketFactory, Clock clock, ResourceProvider resourceProvider, - CircumventionProvider circumventionProvider, Backoff backoff, + CircumventionProvider circumventionProvider, + BatteryManager batteryManager, Backoff backoff, DuplexPluginCallback callback, String architecture, int maxLatency, int maxIdleTime) { super(ioExecutor, networkManager, locationUtils, torSocketFactory, - clock, resourceProvider, circumventionProvider, backoff, - callback, architecture, maxLatency, maxIdleTime, + clock, resourceProvider, circumventionProvider, batteryManager, + backoff, callback, architecture, maxLatency, maxIdleTime, appContext.getDir("tor", MODE_PRIVATE)); this.appContext = appContext; PowerManager pm = (PowerManager) appContext.getSystemService(POWER_SERVICE); - assert pm != null; + if (pm == null) throw new AssertionError(); wakeLock = new RenewableWakeLock(pm, scheduler, PARTIAL_WAKE_LOCK, WAKE_LOCK_TAG, 1, MINUTES); } diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java index 7287317a9..df3de1c77 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java @@ -3,6 +3,7 @@ package org.briarproject.bramble.plugin.tor; import android.content.Context; import android.os.Build; +import org.briarproject.bramble.api.battery.BatteryManager; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.network.NetworkManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @@ -48,6 +49,7 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory { private final BackoffFactory backoffFactory; private final ResourceProvider resourceProvider; private final CircumventionProvider circumventionProvider; + private final BatteryManager batteryManager; private final Clock clock; public AndroidTorPluginFactory(Executor ioExecutor, @@ -55,7 +57,8 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory { NetworkManager networkManager, LocationUtils locationUtils, EventBus eventBus, SocketFactory torSocketFactory, BackoffFactory backoffFactory, ResourceProvider resourceProvider, - CircumventionProvider circumventionProvider, Clock clock) { + CircumventionProvider circumventionProvider, + BatteryManager batteryManager, Clock clock) { this.ioExecutor = ioExecutor; this.scheduler = scheduler; this.appContext = appContext; @@ -66,6 +69,7 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory { this.backoffFactory = backoffFactory; this.resourceProvider = resourceProvider; this.circumventionProvider = circumventionProvider; + this.batteryManager = batteryManager; this.clock = clock; } @@ -104,8 +108,8 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory { MAX_POLLING_INTERVAL, BACKOFF_BASE); AndroidTorPlugin plugin = new AndroidTorPlugin(ioExecutor, scheduler, appContext, networkManager, locationUtils, torSocketFactory, - clock, resourceProvider, circumventionProvider, backoff, - callback, architecture, MAX_LATENCY, MAX_IDLE_TIME); + clock, resourceProvider, circumventionProvider, batteryManager, + backoff, callback, architecture, MAX_LATENCY, MAX_IDLE_TIME); eventBus.addListener(plugin); return plugin; } diff --git a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java index 5c0d073bd..d54ad4ea3 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java @@ -11,15 +11,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; -import java.util.logging.Logger; import static android.content.Context.MODE_PRIVATE; +import static android.os.Build.VERSION.SDK_INT; public class AndroidUtils { - private static final Logger LOG = - Logger.getLogger(AndroidUtils.class.getName()); - // Fake Bluetooth address returned by BluetoothAdapter on API 23 and later private static final String FAKE_BLUETOOTH_ADDRESS = "02:00:00:00:00:00"; @@ -28,7 +25,7 @@ public class AndroidUtils { @SuppressWarnings("deprecation") public static Collection getSupportedArchitectures() { List abis = new ArrayList<>(); - if (Build.VERSION.SDK_INT >= 21) { + if (SDK_INT >= 21) { abis.addAll(Arrays.asList(Build.SUPPORTED_ABIS)); } else { abis.add(Build.CPU_ABI); diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/battery/BatteryManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/battery/BatteryManager.java new file mode 100644 index 000000000..33ea51e91 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/battery/BatteryManager.java @@ -0,0 +1,6 @@ +package org.briarproject.bramble.api.battery; + +public interface BatteryManager { + + boolean isCharging(); +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/battery/event/BatteryEvent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/battery/event/BatteryEvent.java new file mode 100644 index 000000000..0c853c201 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/battery/event/BatteryEvent.java @@ -0,0 +1,19 @@ +package org.briarproject.bramble.api.battery.event; + +import org.briarproject.bramble.api.event.Event; + +/** + * An event that is broadcast when the device starts or stops charging. + */ +public class BatteryEvent extends Event { + + private final boolean charging; + + public BatteryEvent(boolean charging) { + this.charging = charging; + } + + public boolean isCharging() { + return charging; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/battery/DefaultBatteryManagerModule.java b/bramble-core/src/main/java/org/briarproject/bramble/battery/DefaultBatteryManagerModule.java new file mode 100644 index 000000000..c87b1bfe1 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/battery/DefaultBatteryManagerModule.java @@ -0,0 +1,19 @@ +package org.briarproject.bramble.battery; + +import org.briarproject.bramble.api.battery.BatteryManager; + +import dagger.Module; +import dagger.Provides; + +/** + * Provides a default implementation of {@link BatteryManager} for systems + * without batteries. + */ +@Module +public class DefaultBatteryManagerModule { + + @Provides + BatteryManager provideBatteryManager() { + return () -> false; + } +} 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 374238d0d..b2df4e51d 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 @@ -4,6 +4,8 @@ import net.freehaven.tor.control.EventHandler; import net.freehaven.tor.control.TorControlConnection; import org.briarproject.bramble.PoliteExecutor; +import org.briarproject.bramble.api.battery.BatteryManager; +import org.briarproject.bramble.api.battery.event.BatteryEvent; import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.event.Event; @@ -96,6 +98,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { private final LocationUtils locationUtils; private final SocketFactory torSocketFactory; private final Clock clock; + private final BatteryManager batteryManager; private final Backoff backoff; private final DuplexPluginCallback callback; private final String architecture; @@ -121,7 +124,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { TorPlugin(Executor ioExecutor, NetworkManager networkManager, LocationUtils locationUtils, SocketFactory torSocketFactory, Clock clock, ResourceProvider resourceProvider, - CircumventionProvider circumventionProvider, Backoff backoff, + CircumventionProvider circumventionProvider, + BatteryManager batteryManager, Backoff backoff, DuplexPluginCallback callback, String architecture, int maxLatency, int maxIdleTime, File torDirectory) { this.ioExecutor = ioExecutor; @@ -131,6 +135,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { this.clock = clock; this.resourceProvider = resourceProvider; this.circumventionProvider = circumventionProvider; + this.batteryManager = batteryManager; this.backoff = backoff; this.callback = callback; this.architecture = architecture; @@ -261,7 +266,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { throw new PluginException(e); } // Check whether we're online - updateConnectionStatus(networkManager.getNetworkStatus()); + updateConnectionStatus(networkManager.getNetworkStatus(), + batteryManager.isCharging()); // Bind a server socket to receive incoming hidden service connections bind(); } @@ -628,7 +634,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { LOG.info("OR connection " + status + " " + orName); if (status.equals("CLOSED") || status.equals("FAILED")) { // Check whether we've lost connectivity - updateConnectionStatus(networkManager.getNetworkStatus()); + updateConnectionStatus(networkManager.getNetworkStatus(), + batteryManager.isCharging()); } } @@ -666,10 +673,15 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { // Works around a bug introduced in Tor 0.3.4.8. Could be // replaced with callback.transportDisabled() when fixed. disableNetwork(); - updateConnectionStatus(networkManager.getNetworkStatus()); + updateConnectionStatus(networkManager.getNetworkStatus(), + batteryManager.isCharging()); } } else if (e instanceof NetworkStatusEvent) { - updateConnectionStatus(((NetworkStatusEvent) e).getStatus()); + updateConnectionStatus(((NetworkStatusEvent) e).getStatus(), + batteryManager.isCharging()); + } else if (e instanceof BatteryEvent) { + updateConnectionStatus(networkManager.getNetworkStatus(), + ((BatteryEvent) e).isCharging()); } } @@ -683,7 +695,8 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { }); } - private void updateConnectionStatus(NetworkStatus status) { + private void updateConnectionStatus(NetworkStatus status, + boolean charging) { connectionStatusExecutor.execute(() -> { if (!running) return; boolean online = status.isConnected(); @@ -701,6 +714,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { LOG.info("Online: " + online + ", wifi: " + wifi); if ("".equals(country)) LOG.info("Country code unknown"); else LOG.info("Country code: " + country); + LOG.info("Charging: " + charging); } try { @@ -724,12 +738,24 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener { enableBridges(false); enableNetwork(true); } + if (online && wifi && charging) { + LOG.info("Enabling connection padding"); + enableConnectionPadding(true); + } else { + LOG.info("Disabling connection padding"); + enableConnectionPadding(false); + } } catch (IOException e) { logException(LOG, WARNING, e); } }); } + private void enableConnectionPadding(boolean enable) throws IOException { + if (!running) return; + controlConnection.setConf("ConnectionPadding", enable ? "1" : "0"); + } + // TODO remove when sufficient time has passed. Added 2018-08-15 private void migrateSettings() { Settings sOld = callback.getSettings(); 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 3eccaebf5..75bd3f969 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,10 +1,7 @@ package org.briarproject.bramble.network; -import org.briarproject.bramble.api.event.EventBus; -import org.briarproject.bramble.api.lifecycle.Service; import org.briarproject.bramble.api.network.NetworkManager; import org.briarproject.bramble.api.network.NetworkStatus; -import org.briarproject.bramble.api.network.event.NetworkStatusEvent; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; @@ -23,25 +20,13 @@ import static org.briarproject.bramble.util.LogUtils.logException; @MethodsNotNullByDefault @ParametersNotNullByDefault -class JavaNetworkManager implements NetworkManager, Service { +class JavaNetworkManager implements NetworkManager { private static final Logger LOG = Logger.getLogger(JavaNetworkManager.class.getName()); - private final EventBus eventBus; - @Inject - JavaNetworkManager(EventBus eventBus) { - this.eventBus = eventBus; - } - - @Override - public void startService() { - eventBus.broadcast(new NetworkStatusEvent(getNetworkStatus())); - } - - @Override - public void stopService() { + JavaNetworkManager() { } @Override 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 3c1b1e279..308f56cc2 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,6 +1,5 @@ package org.briarproject.bramble.network; -import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.network.NetworkManager; import javax.inject.Singleton; @@ -13,9 +12,7 @@ public class JavaNetworkModule { @Provides @Singleton - NetworkManager provideNetworkManager(LifecycleManager lifecycleManager, - JavaNetworkManager networkManager) { - lifecycleManager.registerService(networkManager); + NetworkManager provideNetworkManager(JavaNetworkManager networkManager) { return networkManager; } } diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPlugin.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPlugin.java index d9905c1df..943702c79 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPlugin.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPlugin.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.plugin.tor; +import org.briarproject.bramble.api.battery.BatteryManager; import org.briarproject.bramble.api.network.NetworkManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.Backoff; @@ -23,12 +24,14 @@ class LinuxTorPlugin extends TorPlugin { LinuxTorPlugin(Executor ioExecutor, NetworkManager networkManager, LocationUtils locationUtils, SocketFactory torSocketFactory, Clock clock, ResourceProvider resourceProvider, - CircumventionProvider circumventionProvider, Backoff backoff, + CircumventionProvider circumventionProvider, + BatteryManager batteryManager, Backoff backoff, DuplexPluginCallback callback, String architecture, int maxLatency, int maxIdleTime, File torDirectory) { super(ioExecutor, networkManager, locationUtils, torSocketFactory, - clock, resourceProvider, circumventionProvider, backoff, - callback, architecture, maxLatency, maxIdleTime, torDirectory); + clock, resourceProvider, circumventionProvider, batteryManager, + backoff, callback, architecture, maxLatency, maxIdleTime, + torDirectory); } @Override diff --git a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPluginFactory.java b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPluginFactory.java index 466399a57..5bf4dfee2 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPluginFactory.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/LinuxTorPluginFactory.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.plugin.tor; +import org.briarproject.bramble.api.battery.BatteryManager; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.network.NetworkManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @@ -44,6 +45,7 @@ public class LinuxTorPluginFactory implements DuplexPluginFactory { private final BackoffFactory backoffFactory; private final ResourceProvider resourceProvider; private final CircumventionProvider circumventionProvider; + private final BatteryManager batteryManager; private final Clock clock; private final File torDirectory; @@ -51,8 +53,8 @@ public class LinuxTorPluginFactory implements DuplexPluginFactory { NetworkManager networkManager, LocationUtils locationUtils, EventBus eventBus, SocketFactory torSocketFactory, BackoffFactory backoffFactory, ResourceProvider resourceProvider, - CircumventionProvider circumventionProvider, Clock clock, - File torDirectory) { + CircumventionProvider circumventionProvider, + BatteryManager batteryManager, Clock clock, File torDirectory) { this.ioExecutor = ioExecutor; this.networkManager = networkManager; this.locationUtils = locationUtils; @@ -61,6 +63,7 @@ public class LinuxTorPluginFactory implements DuplexPluginFactory { this.backoffFactory = backoffFactory; this.resourceProvider = resourceProvider; this.circumventionProvider = circumventionProvider; + this.batteryManager = batteryManager; this.clock = clock; this.torDirectory = torDirectory; } @@ -92,11 +95,10 @@ public class LinuxTorPluginFactory implements DuplexPluginFactory { Backoff backoff = backoffFactory.createBackoff(MIN_POLLING_INTERVAL, MAX_POLLING_INTERVAL, BACKOFF_BASE); - LinuxTorPlugin plugin = - new LinuxTorPlugin(ioExecutor, networkManager, locationUtils, - torSocketFactory, clock, resourceProvider, - circumventionProvider, backoff, callback, architecture, - MAX_LATENCY, MAX_IDLE_TIME, torDirectory); + LinuxTorPlugin plugin = new LinuxTorPlugin(ioExecutor, networkManager, + locationUtils, torSocketFactory, clock, resourceProvider, + circumventionProvider, batteryManager, backoff, callback, + architecture, MAX_LATENCY, MAX_IDLE_TIME, torDirectory); eventBus.addListener(plugin); return plugin; } diff --git a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java index 656a4805b..3901dd21d 100644 --- a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java +++ b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.plugin.tor; +import org.briarproject.bramble.api.battery.BatteryManager; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.network.NetworkManager; import org.briarproject.bramble.api.plugin.BackoffFactory; @@ -58,6 +59,8 @@ public class BridgeTest extends BrambleTestCase { @Inject CircumventionProvider circumventionProvider; @Inject + BatteryManager batteryManager; + @Inject EventBus eventBus; @Inject BackoffFactory backoffFactory; @@ -107,7 +110,8 @@ public class BridgeTest extends BrambleTestCase { }; factory = new LinuxTorPluginFactory(ioExecutor, networkManager, locationUtils, eventBus, torSocketFactory, backoffFactory, - resourceProvider, bridgeProvider, clock, torDir); + resourceProvider, bridgeProvider, batteryManager, clock, + torDir); } @After diff --git a/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java b/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java index be6708596..0b775f964 100644 --- a/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java +++ b/bramble-java/src/test/java/org/briarproject/bramble/test/BrambleJavaIntegrationTestComponent.java @@ -1,6 +1,7 @@ package org.briarproject.bramble.test; import org.briarproject.bramble.BrambleJavaModule; +import org.briarproject.bramble.battery.DefaultBatteryManagerModule; import org.briarproject.bramble.event.EventModule; import org.briarproject.bramble.plugin.PluginModule; import org.briarproject.bramble.plugin.tor.BridgeTest; @@ -15,6 +16,7 @@ import dagger.Component; @Component(modules = { BrambleJavaModule.class, TestLifecycleModule.class, + DefaultBatteryManagerModule.class, PluginModule.class, // needed for BackoffFactory EventModule.class, SystemModule.class, 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 c993eacaa..dcc747a24 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 @@ -7,6 +7,7 @@ import android.os.StrictMode; import com.vanniktech.emoji.RecentEmoji; +import org.briarproject.bramble.api.battery.BatteryManager; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.db.DatabaseConfig; @@ -104,7 +105,8 @@ public class AppModule { Application app, NetworkManager networkManager, LocationUtils locationUtils, EventBus eventBus, ResourceProvider resourceProvider, - CircumventionProvider circumventionProvider, Clock clock) { + CircumventionProvider circumventionProvider, + BatteryManager batteryManager, Clock clock) { Context appContext = app.getApplicationContext(); DuplexPluginFactory bluetooth = new AndroidBluetoothPluginFactory(ioExecutor, androidExecutor, @@ -112,7 +114,7 @@ public class AppModule { DuplexPluginFactory tor = new AndroidTorPluginFactory(ioExecutor, scheduler, appContext, networkManager, locationUtils, eventBus, torSocketFactory, backoffFactory, resourceProvider, - circumventionProvider, clock); + circumventionProvider, batteryManager, clock); DuplexPluginFactory lan = new AndroidLanTcpPluginFactory(ioExecutor, eventBus, backoffFactory, appContext); Collection duplex = asList(bluetooth, tor, lan); diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt index 08d4e6287..f9d3c00db 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt @@ -3,6 +3,7 @@ package org.briarproject.briar.headless import com.fasterxml.jackson.databind.ObjectMapper import dagger.Module import dagger.Provides +import org.briarproject.bramble.api.battery.BatteryManager import org.briarproject.bramble.api.crypto.CryptoComponent import org.briarproject.bramble.api.crypto.PublicKey import org.briarproject.bramble.api.db.DatabaseConfig @@ -19,6 +20,7 @@ import org.briarproject.bramble.api.reporting.ReportingConstants.DEV_PUBLIC_KEY_ import org.briarproject.bramble.api.system.Clock import org.briarproject.bramble.api.system.LocationUtils import org.briarproject.bramble.api.system.ResourceProvider +import org.briarproject.bramble.battery.DefaultBatteryManagerModule import org.briarproject.bramble.network.JavaNetworkModule import org.briarproject.bramble.plugin.tor.CircumventionModule import org.briarproject.bramble.plugin.tor.CircumventionProvider @@ -42,6 +44,7 @@ import javax.net.SocketFactory JavaNetworkModule::class, JavaSystemModule::class, CircumventionModule::class, + DefaultBatteryManagerModule::class, HeadlessBlogModule::class, HeadlessContactModule::class, HeadlessEventModule::class, @@ -63,16 +66,13 @@ internal class HeadlessModule(private val appDir: File) { internal fun providePluginConfig( @IoExecutor ioExecutor: Executor, torSocketFactory: SocketFactory, backoffFactory: BackoffFactory, networkManager: NetworkManager, - locationUtils: LocationUtils, eventBus: EventBus, - resourceProvider: ResourceProvider, - circumventionProvider: CircumventionProvider, clock: Clock + locationUtils: LocationUtils, eventBus: EventBus, resourceProvider: ResourceProvider, + circumventionProvider: CircumventionProvider, batteryManager: BatteryManager, clock: Clock ): PluginConfig { val torDirectory = File(appDir, "tor") val tor = LinuxTorPluginFactory( - ioExecutor, - networkManager, locationUtils, eventBus, torSocketFactory, - backoffFactory, resourceProvider, circumventionProvider, clock, - torDirectory + ioExecutor, networkManager, locationUtils, eventBus, torSocketFactory, backoffFactory, + resourceProvider, circumventionProvider, batteryManager, clock, torDirectory ) val duplex = listOf(tor) return object : PluginConfig {