If Bluetooth is activated to add a contact, deactivate it afterwards.

Bug #47.
This commit is contained in:
akwizgran
2014-03-10 19:06:14 +00:00
parent cd4fb6fb64
commit a2b3ef9e62
7 changed files with 59 additions and 21 deletions

View File

@@ -13,6 +13,8 @@ import org.briarproject.R;
import org.briarproject.android.BriarActivity; import org.briarproject.android.BriarActivity;
import org.briarproject.api.AuthorId; import org.briarproject.api.AuthorId;
import org.briarproject.api.LocalAuthor; 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.android.ReferenceManager;
import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.CryptoComponent;
import org.briarproject.api.db.DatabaseComponent; 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.InvitationTask;
import org.briarproject.api.invitation.InvitationTaskFactory; import org.briarproject.api.invitation.InvitationTaskFactory;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.widget.Toast; import android.widget.Toast;
@@ -48,9 +51,11 @@ implements InvitationListener {
private boolean localCompared = false, remoteCompared = false; private boolean localCompared = false, remoteCompared = false;
private boolean localMatched = false, remoteMatched = false; private boolean localMatched = false, remoteMatched = false;
private String contactName = null; private String contactName = null;
private boolean bluetoothWasEnabled = false;
// Fields that are accessed from background threads must be volatile // Fields that are accessed from background threads must be volatile
@Inject private volatile DatabaseComponent db; @Inject private volatile DatabaseComponent db;
private volatile boolean enableBluetooth = true;
@Override @Override
public void onCreate(Bundle state) { public void onCreate(Bundle state) {
@@ -129,6 +134,8 @@ implements InvitationListener {
} }
} }
} }
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if(adapter != null) bluetoothWasEnabled = adapter.isEnabled();
} }
private void showToastAndFinish() { private void showToastAndFinish() {
@@ -142,6 +149,25 @@ implements InvitationListener {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
view.populate(); 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 @Override
@@ -162,6 +188,10 @@ implements InvitationListener {
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
if(task != null) task.removeListener(this); if(task != null) task.removeListener(this);
if(!bluetoothWasEnabled && !enableBluetooth) {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if(adapter != null) adapter.disable();
}
} }
@Override @Override
@@ -248,7 +278,7 @@ implements InvitationListener {
remoteInvitationCode = code; remoteInvitationCode = code;
setView(new ConnectionView(this)); setView(new ConnectionView(this));
task = invitationTaskFactory.createTask(localAuthorId, task = invitationTaskFactory.createTask(localAuthorId,
localInvitationCode, code); localInvitationCode, code, enableBluetooth);
taskHandle = referenceManager.putReference(task, InvitationTask.class); taskHandle = referenceManager.putReference(task, InvitationTask.class);
task.addListener(AddContactActivity.this); task.addListener(AddContactActivity.this);
// Add a second listener so we can remove the first in onDestroy(), // Add a second listener so we can remove the first in onDestroy(),

View File

@@ -7,5 +7,5 @@ public interface InvitationTaskFactory {
/** Creates a task using the given pseudonym and invitation codes. */ /** Creates a task using the given pseudonym and invitation codes. */
InvitationTask createTask(AuthorId localAuthorId, int localCode, InvitationTask createTask(AuthorId localAuthorId, int localCode,
int remoteCode); int remoteCode, boolean reuseConnection);
} }

View File

@@ -46,14 +46,14 @@ class AliceConnector extends Connector {
ConnectionWriterFactory connectionWriterFactory, ConnectionWriterFactory connectionWriterFactory,
AuthorFactory authorFactory, GroupFactory groupFactory, AuthorFactory authorFactory, GroupFactory groupFactory,
KeyManager keyManager, ConnectionDispatcher connectionDispatcher, KeyManager keyManager, ConnectionDispatcher connectionDispatcher,
Clock clock, ConnectorGroup group, DuplexPlugin plugin, Clock clock, boolean reuseConnection, ConnectorGroup group,
LocalAuthor localAuthor, DuplexPlugin plugin, LocalAuthor localAuthor,
Map<TransportId, TransportProperties> localProps, Map<TransportId, TransportProperties> localProps,
PseudoRandom random) { PseudoRandom random) {
super(crypto, db, readerFactory, writerFactory, connectionReaderFactory, super(crypto, db, readerFactory, writerFactory, connectionReaderFactory,
connectionWriterFactory, authorFactory, groupFactory, connectionWriterFactory, authorFactory, groupFactory,
keyManager, connectionDispatcher, clock, group, plugin, keyManager, connectionDispatcher, clock, reuseConnection, group,
localAuthor, localProps, random); plugin, localAuthor, localProps, random);
} }
@Override @Override
@@ -181,6 +181,7 @@ class AliceConnector extends Connector {
LOG.info(pluginName + " pseudonym exchange succeeded"); LOG.info(pluginName + " pseudonym exchange succeeded");
group.pseudonymExchangeSucceeded(remoteAuthor); group.pseudonymExchangeSucceeded(remoteAuthor);
// Reuse the connection as an outgoing BTP connection // Reuse the connection as an outgoing BTP connection
reuseConnection(conn, true); if(reuseConnection) reuseConnection(conn, true);
else tryToClose(conn, false);
} }
} }

View File

@@ -46,14 +46,14 @@ class BobConnector extends Connector {
ConnectionWriterFactory connectionWriterFactory, ConnectionWriterFactory connectionWriterFactory,
AuthorFactory authorFactory, GroupFactory groupFactory, AuthorFactory authorFactory, GroupFactory groupFactory,
KeyManager keyManager, ConnectionDispatcher connectionDispatcher, KeyManager keyManager, ConnectionDispatcher connectionDispatcher,
Clock clock, ConnectorGroup group, DuplexPlugin plugin, Clock clock, boolean reuseConnection, ConnectorGroup group,
LocalAuthor localAuthor, DuplexPlugin plugin, LocalAuthor localAuthor,
Map<TransportId, TransportProperties> localProps, Map<TransportId, TransportProperties> localProps,
PseudoRandom random) { PseudoRandom random) {
super(crypto, db, readerFactory, writerFactory, connectionReaderFactory, super(crypto, db, readerFactory, writerFactory, connectionReaderFactory,
connectionWriterFactory, authorFactory, groupFactory, connectionWriterFactory, authorFactory, groupFactory,
keyManager, connectionDispatcher, clock, group, plugin, keyManager, connectionDispatcher, clock, reuseConnection, group,
localAuthor, localProps, random); plugin, localAuthor, localProps, random);
} }
@Override @Override
@@ -181,6 +181,7 @@ class BobConnector extends Connector {
LOG.info(pluginName + " pseudonym exchange succeeded"); LOG.info(pluginName + " pseudonym exchange succeeded");
group.pseudonymExchangeSucceeded(remoteAuthor); group.pseudonymExchangeSucceeded(remoteAuthor);
// Reuse the connection as an incoming BTP connection // Reuse the connection as an incoming BTP connection
reuseConnection(conn, false); if(reuseConnection) reuseConnection(conn, false);
else tryToClose(conn, false);
} }
} }

View File

@@ -71,6 +71,7 @@ abstract class Connector extends Thread {
protected final KeyManager keyManager; protected final KeyManager keyManager;
protected final ConnectionDispatcher connectionDispatcher; protected final ConnectionDispatcher connectionDispatcher;
protected final Clock clock; protected final Clock clock;
protected final boolean reuseConnection;
protected final ConnectorGroup group; protected final ConnectorGroup group;
protected final DuplexPlugin plugin; protected final DuplexPlugin plugin;
protected final LocalAuthor localAuthor; protected final LocalAuthor localAuthor;
@@ -90,8 +91,8 @@ abstract class Connector extends Thread {
ConnectionWriterFactory connectionWriterFactory, ConnectionWriterFactory connectionWriterFactory,
AuthorFactory authorFactory, GroupFactory groupFactory, AuthorFactory authorFactory, GroupFactory groupFactory,
KeyManager keyManager, ConnectionDispatcher connectionDispatcher, KeyManager keyManager, ConnectionDispatcher connectionDispatcher,
Clock clock, ConnectorGroup group, DuplexPlugin plugin, Clock clock, boolean reuseConnection, ConnectorGroup group,
LocalAuthor localAuthor, DuplexPlugin plugin, LocalAuthor localAuthor,
Map<TransportId, TransportProperties> localProps, Map<TransportId, TransportProperties> localProps,
PseudoRandom random) { PseudoRandom random) {
super("Connector"); super("Connector");
@@ -106,6 +107,7 @@ abstract class Connector extends Thread {
this.keyManager = keyManager; this.keyManager = keyManager;
this.connectionDispatcher = connectionDispatcher; this.connectionDispatcher = connectionDispatcher;
this.clock = clock; this.clock = clock;
this.reuseConnection = reuseConnection;
this.group = group; this.group = group;
this.plugin = plugin; this.plugin = plugin;
this.localAuthor = localAuthor; this.localAuthor = localAuthor;

View File

@@ -56,6 +56,7 @@ class ConnectorGroup extends Thread implements InvitationTask {
private final PluginManager pluginManager; private final PluginManager pluginManager;
private final AuthorId localAuthorId; private final AuthorId localAuthorId;
private final int localInvitationCode, remoteInvitationCode; private final int localInvitationCode, remoteInvitationCode;
private final boolean reuseConnection;
private final Collection<InvitationListener> listeners; private final Collection<InvitationListener> listeners;
private final AtomicBoolean connected; private final AtomicBoolean connected;
private final CountDownLatch localConfirmationLatch; private final CountDownLatch localConfirmationLatch;
@@ -79,7 +80,8 @@ class ConnectorGroup extends Thread implements InvitationTask {
AuthorFactory authorFactory, GroupFactory groupFactory, AuthorFactory authorFactory, GroupFactory groupFactory,
KeyManager keyManager, ConnectionDispatcher connectionDispatcher, KeyManager keyManager, ConnectionDispatcher connectionDispatcher,
Clock clock, PluginManager pluginManager, AuthorId localAuthorId, Clock clock, PluginManager pluginManager, AuthorId localAuthorId,
int localInvitationCode, int remoteInvitationCode) { int localInvitationCode, int remoteInvitationCode,
boolean reuseConnection) {
super("ConnectorGroup"); super("ConnectorGroup");
this.crypto = crypto; this.crypto = crypto;
this.db = db; this.db = db;
@@ -96,6 +98,7 @@ class ConnectorGroup extends Thread implements InvitationTask {
this.localAuthorId = localAuthorId; this.localAuthorId = localAuthorId;
this.localInvitationCode = localInvitationCode; this.localInvitationCode = localInvitationCode;
this.remoteInvitationCode = remoteInvitationCode; this.remoteInvitationCode = remoteInvitationCode;
this.reuseConnection = reuseConnection;
listeners = new CopyOnWriteArrayList<InvitationListener>(); listeners = new CopyOnWriteArrayList<InvitationListener>();
connected = new AtomicBoolean(false); connected = new AtomicBoolean(false);
localConfirmationLatch = new CountDownLatch(1); localConfirmationLatch = new CountDownLatch(1);
@@ -174,8 +177,8 @@ class ConnectorGroup extends Thread implements InvitationTask {
remoteInvitationCode); remoteInvitationCode);
return new AliceConnector(crypto, db, readerFactory, writerFactory, return new AliceConnector(crypto, db, readerFactory, writerFactory,
connectionReaderFactory, connectionWriterFactory, authorFactory, connectionReaderFactory, connectionWriterFactory, authorFactory,
groupFactory, keyManager, connectionDispatcher, clock, this, groupFactory, keyManager, connectionDispatcher, clock,
plugin, localAuthor, localProps, random); reuseConnection, this, plugin, localAuthor, localProps, random);
} }
private Connector createBobConnector(DuplexPlugin plugin, private Connector createBobConnector(DuplexPlugin plugin,
@@ -185,8 +188,8 @@ class ConnectorGroup extends Thread implements InvitationTask {
localInvitationCode); localInvitationCode);
return new BobConnector(crypto, db, readerFactory, writerFactory, return new BobConnector(crypto, db, readerFactory, writerFactory,
connectionReaderFactory, connectionWriterFactory, authorFactory, connectionReaderFactory, connectionWriterFactory, authorFactory,
groupFactory, keyManager, connectionDispatcher, clock, this, groupFactory, keyManager, connectionDispatcher, clock,
plugin, localAuthor, localProps, random); reuseConnection, this, plugin, localAuthor, localProps, random);
} }
public void localConfirmationSucceeded() { public void localConfirmationSucceeded() {

View File

@@ -56,10 +56,11 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
} }
public InvitationTask createTask(AuthorId localAuthorId, int localCode, public InvitationTask createTask(AuthorId localAuthorId, int localCode,
int remoteCode) { int remoteCode, boolean reuseConnection) {
return new ConnectorGroup(crypto, db, readerFactory, writerFactory, return new ConnectorGroup(crypto, db, readerFactory, writerFactory,
connectionReaderFactory, connectionWriterFactory, connectionReaderFactory, connectionWriterFactory,
authorFactory, groupFactory, keyManager, connectionDispatcher, authorFactory, groupFactory, keyManager, connectionDispatcher,
clock, pluginManager, localAuthorId, localCode, remoteCode); clock, pluginManager, localAuthorId, localCode, remoteCode,
reuseConnection);
} }
} }