diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java index 4f7afa0349d3f4f6fa97cecce57f1c5614f97af1..ce43261a40d3c0eba7c54c2b3980f0aa132878f7 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/bluetooth/BluetoothPlugin.java @@ -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() {