diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java index 9b121f09d..258085393 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java @@ -177,7 +177,7 @@ class AndroidBluetoothPlugin extends BluetoothPlugin { private DuplexTransportConnection wrapSocket(BluetoothSocket s) throws IOException { return new AndroidBluetoothTransportConnection(this, connectionLimiter, - timeoutMonitor, s); + timeoutMonitor, appContext, s); } @Override diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothTransportConnection.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothTransportConnection.java index bf6b3d69f..54df326c9 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothTransportConnection.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothTransportConnection.java @@ -1,6 +1,10 @@ package org.briarproject.bramble.plugin.bluetooth; +import android.annotation.SuppressLint; import android.bluetooth.BluetoothSocket; +import android.content.Context; +import android.os.PowerManager; +import android.os.PowerManager.WakeLock; import org.briarproject.bramble.api.io.TimeoutMonitor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @@ -11,6 +15,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import static android.content.Context.POWER_SERVICE; +import static android.os.PowerManager.PARTIAL_WAKE_LOCK; +import static org.briarproject.bramble.api.nullsafety.NullSafety.requireNonNull; import static org.briarproject.bramble.api.plugin.BluetoothConstants.PROP_ADDRESS; import static org.briarproject.bramble.util.AndroidUtils.isValidBluetoothAddress; @@ -18,19 +25,28 @@ import static org.briarproject.bramble.util.AndroidUtils.isValidBluetoothAddress class AndroidBluetoothTransportConnection extends AbstractDuplexTransportConnection { + private static final String WAKE_LOCK_TAG = + "org.briarproject.briar.android:bluetooth"; + private final BluetoothConnectionLimiter connectionLimiter; private final BluetoothSocket socket; private final InputStream in; + private final WakeLock wakeLock; + @SuppressLint("WakelockTimeout") AndroidBluetoothTransportConnection(Plugin plugin, BluetoothConnectionLimiter connectionLimiter, - TimeoutMonitor timeoutMonitor, BluetoothSocket socket) - throws IOException { + TimeoutMonitor timeoutMonitor, Context appContext, + BluetoothSocket socket) throws IOException { super(plugin); this.connectionLimiter = connectionLimiter; this.socket = socket; in = timeoutMonitor.createTimeoutInputStream( socket.getInputStream(), plugin.getMaxIdleTime() * 2); + PowerManager pm = (PowerManager) + requireNonNull(appContext.getSystemService(POWER_SERVICE)); + wakeLock = pm.newWakeLock(PARTIAL_WAKE_LOCK, WAKE_LOCK_TAG); + wakeLock.acquire(); String address = socket.getRemoteDevice().getAddress(); if (isValidBluetoothAddress(address)) remote.put(PROP_ADDRESS, address); } @@ -50,6 +66,7 @@ class AndroidBluetoothTransportConnection try { socket.close(); } finally { + wakeLock.release(); connectionLimiter.connectionClosed(this); } }