mercury: синк часов очков после коннекта BLE (ble.response.set_time)

Как штатное приложение (OnConnected.startSyncTask): сразу после подъёма
BLE-сессии шлём очкам время телефона. Нужно очкам, когда они без сети —
иначе у них своё время и валятся TLS-проверки в гостевых приложениях.

Вызов идемпотентный, ставится и в connectInternal, и в Event.Connected
(внутренние переподключения библиотеки).
This commit is contained in:
2026-09-28 02:27:12 +03:00
parent e5d2fa24a1
commit 8cfd9192b3
@@ -187,6 +187,7 @@ class MercuryController(private val context: Context) {
}
saveAddress(glasses)
_state.value = MercuryState.Connected(glasses, batteryPercent = null)
syncClock()
startStatusRefresh()
} catch (t: Throwable) {
_state.value = MercuryState.Disconnected(message = "Ошибка: ${t.message}")
@@ -269,6 +270,23 @@ class MercuryController(private val context: Context) {
_state.value = MercuryState.Disconnected()
}
/**
* Ставим часы очков по телефону сразу после коннекта — как штатное приложение
* (его `OnConnected.startSyncTask`). Очкам синк нужен, когда они без сети: иначе
* у них своё время и, например, валятся TLS-проверки сертификатов в гостевых
* приложениях. Команда идемпотентна — повторная отправка безвредна.
*/
private fun syncClock() {
scope.launch {
try {
val ok = mercury.syncTime()
android.util.Log.i(TAG, "syncTime -> $ok")
} catch (t: Throwable) {
android.util.Log.w(TAG, "syncTime failed: ${t.message}")
}
}
}
/**
* Настойчиво тянем статус после подключения: очки присылают `general.status`
* при изменениях, а ответ на первый запрос легко теряется (BLE-нотификация
@@ -487,6 +505,9 @@ class MercuryController(private val context: Context) {
mercury.events.collect { event ->
when (event) {
is RayNeoMercury.Event.Connected -> {
// Событие приходит и при внутренних переподключениях библиотеки —
// держим часы очков синхронными на любом подъёме BLE.
syncClock()
val cur = _state.value
if (cur is MercuryState.Connecting) {
_state.value = MercuryState.Connected(cur.device, batteryPercent = null)