mercury: синк часов очков после коннекта BLE (ble.response.set_time)
Как штатное приложение (OnConnected.startSyncTask): сразу после подъёма BLE-сессии шлём очкам время телефона. Нужно очкам, когда они без сети — иначе у них своё время и валятся TLS-проверки в гостевых приложениях. Вызов идемпотентный, ставится и в connectInternal, и в Event.Connected (внутренние переподключения библиотеки).
This commit is contained in:
@@ -187,6 +187,7 @@ class MercuryController(private val context: Context) {
|
|||||||
}
|
}
|
||||||
saveAddress(glasses)
|
saveAddress(glasses)
|
||||||
_state.value = MercuryState.Connected(glasses, batteryPercent = null)
|
_state.value = MercuryState.Connected(glasses, batteryPercent = null)
|
||||||
|
syncClock()
|
||||||
startStatusRefresh()
|
startStatusRefresh()
|
||||||
} catch (t: Throwable) {
|
} catch (t: Throwable) {
|
||||||
_state.value = MercuryState.Disconnected(message = "Ошибка: ${t.message}")
|
_state.value = MercuryState.Disconnected(message = "Ошибка: ${t.message}")
|
||||||
@@ -269,6 +270,23 @@ class MercuryController(private val context: Context) {
|
|||||||
_state.value = MercuryState.Disconnected()
|
_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`
|
* Настойчиво тянем статус после подключения: очки присылают `general.status`
|
||||||
* при изменениях, а ответ на первый запрос легко теряется (BLE-нотификация
|
* при изменениях, а ответ на первый запрос легко теряется (BLE-нотификация
|
||||||
@@ -487,6 +505,9 @@ class MercuryController(private val context: Context) {
|
|||||||
mercury.events.collect { event ->
|
mercury.events.collect { event ->
|
||||||
when (event) {
|
when (event) {
|
||||||
is RayNeoMercury.Event.Connected -> {
|
is RayNeoMercury.Event.Connected -> {
|
||||||
|
// Событие приходит и при внутренних переподключениях библиотеки —
|
||||||
|
// держим часы очков синхронными на любом подъёме BLE.
|
||||||
|
syncClock()
|
||||||
val cur = _state.value
|
val cur = _state.value
|
||||||
if (cur is MercuryState.Connecting) {
|
if (cur is MercuryState.Connecting) {
|
||||||
_state.value = MercuryState.Connected(cur.device, batteryPercent = null)
|
_state.value = MercuryState.Connected(cur.device, batteryPercent = null)
|
||||||
|
|||||||
Reference in New Issue
Block a user