From a4ade1ffcf069ecc7d5dac64dabbc666058153dd Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 19 Aug 2026 21:50:10 +0300 Subject: [PATCH] =?UTF-8?q?fix(app-phone):=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D1=85=D0=B2=D0=B0=D1=82=20=D0=B2=D0=BE=D1=81?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=BD=D0=B0=D0=B2=D0=BB=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B0=20(?= =?UTF-8?q?=D1=81=D0=BB=D0=B0=D0=B9=D0=B4=D0=B5=D1=80/=D0=B4=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit После рестарта телефона автоподхват создавал звук, но state.currentItem оставался null — пульт не знал длительность: слайдер скрыт, «сколько всего» не показывалось. Теперь при успешном подхвате восстанавливаются currentItem (jellyfin.item по itemId), currentAudioIndex, mode=MOVIE, playing. Железо: «Акира · 05:21 / 2:04:28» + слайдер на месте. --- .../main/kotlin/pw/binom/viewmate/phone/PhoneApp.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app-phone/src/main/kotlin/pw/binom/viewmate/phone/PhoneApp.kt b/app-phone/src/main/kotlin/pw/binom/viewmate/phone/PhoneApp.kt index bc81d0d..14a1e1d 100644 --- a/app-phone/src/main/kotlin/pw/binom/viewmate/phone/PhoneApp.kt +++ b/app-phone/src/main/kotlin/pw/binom/viewmate/phone/PhoneApp.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch +import pw.binom.viewmate.core.GlassesMode import pw.binom.viewmate.core.media.JellyfinClient import pw.binom.viewmate.core.media.MirrorClient import pw.binom.viewmate.core.phone.PhoneActions @@ -58,7 +59,7 @@ class PhoneApp : Application() { * PlaybackPosition с itemId+audioIndex, а audioSync не активен (телефон «не в курсе»). * Создаём аудио-плеер с позиции очков — как в DetailsScreen.onWatch. */ - private suspend fun autostartAudio(itemId: String?, audioIndex: Int, positionMs: Long) { + private suspend fun autostartAudio(itemId: String?, audioIndex: Int, positionMs: Long, playing: Boolean) { if (itemId == null || audioSync.isActive || itemId == lastFailedItemId) return val mirrorFiles = runCatching { mirror.mirrorByItem(itemId) }.getOrNull()?.files val source = resolveAudioSource(downloadManager, itemId, mirrorFiles, audioIndex) @@ -66,6 +67,13 @@ class PhoneApp : Application() { lastFailedItemId = null audioSync.play(source, positionMs) log("audio", "автоподхват звука: itemId=$itemId idx=$audioIndex pos=$positionMs") + val item = runCatching { jellyfin.item(userId.value, itemId) }.getOrNull() + if (item != null) { + state.currentItem = item + state.currentAudioIndex = audioIndex + state.mode = GlassesMode.MOVIE + state.playing = playing + } } else { log("audio", "автоподхват звука не удался: itemId=$itemId idx=$audioIndex (нет источника)") lastFailedItemId = itemId @@ -84,7 +92,7 @@ class PhoneApp : Application() { // + автоподхват звука (очки играют после рестарта телефона, audioSync не активен) server.hub.onPlaybackPosition = { positionMs, playing, itemId, audioIndex -> audioSync.sync(positionMs, playing) - scope.launch { autostartAudio(itemId, audioIndex, positionMs) } + scope.launch { autostartAudio(itemId, audioIndex, positionMs, playing) } } // автоматика обрыва связи: потеря → пауза, восстановление → продолжить с того же места