Очки: красный индикатор записи микрофона в режиме «слушаю»

This commit is contained in:
2026-08-23 21:58:36 +03:00
parent e24caaa684
commit 504e66f0c6
2 changed files with 62 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
# TASK-red-dot-recording.md — индикатор записи микрофона на очках
## Контекст
Пользователь просит: когда на очках идёт запись микрофона (режим «слушаю», `listening=true`),
показывать в углу экрана красный кружок (индикатор записи, как у камер/диктофонов).
Только очки (app-glasses), только UI. Через опен-код, как всегда.
## Где это живёт
- `app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/ui/AssistantOverlay.kt`
- `AssistantOverlay()` собирает `state` (listening/thinking/sttText/assistantText), затем
`overlayBox(app, state, chatHistory, scrollState)`.
- `overlayBox()` внутри `Binocular(scale=false)` рисует `Box` с чёрным затемнением
`Color.Black.copy(alpha = 0.72f)` и в нём `AssistantOverlayContent(...)`.
- Binocular рендерит контент дважды (левый/правый глаз) — кружок появится в каждом глазу,
это правильно (в каждой половине экрана свой индикатор).
## Правка
В `overlayBox()`: внутри внешнего `Box` (тот, что с `.background(Color.Black.copy(alpha = 0.72f))`)
добавить поверх контента, когда `state.listening == true`, маленький красный круг в
верхнем правом углу (по центру своей половины экрана, т.е. с отступом от края):
```kotlin
if (state.listening) {
Box(
modifier = Modifier
.align(Alignment.TopEnd)
.padding(top = 12.dp, end = 12.dp)
.size(16.dp)
.background(Color(0xFFFF3B30), CircleShape),
)
}
```
Нужные импорты добавить: `androidx.compose.foundation.shape.CircleShape`,
`androidx.compose.foundation.layout.size`, `Modifier.align` (уже есть `Alignment`).
Проверить, что `Box`-контейнер позволяет `align` (должен, т.к. это BoxScope).
Кружок виден только в режиме «слушаю» (listening=true): при «думаю...» и при показе ответа —
не показывается (микрофон уже закрыт). Это соответствует смыслу: индикатор = идёт запись.
Никаких изменений протокола, телефона, жестов, логики — только отрисовка индикатора.
## Сборка, тесты, коммит
- `./gradlew :lib-core:build :app-glasses:assembleDebug :app-phone:assembleDebug` — BUILD SUCCESSFUL.
- `git add -A && git commit -m 'Очки: красный индикатор записи микрофона в режиме «слушаю»'` (БЕЗ push).
## КРИТИЧЕСКИЕ ПРАВИЛА
- workspace = /root/WORK/view-mate. Пути ТОЛЬКО относительные от корня (app-glasses/...).
НИКОГДА /root/WORK/app-* (без view-mate) — external_directory, permission-guard отклонит.
- НЕ трогать: app-phone, lib-core, LocalLlm.kt (GPU), скорость, клавиатуру, автоименование,
AssistantGestures.kt, матрицу жестов, HostConnection.kt, MainActivity.kt, GlassesApp.kt.
- В конце — краткий отчёт: файлы, изменения, сборка, тесты.
@@ -11,7 +11,9 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.ScrollState import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
@@ -102,6 +104,16 @@ private fun overlayBox(
.background(Color.Black.copy(alpha = 0.72f)), .background(Color.Black.copy(alpha = 0.72f)),
) { ) {
AssistantOverlayContent(state, chatHistory, scrollState) AssistantOverlayContent(state, chatHistory, scrollState)
if (state.listening) {
Box(
modifier = Modifier
.align(Alignment.TopEnd)
.padding(top = 12.dp, end = 12.dp)
.size(16.dp)
.background(Color(0xFFFF3B30), CircleShape),
)
}
} }
} }
} }