diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index edcd992..22102a4 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -3,6 +3,10 @@
+
+
+
diff --git a/android/app/src/main/java/net/laenre/oasis/NodeService.kt b/android/app/src/main/java/net/laenre/oasis/NodeService.kt
index 9bd6f07..f7796ee 100644
--- a/android/app/src/main/java/net/laenre/oasis/NodeService.kt
+++ b/android/app/src/main/java/net/laenre/oasis/NodeService.kt
@@ -6,6 +6,7 @@ import android.app.NotificationManager
import android.app.Service
import android.content.Context
import android.content.Intent
+import android.net.wifi.WifiManager
import android.os.Build
import android.os.IBinder
import android.system.Os
@@ -33,16 +34,37 @@ class NodeService : Service() {
@Volatile private var started = false
}
+ // Sin esto Android tira los paquetes multicast/broadcast que llegan por wifi y el
+ // descubrimiento LAN de SSB no ve a nadie: dos moviles en la misma red no se encuentran.
+ private var multicastLock: WifiManager.MulticastLock? = null
+
override fun onBind(intent: Intent?): IBinder? = null
override fun onCreate() {
super.onCreate()
startForeground(NOTIF_ID, buildNotification())
+ acquireMulticastLock()
if (started) return
started = true
Thread({ runNode() }, "node-main").start()
}
+ override fun onDestroy() {
+ try { multicastLock?.takeIf { it.isHeld }?.release() } catch (e: Throwable) { Log.w(TAG, "soltando MulticastLock", e) }
+ super.onDestroy()
+ }
+
+ private fun acquireMulticastLock() {
+ if (multicastLock?.isHeld == true) return
+ try {
+ val wifi = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
+ multicastLock = wifi.createMulticastLock("oasis-lan").apply { setReferenceCounted(false); acquire() }
+ } catch (e: Throwable) {
+ // sin wifi o sin permiso: los pubs siguen funcionando, solo se pierde la LAN
+ Log.w(TAG, "no se ha podido coger el MulticastLock; sin descubrimiento LAN", e)
+ }
+ }
+
private fun buildNotification(): Notification {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val ch = NotificationChannel(CHANNEL, getString(R.string.node_channel), NotificationManager.IMPORTANCE_LOW)