diff --git a/app/src/androidMain/kotlin/com/aerotoss/discovery/AndroidNsdDiscovery.kt b/app/src/androidMain/kotlin/com/aerotoss/discovery/AndroidNsdDiscovery.kt index e0e1def..3a5bc4e 100644 --- a/app/src/androidMain/kotlin/com/aerotoss/discovery/AndroidNsdDiscovery.kt +++ b/app/src/androidMain/kotlin/com/aerotoss/discovery/AndroidNsdDiscovery.kt @@ -39,6 +39,7 @@ class AndroidNsdDiscovery(context: Context) : DiscoveryManager { setAttribute("name", deviceName) setAttribute("port", port.toString()) setAttribute("type", "phone") + setAttribute("app", "aerotoss") } registrationListener = object : NsdManager.RegistrationListener { @@ -67,9 +68,13 @@ class AndroidNsdDiscovery(context: Context) : DiscoveryManager { override fun onServiceFound(serviceInfo: NsdServiceInfo) { Log.d(TAG, "Found: ${serviceInfo.serviceName} type=${serviceInfo.serviceType}") - if (serviceInfo.serviceName != SERVICE_NAME && - resolvingServices.add(serviceInfo.serviceName) - ) { + + // Strict filter: must be our exact service type AND not our own service + if (serviceInfo.serviceName == SERVICE_NAME) return + if (serviceInfo.serviceType != SERVICE_TYPE && + serviceInfo.serviceType != "${SERVICE_TYPE}local.") return + + if (resolvingServices.add(serviceInfo.serviceName)) { nsdManager?.resolveService(serviceInfo, object : NsdManager.ResolveListener { override fun onResolveFailed(info: NsdServiceInfo, errorCode: Int) { resolvingServices.remove(info.serviceName) @@ -80,13 +85,17 @@ class AndroidNsdDiscovery(context: Context) : DiscoveryManager { resolvingServices.remove(info.serviceName) val host = info.host?.hostAddress ?: return - // Try to get device name from TXT records + // Check TXT record for our app identifier var name = info.serviceName var id = info.serviceName var deviceType = DeviceType.PHONE + var isAeroToss = false try { val attributes = info.attributes + attributes["app"]?.let { app -> + if (String(app) == "aerotoss") isAeroToss = true + } attributes["name"]?.let { name = String(it) } attributes["id"]?.let { id = String(it) } attributes["type"]?.let { type -> @@ -96,6 +105,13 @@ class AndroidNsdDiscovery(context: Context) : DiscoveryManager { } } catch (_: Exception) {} + // Only add if it's actually an AeroToss service + if (!isAeroToss) { + Log.d(TAG, "Skipping non-AeroToss service: ${info.serviceName}") + return + } + + Log.d(TAG, "Resolved AeroToss: $name ($id) at $host:${info.port}") val device = Device( id = id, name = name, @@ -103,8 +119,6 @@ class AndroidNsdDiscovery(context: Context) : DiscoveryManager { hostAddress = host, port = info.port ) - - Log.d(TAG, "Resolved: $name ($id) at $host:${info.port}") discoveredDevices[id] = device _devices.value = discoveredDevices.values.toList() } @@ -114,7 +128,8 @@ class AndroidNsdDiscovery(context: Context) : DiscoveryManager { override fun onServiceLost(serviceInfo: NsdServiceInfo) { Log.d(TAG, "Lost: ${serviceInfo.serviceName}") - discoveredDevices.remove(serviceInfo.serviceName) + // Find and remove by service name + discoveredDevices.entries.removeAll { it.value.name == serviceInfo.serviceName } resolvingServices.remove(serviceInfo.serviceName) _devices.value = discoveredDevices.values.toList() } diff --git a/app/src/desktopMain/kotlin/com/aerotoss/discovery/JmdnsDiscovery.kt b/app/src/desktopMain/kotlin/com/aerotoss/discovery/JmdnsDiscovery.kt index 45fd9c3..5d3b699 100644 --- a/app/src/desktopMain/kotlin/com/aerotoss/discovery/JmdnsDiscovery.kt +++ b/app/src/desktopMain/kotlin/com/aerotoss/discovery/JmdnsDiscovery.kt @@ -279,7 +279,8 @@ class JmdnsDiscovery : DiscoveryManager { "id=$deviceId", "name=$deviceName", "port=$servicePort", - "type=desktop" + "type=desktop", + "app=aerotoss" ) for (entry in entries) { val bytes = entry.toByteArray(Charsets.UTF_8)