diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/BluetoothSensorManager.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/BluetoothSensorManager.kt index 4676659b4..b1f664c88 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/BluetoothSensorManager.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/BluetoothSensorManager.kt @@ -18,6 +18,12 @@ class BluetoothSensorManager : SensorManager { R.string.sensor_description_bluetooth_connection, unitOfMeasurement = "connection(s)" ) + val bluetoothState = SensorManager.BasicSensor( + "bluetooth_state", + "binary_sensor", + R.string.basic_sensor_name_bluetooth_state, + R.string.sensor_description_bluetooth_state + ) } override val enabledByDefault: Boolean @@ -25,7 +31,7 @@ class BluetoothSensorManager : SensorManager { override val name: Int get() = R.string.sensor_name_bluetooth override val availableSensors: List - get() = listOf(bluetoothConnection) + get() = listOf(bluetoothConnection, bluetoothState) override fun requiredPermissions(): Array { return arrayOf(Manifest.permission.BLUETOOTH) @@ -35,6 +41,7 @@ class BluetoothSensorManager : SensorManager { context: Context ) { updateBluetoothConnectionSensor(context) + updateBluetoothState(context) } private fun updateBluetoothConnectionSensor(context: Context) { @@ -91,12 +98,39 @@ class BluetoothSensorManager : SensorManager { mapOf( "connected_paired_devices" to connectedPairedDevices, "connected_not_paired_devices" to connectedNotPairedDevices, - "is_bt_on" to isBtOn, + "is_bt_on" to isBtOn, // Remove after next release "paired_devices" to bondedString ) ) } + private fun updateBluetoothState(context: Context) { + if (!isEnabled(context, bluetoothState.id)) + return + + var isBtOn = false + + if (checkPermission(context)) { + + val bluetoothManager = + (context.applicationContext.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager) + + if (bluetoothManager.adapter != null) { + val adapter = bluetoothManager.adapter + isBtOn = adapter.isEnabled + } + } + val icon = if (isBtOn) "mdi:bluetooth" else "mdi:bluetooth-off" + + onSensorUpdated( + context, + bluetoothState, + isBtOn, + icon, + mapOf() + ) + } + private fun isConnected(device: BluetoothDevice): Boolean { return try { val m: Method = device.javaClass.getMethod("isConnected") diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt index cd5b62c78..d50497b08 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt @@ -73,12 +73,19 @@ class SensorReceiver : BroadcastReceiver() { } } "android.bluetooth.device.action.ACL_CONNECTED", - "android.bluetooth.device.action.ACL_DISCONNECTED", - BluetoothAdapter.ACTION_STATE_CHANGED -> { + "android.bluetooth.device.action.ACL_DISCONNECTED" -> { val sensorDao = AppDatabase.getInstance(context).sensorDao() - val sensor = sensorDao.get(BluetoothSensorManager.bluetoothConnection.id) - if (sensor?.enabled != true) { - Log.d(TAG, "Bluetooth Sensor disabled, skipping sensors update") + val sensorBtConn = sensorDao.get(BluetoothSensorManager.bluetoothConnection.id) + if (sensorBtConn?.enabled != true) { + Log.d(TAG, "Bluetooth Connection Sensor disabled, skipping sensors update") + return + } + } + BluetoothAdapter.ACTION_STATE_CHANGED -> { + val sensorDao = AppDatabase.getInstance(context).sensorDao() + val sensorBtState = sensorDao.get(BluetoothSensorManager.bluetoothState.id) + if (sensorBtState?.enabled != true) { + Log.d(TAG, "Bluetooth State Sensor disabled, skipping sensors update") return } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fe1c58090..e8f0eb733 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -157,6 +157,7 @@ like to connect to: Whether or not the device is in an interactive state Whether or not the device is in Doze mode Whether or not the device is in Power Save mode + Whether or not bluetooth is enabled on the device Whether or not the device is actively charging The type of charger plugged into the device currently The health of the battery @@ -179,6 +180,7 @@ like to connect to: Phone State SIM 1 SIM 2 + Bluetooth State Is Charging Charger Type Battery Health