Очки: красный индикатор записи микрофона в режиме «слушаю»
This commit is contained in:
@@ -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),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user