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с на
* эмуляторе), найденный адрес — в приоритете, иначе scan /24 (план Б),
* иначе fallback (эмуляторный 10.0.2.2). Внутри [GlassesWsClient.connect]
* живёт бесконечный реконнект с тем же адресом (переиспользование последнего
* найденного); при его отсутствии — повторный mDNS-цикл.
* эмуляторе), найденный адрес — в приоритете, иначе scan /24 (план Б).
* Fallback на эмуляторный 10.0.2.2 только на эмуляторе; на устройстве при
* пустом адресе — повторный поиск через 3с (lastUrl не запоминается).
* Внутри [GlassesWsClient.connect] живёт бесконечный реконнект с тем же
* адресом (переиспользование последнего найденного); при его отсутствии —
* повторный mDNS-цикл.
*/
private suspend fun connectLoop() {
val url = lastUrl ?: discoverPhoneUrl()
if (url.isEmpty()) {
log("app", "телефон не найден — повтор поиска через 3с")
delay(3_000)
connectLoop()
return
}
lastUrl = url
log("app", "подключаюсь к $url")
@@ -130,9 +138,10 @@ class HostConnection(
}
/**
* Цепочка поиска адреса телефона: mDNS → scan /24 (план Б) → fallback.
* На эмуляторе scan пропускается (телефона в эмуляторной /24 нет, а fallback
* на 10.0.2.2 должен наступать быстро).
* Цепочка поиска адреса телефона: mDNS → scan /24 (план Б).
* На эмуляторе scan пропускается (телефона в эмуляторной /24 нет) и сразу
* наступает fallback на 10.0.2.2. На устройстве fallback запрещён — при
* неудачном поиске возвращается пустой адрес (повторный поиск в [connectLoop]).
*/
private suspend fun discoverPhoneUrl(): String {
val found = discovery.findPhoneIp(timeoutMs = MdnsClient.mdnsTimeoutMs(isEmulator()))
@@ -150,8 +159,12 @@ class HostConnection(
log("app", "нет локального IPv4 — scan /24 пропущен")
}
}
log("app", "mDNS и scan не нашли телефон — fallback на $fallbackUrl")
return fallbackUrl
if (isEmulator()) {
log("app", "эмулятор — fallback на $fallbackUrl")
return fallbackUrl
}
log("app", "mDNS и scan не нашли телефон — повтор поиска через 3с")
return ""
}
/** Отправка сообщения на телефон (используется менеджером скачивания). */