Доки: жесты и режимы общения с ассистентом (design) + TASK
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
# Жесты и режимы очков (design, согласовано 2026-08-22)
|
||||
|
||||
> Согласовано с пользователем. Реализация — opencode по TASK (см. ниже).
|
||||
> Это документ проекта: сначала думаем, потом хуячим, потом тесты, потом ОБЯЗАТЕЛЬНО мануальные тесты на железе.
|
||||
|
||||
## Ограничения системы (факты)
|
||||
|
||||
- Жестов всего шесть: Click, DoubleClick, TripleClick, SlideForward, SlideBackward, LongClick (+ SlideContinuous с delta).
|
||||
- **LongClick НЕ работает** — перехвачен системным ассистентом RayNeo. Не рассчитывать, не использовать.
|
||||
- **SlideContinuous существует** (SDK: `TempleAction.SlideContinuous(delta: Float, ...)` — подтверждено javap) — плавный скролл возможен, delta = дельту движения пальца. Частоту событий и амплитуду дельт проверить на железе.
|
||||
- Экран очков — широкий 1280×480 (640×480 на глаз). Текста влезает мало → скролл ответа обязателен для длинных ответов.
|
||||
- Оверлей общения затемняет кино (72% чёрного) → режим общения ЯВНЫЙ: пользователь видит, что он в чате, а не в кино. Это позволяет переназначать свайпы в режиме общения без конфликта.
|
||||
- Нет клавиатуры — только жесты и голос. Выход из режима — только жестом.
|
||||
- LLM думает 5-15с — нужен индикатор «думаю...», иначе экран замирает.
|
||||
|
||||
## Общий паттерн жестов (единая семантика через все режимы)
|
||||
|
||||
| Жест | Смысл везде |
|
||||
|---|---|
|
||||
| **TripleClick** | вызов локального ассистента (переход в режим общения) |
|
||||
| **DoubleClick** | отмена / назад |
|
||||
| **Click** | основное действие текущего контекста |
|
||||
|
||||
## Матрица жестов по состояниям (ЗАКРЫТА)
|
||||
|
||||
| Состояние | Click | DoubleClick | TripleClick |
|
||||
|---|---|---|---|
|
||||
| **Кино** | плей/пауза | игнор (назад некуда) | вызов ассистента (пауза + «слушаю...») |
|
||||
| **Прослушивание** | отправить фразу | отмена, **остаёмся в диалоге** | игнор |
|
||||
| **Ответ виден** | новая фраза (микрофон открывается) | **выход из режима** | игнор (уже в режиме) |
|
||||
|
||||
Ключевой принцип: **клик = «главное действие здесь»**. В кино — плей/пауза, в диалоге — сказать новую фразу, при прослушивании — отправить. Один жест, контекст решает. Двойной — всегда «не хочу/назад». Тройной — всегда «хочу говорить с ассистентом».
|
||||
|
||||
Конфликтов нет: подрежимы различимы по состоянию (listening = микрофон открыт / assistantText непуст = ответ виден).
|
||||
|
||||
## Решения по деталям
|
||||
|
||||
1. **Отмена диктовки (DoubleClick в прослушивании)** — просто отмена, остаёмся в диалоге (назад к «ответу виден», ничего не теряется).
|
||||
2. **Фильм после выхода (DoubleClick при ответе)** — ВСЕГДА на паузе, независимо от того, был ли он на паузе до входа в режим ассистента.
|
||||
3. **Скролл ответа** — плавный: SlideContinuous, отслеживать движение пальца (delta), а не факт свайпа с шагом N. Свайпы SlideForward/SlideBackward в режиме общения — тоже скролл (запасной вариант, если SlideContinuous окажется нестабильным на железе).
|
||||
4. **Новая фраза в режиме «ответ виден»** — Click: микрофон открывается, «слушаю...». Старый ответ с экрана — стереть (история живёт в SQLite на телефоне, не теряется).
|
||||
5. **Индикатор «думаю...»** — после отправки фразы (между прослушиванием и ответом) показывать «думаю...» вместо замирания на тексте фразы.
|
||||
|
||||
## Что делать (TASK для opencode)
|
||||
|
||||
В `app-glasses` (MainActivity.kt + оверлей):
|
||||
|
||||
1. **Переразметка жестов по матрице**:
|
||||
- Кино: как сейчас (Click=TOGGLE, TripleClick=вызов, свайпы=±30с, DoubleClick=игнор)
|
||||
- Прослушивание: как сейчас (Click=отправить, DoubleClick=отмена, TripleClick=игнор)
|
||||
- Ответ виден (listening=false, assistantText непуст): **Click → новая фраза** (открыть микрофон, стереть assistantText со старта), **DoubleClick → выход из режима** (закрыть оверлей, фильм на паузе, assistantText стереть), **TripleClick → игнор**, свайпы/SlideContinuous → скролл
|
||||
2. **Скролл ответа**: плавный через SlideContinuous (delta), scrollState для текста ответа; запасной вариант — дискретные свайпы. Ограничить скролл границами текста.
|
||||
3. **Индикатор «думаю...»**: состояние между отправкой фразы и получением ShowText; показывать в оверлее.
|
||||
4. **Выход**: DoubleClick при «ответ виден» — закрыть оверлей, фильм остаётся на паузе (не трогать play/pause при выходе, только при входе ставим паузу).
|
||||
|
||||
Тесты: юнит-тесты на чистую логику разметки жестов (переходы состояний, скролл-дельта → смещение), в духе GestureCommandsTest. Мануальные тесты — ОБЯЗАТЕЛЬНО на железе (142: очки 7687f645 + телефон AXGL024B05001337): полный цикл кино → тройной тап → фраза → «думаю...» → ответ → скролл → выход → фильм на паузе.
|
||||
|
||||
## Смежные договорённости (архитектура агента)
|
||||
|
||||
Полная архитектура скиллов/тулсетов — в `TASK-agent-tools.md`. Ключевое для очков: ассистент — локальный, на телефоне; очки — тонкий клиент (микрофон → STT → телефон → LLM → ShowText на очки). Режим общения — поверх любого режима (кино/чат), активируется тройным тапом из любого места.
|
||||
Reference in New Issue
Block a user