feat(app-glasses): гашение экрана очков → пауза видео+звука, включение → продолжение

Требование пользователя (железо): погасил экран очков — звук тоже должен
остановиться (раньше ExoPlayer «тормозил», звук играл, синк дёргал звук
к видео). MainActivity: onPause → pauseIfPlaying (флаг resumeAfterScreenOn),
PlaybackPosition(playing=false) → звук пауза ≤5с; onResume → resume +
PlaybackPosition(playing=true) → звук синхронно. MovieController.resume()
получил guard на существующий плеер. Железо: «экран погас — пауза» →
sync стоп → «экран включён — продолжаю» → diff 247.
This commit is contained in:
Hermes Agent
2026-08-19 21:56:46 +03:00
parent a4ade1ffcf
commit 4309d4edd2
2 changed files with 20 additions and 2 deletions
@@ -23,6 +23,8 @@ import androidx.compose.ui.unit.dp
import pw.binom.viewmate.glasses.ui.GlassesMovieScreen import pw.binom.viewmate.glasses.ui.GlassesMovieScreen
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
private var resumeAfterScreenOn = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false) WindowCompat.setDecorFitsSystemWindows(window, false)
@@ -43,9 +45,21 @@ class MainActivity : ComponentActivity() {
log("ui", "иммерсивный режим включён") log("ui", "иммерсивный режим включён")
} }
override fun onPause() {
super.onPause()
val was = GlassesApp.instance.movieController.pauseIfPlaying()
resumeAfterScreenOn = was
if (was) log("ui", "экран погас — пауза")
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
hideSystemBars() hideSystemBars()
if (resumeAfterScreenOn) {
resumeAfterScreenOn = false
GlassesApp.instance.movieController.resume()
log("ui", "экран включён — продолжаю")
}
} }
private fun hideSystemBars() { private fun hideSystemBars() {
@@ -162,8 +162,12 @@ class MovieController(private val context: Context) {
return wasPlaying return wasPlaying
} }
/** Продолжить с того же места (связь восстановилась). Только с главного потока. */ /** Продолжить с того же места (связь восстановилась / экран включён). Только с главного потока. */
fun resume() { fun resume() {
_player?.play() val player = _player ?: run {
log("glasses", "resume проигнорирован: плеер не активен")
return
}
player.play()
} }
} }