feat(app-phone): полноценный UI телефона — каталог Jellyfin, детали, пульт очков, реальное скачивание с S3

- 4 экрана по макету sketches/phone-ui: Каталог (табы Фильмы/Сериалы/Папки, поиск, бейджи зеркала), Детали (озвучки, статус конвертации, чипы скачивания), Очки (пульт, статус), Чат-заглушка
- S3 SigV4 presign (S3Presigner): mirror-client read-only креды; watch() и DownloadManager подписывают URL (бакет приватный)
- DownloadManager: реальное скачивание video+audio с прогрессом, readTimeout=0 (длинные файлы)
- PhoneActions.watch: параметр presign (app-host работает без изменений)
- TESTING.md: блок телефонных кейсов TP-1..6
This commit is contained in:
Hermes Agent
2026-08-19 09:13:56 +03:00
parent 4458678698
commit 6069400b88
19 changed files with 2145 additions and 68 deletions
+84
View File
@@ -187,3 +187,87 @@ APK `pw.binom.viewmate.glasses` установлен.
**Ожидаемо:**
- В логе периодически (раз в ~5 секунд): `glasses статус: батарея 80%, память 10.5/32.0 ГБ`
- И `glasses позиция: NNN мс, играет/пауза` с реально растущей позицией во время воспроизведения
---
## TC-11 Конвертация зеркала (media-mirror конвейер)
**Предусловия:** TC-01 пройден. Стенд достаёт `mirror.binom.pw` (проверено 19.08: отвечает 404 на корне = жив).
**Шаги:**
1. Через консоль хоста пошли: `open a3ca9fbf926fe9f60448f591ea945ac8` (фильм «Акира») — посмотри текущий статус зеркала
2. Через консоль пошли: `mirror a3ca9fbf926fe9f60448f591ea945ac8`
3. Подожди 30–60 секунд
4. Через консоль пошли: `mirror-status a3ca9fbf926fe9f60448f591ea945ac8`
5. Повторяй шаг 4 раз в 30–60 секунд, пока статус не станет `done` (может занять до 10–15 минут — это NVENC-транскодинг на сервере)
**Ожидаемо:**
- `mirror` вернул id джоба и статус (created/queued/processing)
- `mirror-status` показывает прогресс: queued → processing → done
- По завершении: статус `done` и ссылка на готовое зеркало (480p H.264)
---
## TC-12 Скачивание на устройство (эмуляция) и удаление
**Предусловия:** TC-01 пройден.
**Шаги:**
1. Через консоль хоста пошли: `dl a3ca9fbf926fe9f60448f591ea945ac8 телефон`
2. Через консоль пошли: `status` — найди в выводе отметку о скачанном
3. Через консоль пошли: `dl a3ca9fbf926fe9f60448f591ea945ac8 очки`
4. Через консоль пошли: `status` — проверь, что отметка изменилась (очки)
5. Через консоль пошли: `rm a3ca9fbf926fe9f60448f591ea945ac8`
6. Через консоль пошли: `status` — проверь, что скачанное удалено
**Ожидаемо:**
- `dl` отвечает «скачано … → телефон (эмуляция, отмечено в стейте)»
- `status` показывает скачанное с целевым устройством
- `rm` удаляет отметку, `status` больше её не показывает
- Ошибок и крашей нет
---
## TC-13 Воспроизведение зеркала (watch, после done)
**Предусловия:** TC-11 пройден (зеркало `done`), TC-01 пройден.
**Шаги:**
1. Через консоль хоста пошли: `watch a3ca9fbf926fe9f60448f591ea945ac8`
2. Подожди 10–15 секунд
3. Сними скрин экрана очков
4. Проверь лог хоста (позиция растёт)
**Ожидаемо:**
- `watch` отвечает «включил «Акира» на очках (озвучка #0): <url зеркала>»
- На экране кадр фильма (из зеркала 480p), одинаковый в обеих половинах
- Позиция растёт, крашей нет
---
# Телефон (app-phone) — тест-кейсы
Стенд: телефон = emulator-5556 (AVD test35, 1080x2400, app pw.binom.viewmate.phone), очки = emulator-5554 (glasses35), связь: adb forward tcp:8080 (хост → телефон), очки ходят на ws://10.0.2.2:8080/ws/glasses. app-host на стенде остановлен.
## TP-1 Каталог
- Вкладки Фильмы/Сериалы/Папки, сетка карточек (постер + название + бейдж зеркала: ✓/⟳%/нет/↓часть), нижняя навигация Каталог/Очки/Чат. Переключение вкладок работает.
- ПРОЙДЕН (QA 19.08: P1)
## TP-2 Поиск
- Ввод «акира» → найден фильм «Акира». Кириллица через ADBKeyboard (input text кириллицу не принимает).
- ПРОЙДЕН (QA: P2)
## TP-3 Детали
- Клик по карточке: постер, название, статус конвертации (нет/processing %/done/failed+перезаказ), секция озвучки (если done — дорожки radio), 4 чипа скачивания (очки-видео/звук, телефон-видео/звук), кнопки «Смотреть на очках», «Скачать на телефон», «Удалить скачанное».
- ПРОЙДЕН частично (QA: P3 — до done зеркала; скачивание — после done)
## TP-4 Пульт (экран Очки)
- Карточка: связь (подключено), батарея, память, «сейчас на очках» + позиция. Пульт: −30с/+30с/Плей/Пауза/режимы. Команды доходят до очков (лог очков MediaCommand).
- ПРОЙДЕН (QA: P4; замечание: PLAY на «зависшей» старой сессии не возобновляет — перепроверить на свежей после watch)
## TP-5 Чат
- Заглушка «в разработке (следующий этап)».
- ПРОЙДЕН (QA: P5)
## TP-6 Скачивание на телефон (реальное)
- Зеркало done → детали → «Скачать на телефон»: прогресс %, файлы video.mkv + audio-{i}.ogg в filesDir, чипы «скачано». Удаление через «Удалить скачанное».