From 6e55341e5c811dc74f7f490e7f7969f09953a5c9 Mon Sep 17 00:00:00 2001
From: goapunk <goapunk@riseup.net>
Date: Fri, 27 Apr 2018 13:08:55 +0200
Subject: [PATCH] If all else fails use reflection to get the Bluetooth
 address.

---
 .../plugin/bluetooth/AndroidBluetoothPlugin.java    |  1 +
 .../org/briarproject/bramble/util/AndroidUtils.java | 13 +++++++++++++
 2 files changed, 14 insertions(+)

diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java
index 2c318a6493..f0242b4ae0 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/bluetooth/AndroidBluetoothPlugin.java
@@ -129,6 +129,7 @@ class AndroidBluetoothPlugin extends BluetoothPlugin<BluetoothServerSocket> {
 	@Nullable
 	String getBluetoothAddress() {
 		String address = AndroidUtils.getBluetoothAddress(appContext, adapter);
+		LOG.info("Bluetooth address:" + address);
 		return address.isEmpty() ? null : address;
 	}
 
diff --git a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java
index 15edba9c49..7ff7037cd1 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java
@@ -6,6 +6,7 @@ import android.os.Build;
 import android.provider.Settings;
 
 import java.io.File;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -41,6 +42,18 @@ public class AndroidUtils {
 		address = Settings.Secure.getString(ctx.getContentResolver(),
 				"bluetooth_address");
 		if (isValidBluetoothAddress(address)) return address;
+		try {
+			final Field mServiceField;
+			mServiceField = BluetoothAdapter.class.getDeclaredField("mService");
+			mServiceField.setAccessible(true);
+			final Object mService = mServiceField.get(adapter);
+			if (mService == null)
+				return "";
+			address = (String) mService.getClass().getMethod("getAddress").invoke(mService);
+			if (isValidBluetoothAddress(address)) return address;
+		} catch (Exception e) {
+			// Nothing we can do about it.
+		}
 		// Let the caller know we can't find the address
 		return "";
 	}
-- 
GitLab