fix(app-glasses): не застревать на fallback 10.0.2.2 — перепоиск телефона

Если при старте очков телефон недоступен, discoverPhoneUrl возвращал
fallback (эмуляторный 10.0.2.2), он запоминался как lastUrl — очки вечно
реконнектили туда. Теперь на устройстве fallback не используется: не
нашли — повторный поиск через 3с (connectLoop рекурсивно). На эмуляторе
fallback остался. Железо: очки сами нашли телефон после его включения.
This commit is contained in:
Hermes Agent
2026-08-20 01:41:43 +03:00
parent 2844d6a3ac
commit 97aaabeb65
@@ -94,13 +94,21 @@ class HostConnection(
/** /**
* Первое подключение: mDNS-дискавери телефона (до 15с на устройстве, 3с на * Первое подключение: mDNS-дискавери телефона (до 15с на устройстве, 3с на
* эмуляторе), найденный адрес — в приоритете, иначе scan /24 (план Б), * эмуляторе), найденный адрес — в приоритете, иначе scan /24 (план Б).
* иначе fallback (эмуляторный 10.0.2.2). Внутри [GlassesWsClient.connect] * Fallback на эмуляторный 10.0.2.2 только на эмуляторе; на устройстве при
* живёт бесконечный реконнект с тем же адресом (переиспользование последнего * пустом адресе — повторный поиск через 3с (lastUrl не запоминается).
* найденного); при его отсутствии — повторный mDNS-цикл. * Внутри [GlassesWsClient.connect] живёт бесконечный реконнект с тем же
* адресом (переиспользование последнего найденного); при его отсутствии —
* повторный mDNS-цикл.
*/ */
private suspend fun connectLoop() { private suspend fun connectLoop() {
val url = lastUrl ?: discoverPhoneUrl() val url = lastUrl ?: discoverPhoneUrl()
if (url.isEmpty()) {
log("app", "телефон не найден — повтор поиска через 3с")
delay(3_000)
connectLoop()
return
}
lastUrl = url lastUrl = url
log("app", "подключаюсь к $url") log("app", "подключаюсь к $url")
@@ -130,9 +138,10 @@ class HostConnection(
} }
/** /**
* Цепочка поиска адреса телефона: mDNS → scan /24 (план Б) → fallback. * Цепочка поиска адреса телефона: mDNS → scan /24 (план Б).
* На эмуляторе scan пропускается (телефона в эмуляторной /24 нет, а fallback * На эмуляторе scan пропускается (телефона в эмуляторной /24 нет) и сразу
* на 10.0.2.2 должен наступать быстро). * наступает fallback на 10.0.2.2. На устройстве fallback запрещён — при
* неудачном поиске возвращается пустой адрес (повторный поиск в [connectLoop]).
*/ */
private suspend fun discoverPhoneUrl(): String { private suspend fun discoverPhoneUrl(): String {
val found = discovery.findPhoneIp(timeoutMs = MdnsClient.mdnsTimeoutMs(isEmulator())) val found = discovery.findPhoneIp(timeoutMs = MdnsClient.mdnsTimeoutMs(isEmulator()))
@@ -150,9 +159,13 @@ class HostConnection(
log("app", "нет локального IPv4 — scan /24 пропущен") log("app", "нет локального IPv4 — scan /24 пропущен")
} }
} }
log("app", "mDNS и scan не нашли телефон — fallback на $fallbackUrl") if (isEmulator()) {
log("app", "эмулятор — fallback на $fallbackUrl")
return fallbackUrl return fallbackUrl
} }
log("app", "mDNS и scan не нашли телефон — повтор поиска через 3с")
return ""
}
/** Отправка сообщения на телефон (используется менеджером скачивания). */ /** Отправка сообщения на телефон (используется менеджером скачивания). */
suspend fun sendToHost(msg: GlassesToHost) { suspend fun sendToHost(msg: GlassesToHost) {