Skip to content
Snippets Groups Projects
Commit 363dfbc6 authored by akwizgran's avatar akwizgran
Browse files

Merge branch '1164-store-bluetooth-properties' into 'master'

Store Bluetooth address and UUID at first startup

Closes #1164

See merge request akwizgran/briar!694
parents c6f2941e a61cd013
No related branches found
No related tags found
No related merge requests found
......@@ -60,6 +60,7 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
private final AtomicBoolean used = new AtomicBoolean(false);
private volatile boolean running = false, contactConnections = false;
private volatile String contactConnectionsUuid = null;
private volatile SS socket = null;
abstract void initialiseAdapter() throws IOException;
......@@ -72,6 +73,10 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
abstract void setEnabledByUs();
/**
* Returns the local Bluetooth address, or null if no valid address can
* be found.
*/
@Nullable
abstract String getBluetoothAddress();
......@@ -98,6 +103,8 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
void onAdapterEnabled() {
LOG.info("Bluetooth enabled");
// We may not have been able to get the local address before
ioExecutor.execute(this::updateProperties);
if (shouldAllowContactConnections()) bind();
}
......@@ -131,6 +138,7 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
} catch (IOException e) {
throw new PluginException(e);
}
updateProperties();
running = true;
loadSettings();
if (shouldAllowContactConnections()) {
......@@ -151,19 +159,10 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
private void bind() {
ioExecutor.execute(() -> {
if (!isRunning() || !shouldAllowContactConnections()) return;
String address = getBluetoothAddress();
if (LOG.isLoggable(INFO))
LOG.info("Local address " + scrubMacAddress(address));
if (!StringUtils.isNullOrEmpty(address)) {
// Advertise our Bluetooth address to contacts
TransportProperties p = new TransportProperties();
p.put(PROP_ADDRESS, address);
callback.mergeLocalProperties(p);
}
// Bind a server socket to accept connections from contacts
SS ss;
try {
ss = openServerSocket(getUuid());
ss = openServerSocket(contactConnectionsUuid);
} catch (IOException e) {
if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
return;
......@@ -179,17 +178,29 @@ abstract class BluetoothPlugin<SS> implements DuplexPlugin, EventListener {
});
}
private String getUuid() {
String uuid = callback.getLocalProperties().get(PROP_UUID);
private void updateProperties() {
TransportProperties p = callback.getLocalProperties();
String address = p.get(PROP_ADDRESS);
String uuid = p.get(PROP_UUID);
boolean changed = false;
if (address == null) {
address = getBluetoothAddress();
if (LOG.isLoggable(INFO))
LOG.info("Local address " + scrubMacAddress(address));
if (!StringUtils.isNullOrEmpty(address)) {
p.put(PROP_ADDRESS, address);
changed = true;
}
}
if (uuid == null) {
byte[] random = new byte[UUID_BYTES];
secureRandom.nextBytes(random);
uuid = UUID.nameUUIDFromBytes(random).toString();
TransportProperties p = new TransportProperties();
p.put(PROP_UUID, uuid);
callback.mergeLocalProperties(p);
changed = true;
}
return uuid;
contactConnectionsUuid = uuid;
if (changed) callback.mergeLocalProperties(p);
}
private void acceptContactConnections() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment