Event Listeners
Lists and states use Flow / StateFlow. Collect each long-lived stream in a separate child coroutine. Use kotlinx.coroutines.flow.combine to merge device lists. Android also exposes BLE scan errors. Run this example in an appropriate Activity/Fragment lifecycle scope and cancel its Job when finished.
import com.gizwits.smart.sdk.GizSDKManager
import com.gizwits.smart.sdk.bluetooth.bleCapability
import com.gizwits.smart.sdk.bluetooth.subscribeBluetoothDeviceList
import com.gizwits.smart.sdk.bluetooth.subscribeBleScanError
import com.gizwits.smart.sdk.lan.subscribeLanDeviceList
import com.gizwits.smart.sdk.mqtt.subscribeBoundDeviceList
import com.gizwits.smart.sdk.mqtt.subscribeBindEvent
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
val listenerJob = lifecycleScope.launch {
launch {
GizSDKManager.subscribeBindEvent().collect { (did, isBind) ->
println("$did: $isBind")
}
}
launch {
combine(
GizSDKManager.subscribeBoundDeviceList(),
GizSDKManager.subscribeBluetoothDeviceList(),
GizSDKManager.subscribeLanDeviceList()
) { bound, ble, lan ->
(bound + ble + lan).distinctBy { it.id }
}.collect { devices -> println(devices) }
}
launch { GizSDKManager.subscribeBleScanError().collect { println(it) } }
launch { device.bleCapability.subscribeStatus().collect { println(it) } }
launch { device.bleCapability.subscribeIsLogin().collect { println(it) } }
launch { device.bleCapability.subscribeModuleProfile().collect { println(it) } }
launch { device.bleCapability.subscribeDp().collect { println(it) } }
}
// Stop these listeners:
// listenerJob.cancel()