feat: кнопка «⏹ Закрыть» в пульте + автоматика обрыва связи (README «Автоматика»)
- GlassesScreen: кнопка ⏹ Закрыть → sendCommand(CLOSE) (обработчики были: телефон audio.stop, очки MovieController.close) - app-glasses: MovieController.pauseIfPlaying()/resume(); HostConnection — при обрыве WS пауза + флаг, при восстановлении — continue (лог «связь потеряна — пауза» / «связь восстановлена — продолжаю»); флаг сбрасывается на PlayVideo/CLOSE - app-phone: ConnectionAutomatics (connectionEvent, авто-resume по флагу «играл ли») + коллектор на hub.connected - Тесты: app-phone 67/0, app-glasses 15/0 - OFF7 3/3: A5 стоп + обрыв-пауза-продолжение подтверждены живым прогоном
This commit is contained in:
@@ -15,6 +15,7 @@ import kotlinx.coroutines.withContext
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import pw.binom.viewmate.core.MediaCommand
|
||||
import pw.binom.viewmate.core.net.GlassesWsClient
|
||||
import pw.binom.viewmate.core.protocol.AssistantStateMsg
|
||||
import pw.binom.viewmate.core.protocol.ChatSessionMsg
|
||||
@@ -56,6 +57,9 @@ class HostConnection(
|
||||
private val _messages = MutableStateFlow<List<String>>(emptyList())
|
||||
val messages: StateFlow<List<String>> = _messages.asStateFlow()
|
||||
|
||||
/** Флаг «плеер играл при обрыве» — продолжим по восстановлении связи. */
|
||||
private val reconnectResume = ReconnectResumeFlag()
|
||||
|
||||
fun start() {
|
||||
scope.launch {
|
||||
client.connect(
|
||||
@@ -65,10 +69,17 @@ class HostConnection(
|
||||
_status.value = "подключено: $url"
|
||||
addMessage("соединение установлено")
|
||||
client.send(Hello(appVersion = APP_VERSION))
|
||||
if (reconnectResume.consume()) {
|
||||
withContext(Dispatchers.Main) { movieController.resume() }
|
||||
addMessage("связь восстановлена — продолжаю")
|
||||
}
|
||||
},
|
||||
onDisconnected = {
|
||||
_connected.value = false
|
||||
_status.value = "нет соединения (реконнект через 3с)"
|
||||
val wasPlaying = withContext(Dispatchers.Main) { movieController.pauseIfPlaying() }
|
||||
reconnectResume.onConnectionLost(wasPlaying)
|
||||
if (wasPlaying) addMessage("связь потеряна — пауза")
|
||||
},
|
||||
)
|
||||
}
|
||||
@@ -124,11 +135,13 @@ class HostConnection(
|
||||
|
||||
is PlayVideo -> {
|
||||
addMessage("получено видео: «${msg.title}» — ${msg.videoUrl}")
|
||||
reconnectResume.reset()
|
||||
movieController.playVideo(msg)
|
||||
}
|
||||
|
||||
is MediaCommandMsg -> {
|
||||
addMessage("MediaCommand: ${msg.command} (seekMs=${msg.seekMs})")
|
||||
if (msg.command == MediaCommand.CLOSE) reconnectResume.reset()
|
||||
movieController.applyMediaCommand(msg.command, msg.seekMs)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user