From a2b3ef9e625a473ecf2dab30ca548192243a2d3d Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Mon, 10 Mar 2014 19:06:14 +0000 Subject: [PATCH] If Bluetooth is activated to add a contact, deactivate it afterwards. Bug #47. --- .../invitation/AddContactActivity.java | 32 ++++++++++++++++++- .../api/invitation/InvitationTaskFactory.java | 2 +- .../invitation/AliceConnector.java | 11 ++++--- .../briarproject/invitation/BobConnector.java | 11 ++++--- .../briarproject/invitation/Connector.java | 6 ++-- .../invitation/ConnectorGroup.java | 13 +++++--- .../invitation/InvitationTaskFactoryImpl.java | 5 +-- 7 files changed, 59 insertions(+), 21 deletions(-) diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java index 4a473dcfa2..83e707f172 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 33fd35b647..4344548017 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 b28c957f37..496d5a877e 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 44372d5894..55ccebcf13 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 a8952c2987..f10aa2687c 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 c049830bee..862a411b3c 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 a9bf4c8949..c0b0487204 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); } } -- GitLab