mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-15 20:29:52 +01:00
If Bluetooth is activated to add a contact, deactivate it afterwards.
Bug #47.
This commit is contained in:
@@ -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(),
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user