fix(android): canvas idle background + tailscale DNS
parent
7950a646c3
commit
76ddfc4a9e
|
|
@ -2,6 +2,7 @@ package com.steipete.clawdis.node.bridge
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.ConnectivityManager
|
import android.net.ConnectivityManager
|
||||||
|
import android.net.NetworkCapabilities
|
||||||
import android.net.nsd.NsdManager
|
import android.net.nsd.NsdManager
|
||||||
import android.net.nsd.NsdServiceInfo
|
import android.net.nsd.NsdServiceInfo
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
|
@ -199,19 +200,35 @@ class BridgeDiscovery(
|
||||||
|
|
||||||
private fun createUnicastResolver(): org.xbill.DNS.Resolver? {
|
private fun createUnicastResolver(): org.xbill.DNS.Resolver? {
|
||||||
val cm = connectivity ?: return null
|
val cm = connectivity ?: return null
|
||||||
val net = cm.activeNetwork ?: return null
|
|
||||||
val dnsServers = cm.getLinkProperties(net)?.dnsServers ?: return null
|
// Prefer VPN DNS (Tailscale) when present; fall back to active network DNS.
|
||||||
|
val candidateNetworks =
|
||||||
|
buildList {
|
||||||
|
cm.allNetworks
|
||||||
|
.firstOrNull { n ->
|
||||||
|
val caps = cm.getNetworkCapabilities(n) ?: return@firstOrNull false
|
||||||
|
caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
|
||||||
|
}?.let(::add)
|
||||||
|
cm.activeNetwork?.let(::add)
|
||||||
|
}.distinct()
|
||||||
|
|
||||||
val addrs =
|
val addrs =
|
||||||
dnsServers
|
candidateNetworks
|
||||||
|
.asSequence()
|
||||||
|
.flatMap { n ->
|
||||||
|
cm.getLinkProperties(n)?.dnsServers?.asSequence() ?: emptySequence()
|
||||||
|
}
|
||||||
.mapNotNull { it.hostAddress }
|
.mapNotNull { it.hostAddress }
|
||||||
.map { it.trim() }
|
.map { it.trim() }
|
||||||
.filter { it.isNotEmpty() }
|
.filter { it.isNotEmpty() }
|
||||||
.distinct()
|
.distinct()
|
||||||
|
.toList()
|
||||||
if (addrs.isEmpty()) return null
|
if (addrs.isEmpty()) return null
|
||||||
|
|
||||||
return try {
|
return try {
|
||||||
ExtendedResolver(addrs.toTypedArray()).apply {
|
ExtendedResolver(addrs.toTypedArray()).apply {
|
||||||
setTimeout(Duration.ofMillis(1500))
|
// Vienna -> London via tailnet: allow a bit more headroom than LAN mDNS.
|
||||||
|
setTimeout(Duration.ofMillis(3000))
|
||||||
}
|
}
|
||||||
} catch (_: Throwable) {
|
} catch (_: Throwable) {
|
||||||
null
|
null
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,12 @@ class CanvasController {
|
||||||
private fun reload() {
|
private fun reload() {
|
||||||
val wv = webView ?: return
|
val wv = webView ?: return
|
||||||
when (mode) {
|
when (mode) {
|
||||||
Mode.WEB -> wv.loadUrl(url.trim())
|
Mode.WEB -> {
|
||||||
|
// Match iOS behavior: if URL is missing/invalid, keep the current page (canvas scaffold).
|
||||||
|
val trimmed = url.trim()
|
||||||
|
if (trimmed.isBlank()) return
|
||||||
|
wv.loadUrl(trimmed)
|
||||||
|
}
|
||||||
Mode.CANVAS -> wv.loadDataWithBaseURL(null, canvasHtml, "text/html", "utf-8", null)
|
Mode.CANVAS -> wv.loadDataWithBaseURL(null, canvasHtml, "text/html", "utf-8", null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue