Обратный звонок в поток - PullRequest
0 голосов
/ 23 января 2020

Ребята, я пытаюсь построить абстракцию службы BLE, которая выставляет характеристические запросы записи и чтения c как поток, используя потоковый API Kotlin. Моя проблема заключается в том, что я не могу придумать способ «связать» объект BluetoothGattServerCallback, который нужно передать при открытии сервера с потоками, которые я хочу вернуть.

class BleRxClient(private val context: Context) {
    private val bluetoothManager: BluetoothManager =
        context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager

    private val callbacks = GattServerCallbacks()
    private val server: BluetoothGattServer = bluetoothManager.openGattServer(context, callbacks)


    suspend fun writeRequests() = flow {
        // ?????
    }

    internal class GattServerCallbacks : BluetoothGattServerCallback() {
        override fun onDescriptorReadRequest(
            device: BluetoothDevice?,
            requestId: Int,
            offset: Int,
            descriptor: BluetoothGattDescriptor?
        ) {
            // ????
        }

        override fun onCharacteristicWriteRequest(
            device: BluetoothDevice?,
            requestId: Int,
            characteristic: BluetoothGattCharacteristic?,
            preparedWrite: Boolean,
            responseNeeded: Boolean,
            offset: Int,
            value: ByteArray?
        ) {
            // ????
        }

        override fun onCharacteristicReadRequest(
            device: BluetoothDevice?,
            requestId: Int,
            offset: Int,
            characteristic: BluetoothGattCharacteristic?
        ) {
            // ???
        }

        override fun onDescriptorWriteRequest(
            device: BluetoothDevice?,
            requestId: Int,
            descriptor: BluetoothGattDescriptor?,
            preparedWrite: Boolean,
            responseNeeded: Boolean,
            offset: Int,
            value: ByteArray?
        ) {
            // ????
        }
    }
}

Я искал с в этом конкретном сценарии не удалось найти пути для соединения API-интерфейса потока с API-интерфейсами на основе обратного вызова. Я знаю о примитиве callbackFlow, но, поскольку я пропускаю обратные вызовы при открытии сервера, это будет означать, что каждый раз нужно открывать новый сервер. Спасибо!

...