35f462b34a
- 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 стоп + обрыв-пауза-продолжение подтверждены живым прогоном
49 lines
1.9 KiB
Kotlin
49 lines
1.9 KiB
Kotlin
package pw.binom.viewmate.phone
|
|
|
|
/** Событие изменения связи очки↔телефон (для автоматики паузы/продолжения). */
|
|
internal enum class ConnectionEvent {
|
|
/** Связь не менялась. */
|
|
NONE,
|
|
|
|
/** Связь потеряна (была → нет). */
|
|
LOST,
|
|
|
|
/** Связь восстановилась (не было → есть). */
|
|
RESTORED,
|
|
}
|
|
|
|
/** Переход «было подключено / стало подключено» → событие. Чистая функция. */
|
|
internal fun connectionEvent(prevConnected: Boolean, nowConnected: Boolean): ConnectionEvent = when {
|
|
prevConnected && !nowConnected -> ConnectionEvent.LOST
|
|
!prevConnected && nowConnected -> ConnectionEvent.RESTORED
|
|
else -> ConnectionEvent.NONE
|
|
}
|
|
|
|
/**
|
|
* Флаг «продолжить звук после восстановления связи»: при обрыве запоминает,
|
|
* играл ли звук; по восстановлении — отдаёт и сбрасывает.
|
|
* Чистая логика без Android — покрыта unit-тестами.
|
|
*/
|
|
internal class ConnectionAutoResume {
|
|
|
|
var resumeAfterReconnect: Boolean = false
|
|
private set
|
|
|
|
/** Обрыв связи: звук продолжится, только если плеер был активен и играл. */
|
|
fun onLost(audioActive: Boolean, wasPlaying: Boolean) {
|
|
resumeAfterReconnect = audioActive && wasPlaying
|
|
}
|
|
|
|
/** Восстановление связи: продолжить ли звук (сбрасывает флаг). */
|
|
fun consumeResume(): Boolean {
|
|
val shouldResume = resumeAfterReconnect
|
|
resumeAfterReconnect = false
|
|
return shouldResume
|
|
}
|
|
|
|
/** Сброс (например, после CLOSE). */
|
|
fun reset() {
|
|
resumeAfterReconnect = false
|
|
}
|
|
}
|