@@ -34,38 +34,38 @@ internal class AdbMdns(
3434
3535 private val nsdManager: NsdManager = ctx.getSystemService(NsdManager ::class .java)
3636
37- private val serviceDiscoveredChannel: Channel <NsdServiceInfo > = Channel (capacity = 10 )
37+ private var serviceDiscoveredChannel: Channel <NsdServiceInfo >? = null
3838
3939 /* *
4040 * Only one service can be resolved at a time.
4141 * A null value is sent if the service failed to resolve.
4242 */
43- private val serviceResolvedChannel: Channel <NsdServiceInfo ?> = Channel (capacity = 1 )
43+ private var serviceResolvedChannel: Channel <NsdServiceInfo ?>? = null
4444
4545 private val isDiscovering: MutableStateFlow <Boolean > = MutableStateFlow (false )
4646 private val discoveredPort: MutableStateFlow <Int ?> = MutableStateFlow (null )
4747 private val discoverMutex: Mutex = Mutex ()
4848
4949 private val resolveListener: NsdManager .ResolveListener = object : NsdManager .ResolveListener {
5050 override fun onResolveFailed (nsdServiceInfo : NsdServiceInfo , i : Int ) {
51- serviceResolvedChannel.trySendBlocking(null )
51+ serviceResolvedChannel? .trySendBlocking(null )
5252 }
5353
5454 override fun onServiceResolved (nsdServiceInfo : NsdServiceInfo ) {
5555 Timber .d(" onServiceResolved: ${nsdServiceInfo.serviceName} ${nsdServiceInfo.host} ${nsdServiceInfo.port} ${nsdServiceInfo.serviceType} " )
56- serviceResolvedChannel.trySendBlocking(nsdServiceInfo)
56+ serviceResolvedChannel? .trySendBlocking(nsdServiceInfo)
5757 }
5858
5959 override fun onResolutionStopped (serviceInfo : NsdServiceInfo ) {
6060 super .onResolutionStopped(serviceInfo)
6161
62- serviceResolvedChannel.trySendBlocking(null )
62+ serviceResolvedChannel? .trySendBlocking(null )
6363 }
6464
6565 override fun onStopResolutionFailed (serviceInfo : NsdServiceInfo , errorCode : Int ) {
6666 super .onStopResolutionFailed(serviceInfo, errorCode)
6767
68- serviceResolvedChannel.trySendBlocking(null )
68+ serviceResolvedChannel? .trySendBlocking(null )
6969 }
7070 }
7171
@@ -95,7 +95,7 @@ internal class AdbMdns(
9595 Timber .d(" onServiceFound: ${serviceInfo.serviceName} ${serviceInfo.host} ${serviceInfo.port} ${serviceInfo.serviceType} " )
9696
9797 // You can only resolve one service at a time and they can take some time to resolve.
98- serviceDiscoveredChannel.trySend(serviceInfo)
98+ serviceDiscoveredChannel? .trySend(serviceInfo)
9999 }
100100
101101 override fun onServiceLost (serviceInfo : NsdServiceInfo ) {
@@ -129,6 +129,9 @@ internal class AdbMdns(
129129 // Wait for it to stop discovering
130130 isDiscovering.first { ! it }
131131
132+ serviceDiscoveredChannel = Channel (capacity = 10 )
133+ serviceResolvedChannel = Channel (capacity = 1 )
134+
132135 nsdManager.discoverServices(
133136 serviceType.id,
134137 NsdManager .PROTOCOL_DNS_SD ,
@@ -138,10 +141,10 @@ internal class AdbMdns(
138141 try {
139142 withTimeout(10000L ) {
140143 while (port == null ) {
141- val service = serviceDiscoveredChannel.receive()
144+ val service = serviceDiscoveredChannel? .receive()
142145 nsdManager.resolveService(service, resolveListener)
143146
144- val resolvedService = serviceResolvedChannel.receive()
147+ val resolvedService = serviceResolvedChannel? .receive()
145148
146149 if (resolvedService == null ) {
147150 continue
@@ -183,15 +186,8 @@ internal class AdbMdns(
183186 nsdManager.stopServiceDiscovery(discoveryListener)
184187 }
185188
186- // Clear the resolve channel if there is anything left.
187- while (! serviceResolvedChannel.isEmpty) {
188- serviceResolvedChannel.tryReceive()
189- }
190-
191- // Clear the discovered channel if there is anything left.
192- while (! serviceDiscoveredChannel.isEmpty) {
193- serviceDiscoveredChannel.tryReceive()
194- }
189+ serviceResolvedChannel?.cancel()
190+ serviceDiscoveredChannel?.cancel()
195191 }
196192
197193 private fun isPortAvailable (port : Int ): Boolean {
0 commit comments