diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java index 4a473dcfa23496a02985f5344c516feca9ce6e62..83e707f1724a7bdd19b9fc7d09e068a0936b03ee 100644 --- a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java +++ b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java @@ -13,6 +13,8 @@ import org.briarproject.R; import org.briarproject.android.BriarActivity; import org.briarproject.api.AuthorId; import org.briarproject.api.LocalAuthor; +import org.briarproject.api.TransportConfig; +import org.briarproject.api.TransportId; import org.briarproject.api.android.ReferenceManager; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.db.DatabaseComponent; @@ -22,6 +24,7 @@ import org.briarproject.api.invitation.InvitationState; import org.briarproject.api.invitation.InvitationTask; import org.briarproject.api.invitation.InvitationTaskFactory; +import android.bluetooth.BluetoothAdapter; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; @@ -48,9 +51,11 @@ implements InvitationListener { private boolean localCompared = false, remoteCompared = false; private boolean localMatched = false, remoteMatched = false; private String contactName = null; + private boolean bluetoothWasEnabled = false; // Fields that are accessed from background threads must be volatile @Inject private volatile DatabaseComponent db; + private volatile boolean enableBluetooth = true; @Override public void onCreate(Bundle state) { @@ -129,6 +134,8 @@ implements InvitationListener { } } } + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + if(adapter != null) bluetoothWasEnabled = adapter.isEnabled(); } private void showToastAndFinish() { @@ -142,6 +149,25 @@ implements InvitationListener { public void onResume() { super.onResume(); view.populate(); + loadBluetoothSetting(); + } + + private void loadBluetoothSetting() { + runOnDbThread(new Runnable() { + public void run() { + try { + long now = System.currentTimeMillis(); + TransportConfig c = db.getConfig(new TransportId("bt")); + long duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) + LOG.info("Loading setting took " + duration + " ms"); + enableBluetooth = c.getBoolean("enable", true); + } catch(DbException e) { + if(LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + } + } + }); } @Override @@ -162,6 +188,10 @@ implements InvitationListener { public void onDestroy() { super.onDestroy(); if(task != null) task.removeListener(this); + if(!bluetoothWasEnabled && !enableBluetooth) { + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + if(adapter != null) adapter.disable(); + } } @Override @@ -248,7 +278,7 @@ implements InvitationListener { remoteInvitationCode = code; setView(new ConnectionView(this)); task = invitationTaskFactory.createTask(localAuthorId, - localInvitationCode, code); + localInvitationCode, code, enableBluetooth); taskHandle = referenceManager.putReference(task, InvitationTask.class); task.addListener(AddContactActivity.this); // Add a second listener so we can remove the first in onDestroy(), diff --git a/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java b/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java index 33fd35b6473f22489901aaa750235baaadfba297..43445480178a06455a8fe7dedf12a914dfdda492 100644 --- a/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java +++ b/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java @@ -7,5 +7,5 @@ public interface InvitationTaskFactory { /** Creates a task using the given pseudonym and invitation codes. */ InvitationTask createTask(AuthorId localAuthorId, int localCode, - int remoteCode); + int remoteCode, boolean reuseConnection); } diff --git a/briar-core/src/org/briarproject/invitation/AliceConnector.java b/briar-core/src/org/briarproject/invitation/AliceConnector.java index b28c957f371337bf9cbd5bea154314d6be9d7aab..496d5a877ef9fc9939eea829dcb61dfe15342e0a 100644 --- a/briar-core/src/org/briarproject/invitation/AliceConnector.java +++ b/briar-core/src/org/briarproject/invitation/AliceConnector.java @@ -46,14 +46,14 @@ class AliceConnector extends Connector { ConnectionWriterFactory connectionWriterFactory, AuthorFactory authorFactory, GroupFactory groupFactory, KeyManager keyManager, ConnectionDispatcher connectionDispatcher, - Clock clock, ConnectorGroup group, DuplexPlugin plugin, - LocalAuthor localAuthor, + Clock clock, boolean reuseConnection, ConnectorGroup group, + DuplexPlugin plugin, LocalAuthor localAuthor, Map<TransportId, TransportProperties> localProps, PseudoRandom random) { super(crypto, db, readerFactory, writerFactory, connectionReaderFactory, connectionWriterFactory, authorFactory, groupFactory, - keyManager, connectionDispatcher, clock, group, plugin, - localAuthor, localProps, random); + keyManager, connectionDispatcher, clock, reuseConnection, group, + plugin, localAuthor, localProps, random); } @Override @@ -181,6 +181,7 @@ class AliceConnector extends Connector { LOG.info(pluginName + " pseudonym exchange succeeded"); group.pseudonymExchangeSucceeded(remoteAuthor); // Reuse the connection as an outgoing BTP connection - reuseConnection(conn, true); + if(reuseConnection) reuseConnection(conn, true); + else tryToClose(conn, false); } } \ No newline at end of file diff --git a/briar-core/src/org/briarproject/invitation/BobConnector.java b/briar-core/src/org/briarproject/invitation/BobConnector.java index 44372d5894730005c81e1fd9ecab96de37414c02..55ccebcf13e251b80b7ab4be10ed48e65d11b512 100644 --- a/briar-core/src/org/briarproject/invitation/BobConnector.java +++ b/briar-core/src/org/briarproject/invitation/BobConnector.java @@ -46,14 +46,14 @@ class BobConnector extends Connector { ConnectionWriterFactory connectionWriterFactory, AuthorFactory authorFactory, GroupFactory groupFactory, KeyManager keyManager, ConnectionDispatcher connectionDispatcher, - Clock clock, ConnectorGroup group, DuplexPlugin plugin, - LocalAuthor localAuthor, + Clock clock, boolean reuseConnection, ConnectorGroup group, + DuplexPlugin plugin, LocalAuthor localAuthor, Map<TransportId, TransportProperties> localProps, PseudoRandom random) { super(crypto, db, readerFactory, writerFactory, connectionReaderFactory, connectionWriterFactory, authorFactory, groupFactory, - keyManager, connectionDispatcher, clock, group, plugin, - localAuthor, localProps, random); + keyManager, connectionDispatcher, clock, reuseConnection, group, + plugin, localAuthor, localProps, random); } @Override @@ -181,6 +181,7 @@ class BobConnector extends Connector { LOG.info(pluginName + " pseudonym exchange succeeded"); group.pseudonymExchangeSucceeded(remoteAuthor); // Reuse the connection as an incoming BTP connection - reuseConnection(conn, false); + if(reuseConnection) reuseConnection(conn, false); + else tryToClose(conn, false); } } diff --git a/briar-core/src/org/briarproject/invitation/Connector.java b/briar-core/src/org/briarproject/invitation/Connector.java index a8952c2987beeec614fbe2da007360c3bf81dfb8..f10aa2687c712ec80d947d1eaacd05958612efc8 100644 --- a/briar-core/src/org/briarproject/invitation/Connector.java +++ b/briar-core/src/org/briarproject/invitation/Connector.java @@ -71,6 +71,7 @@ abstract class Connector extends Thread { protected final KeyManager keyManager; protected final ConnectionDispatcher connectionDispatcher; protected final Clock clock; + protected final boolean reuseConnection; protected final ConnectorGroup group; protected final DuplexPlugin plugin; protected final LocalAuthor localAuthor; @@ -90,8 +91,8 @@ abstract class Connector extends Thread { ConnectionWriterFactory connectionWriterFactory, AuthorFactory authorFactory, GroupFactory groupFactory, KeyManager keyManager, ConnectionDispatcher connectionDispatcher, - Clock clock, ConnectorGroup group, DuplexPlugin plugin, - LocalAuthor localAuthor, + Clock clock, boolean reuseConnection, ConnectorGroup group, + DuplexPlugin plugin, LocalAuthor localAuthor, Map<TransportId, TransportProperties> localProps, PseudoRandom random) { super("Connector"); @@ -106,6 +107,7 @@ abstract class Connector extends Thread { this.keyManager = keyManager; this.connectionDispatcher = connectionDispatcher; this.clock = clock; + this.reuseConnection = reuseConnection; this.group = group; this.plugin = plugin; this.localAuthor = localAuthor; diff --git a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java index c049830beed9ecb670bd31816d91b76c2e48c15e..862a411b3c5695fea5dc443ae5a819649c577908 100644 --- a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java +++ b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java @@ -56,6 +56,7 @@ class ConnectorGroup extends Thread implements InvitationTask { private final PluginManager pluginManager; private final AuthorId localAuthorId; private final int localInvitationCode, remoteInvitationCode; + private final boolean reuseConnection; private final Collection<InvitationListener> listeners; private final AtomicBoolean connected; private final CountDownLatch localConfirmationLatch; @@ -79,7 +80,8 @@ class ConnectorGroup extends Thread implements InvitationTask { AuthorFactory authorFactory, GroupFactory groupFactory, KeyManager keyManager, ConnectionDispatcher connectionDispatcher, Clock clock, PluginManager pluginManager, AuthorId localAuthorId, - int localInvitationCode, int remoteInvitationCode) { + int localInvitationCode, int remoteInvitationCode, + boolean reuseConnection) { super("ConnectorGroup"); this.crypto = crypto; this.db = db; @@ -96,6 +98,7 @@ class ConnectorGroup extends Thread implements InvitationTask { this.localAuthorId = localAuthorId; this.localInvitationCode = localInvitationCode; this.remoteInvitationCode = remoteInvitationCode; + this.reuseConnection = reuseConnection; listeners = new CopyOnWriteArrayList<InvitationListener>(); connected = new AtomicBoolean(false); localConfirmationLatch = new CountDownLatch(1); @@ -174,8 +177,8 @@ class ConnectorGroup extends Thread implements InvitationTask { remoteInvitationCode); return new AliceConnector(crypto, db, readerFactory, writerFactory, connectionReaderFactory, connectionWriterFactory, authorFactory, - groupFactory, keyManager, connectionDispatcher, clock, this, - plugin, localAuthor, localProps, random); + groupFactory, keyManager, connectionDispatcher, clock, + reuseConnection, this, plugin, localAuthor, localProps, random); } private Connector createBobConnector(DuplexPlugin plugin, @@ -185,8 +188,8 @@ class ConnectorGroup extends Thread implements InvitationTask { localInvitationCode); return new BobConnector(crypto, db, readerFactory, writerFactory, connectionReaderFactory, connectionWriterFactory, authorFactory, - groupFactory, keyManager, connectionDispatcher, clock, this, - plugin, localAuthor, localProps, random); + groupFactory, keyManager, connectionDispatcher, clock, + reuseConnection, this, plugin, localAuthor, localProps, random); } public void localConfirmationSucceeded() { diff --git a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java index a9bf4c8949feea71a6603c973101dcbd3f33bfb6..c0b048720491e36c8cf7ee24369cbc916b90a5ae 100644 --- a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java +++ b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java @@ -56,10 +56,11 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory { } public InvitationTask createTask(AuthorId localAuthorId, int localCode, - int remoteCode) { + int remoteCode, boolean reuseConnection) { return new ConnectorGroup(crypto, db, readerFactory, writerFactory, connectionReaderFactory, connectionWriterFactory, authorFactory, groupFactory, keyManager, connectionDispatcher, - clock, pluginManager, localAuthorId, localCode, remoteCode); + clock, pluginManager, localAuthorId, localCode, remoteCode, + reuseConnection); } }