Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class BluetoothHelper @Inject constructor(private val context: Context) {
- private val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
- fun enable(): Boolean = bluetoothAdapter.enable()
- suspend fun findDeviceAddressByNameAsync(nameRegex: Regex): String? {
- val device =
- searchBondedDevice(nameRegex) ?: withTimeoutOrNull(6000L) { discoveryDevice(nameRegex) }
- return device?.address
- }
- private fun searchBondedDevice(nameRegex: Regex): BluetoothDevice? =
- bluetoothAdapter
- .bondedDevices
- .find { it.name.matches(nameRegex) }
- private suspend fun discoveryDevice(nameRegex: Regex) = callbackFlow {
- val discoveryResultReceiver = object : BroadcastReceiver() {
- override fun onReceive(context: Context, intent: Intent) {
- if (intent.action == BluetoothDevice.ACTION_FOUND) {
- val device: BluetoothDevice =
- intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) ?: return
- if (!isClosedForSend && device.name?.matches(nameRegex) == true) {
- offer(device)
- close()
- }
- }
- }
- }
- context.registerReceiver(
- discoveryResultReceiver,
- IntentFilter(BluetoothDevice.ACTION_FOUND)
- )
- bluetoothAdapter.startDiscovery()
- awaitClose {
- context.unregisterReceiver(discoveryResultReceiver)
- bluetoothAdapter.cancelDiscovery()
- }
- }.catch { Timber.d(it) }
- .first()
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement