From d113ffd744692a6c42b17a41497227d027032f5f Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Tue, 25 Aug 2026 02:28:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D0=BD=D0=B5=D0=BB=D1=8C=20=D0=B2?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8/=D0=B7=D0=B0=D1=80=D1=8F?= =?UTF-8?q?=D0=B4=D0=B0:=20=D0=BE=D0=B2=D0=B5=D1=80=D0=BB=D0=B5=D0=B9-?= =?UTF-8?q?=D1=81=D0=BB=D0=BE=D0=B9=20=D0=BF=D0=BE=D0=B2=D0=B5=D1=80=D1=85?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BD=D1=82=D0=B0,=20=D1=83?= =?UTF-8?q?=20=D0=BD=D0=B8=D0=B7=D0=B0=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=E2=80=94=20=D1=81=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BF=D1=80=D0=B8=20=D0=BB=D1=8E=D0=B1=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=BC=D0=B0=D1=81=D1=88=D1=82=D0=B0=D0=B1=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pw/binom/viewmate/glasses/MainActivity.kt | 53 ++++++++------- .../viewmate/glasses/ui/GlassesMovieScreen.kt | 66 +++++++++---------- 2 files changed, 58 insertions(+), 61 deletions(-) diff --git a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/MainActivity.kt b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/MainActivity.kt index 0c823c2..e13cf9b 100644 --- a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/MainActivity.kt +++ b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/MainActivity.kt @@ -473,39 +473,38 @@ fun ConnectionScreen() { val containerW = (screenWidthPx * scale).toInt() val containerH = (screenHeightPx * scale).toInt() - Box( - modifier = Modifier - .width(containerW.px) - .height(containerH.px) - .offset( - x = scaleOffsetX(side, screenWidthPx, scale).px, - y = verticalOffsetY(screenHeightPx, scale, vertical).px, - ) - .background(Color.Black), - ) { - Column( - modifier = Modifier.fillMaxSize().padding(start = 24.dp, end = 24.dp, top = 56.dp), - verticalArrangement = Arrangement.spacedBy(8.dp), + // Оверлей-обёртка половины: контейнер (смещается scale/vertical) + панель статуса + // поверх него. Панель — у низа экрана при любом масштабе/вертикали. + Box(Modifier.fillMaxSize()) { + Box( + modifier = Modifier + .width(containerW.px) + .height(containerH.px) + .offset( + x = scaleOffsetX(side, screenWidthPx, scale).px, + y = verticalOffsetY(screenHeightPx, scale, vertical).px, + ) + .background(Color.Black), ) { - Text("ViewMate Glasses", style = MaterialTheme.typography.headlineMedium) - Text(if (connected) "подключено к телефону" else "нет соединения") - Text(status, style = MaterialTheme.typography.bodyMedium) - Text("Последние сообщения:", style = MaterialTheme.typography.titleMedium) - LazyColumn(modifier = Modifier.fillMaxWidth()) { - items(messages) { msg -> - Text(msg, style = MaterialTheme.typography.bodySmall) + Column( + modifier = Modifier.fillMaxSize().padding(start = 24.dp, end = 24.dp, top = 56.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + Text("ViewMate Glasses", style = MaterialTheme.typography.headlineMedium) + Text(if (connected) "подключено к телефону" else "нет соединения") + Text(status, style = MaterialTheme.typography.bodyMedium) + Text("Последние сообщения:", style = MaterialTheme.typography.titleMedium) + LazyColumn(modifier = Modifier.fillMaxWidth()) { + items(messages) { msg -> + Text(msg, style = MaterialTheme.typography.bodySmall) + } } } + // Оверлей распознавания/ответа — в AssistantOverlay (корень, поверх любого экрана). } - // Оверлей распознавания/ответа — в AssistantOverlay (корень, поверх любого экрана). - } - - // Панель статуса (время/заряд) — вне контейнера, всегда у верха половины: - // при vertical=0 контейнер у низа, и панель иначе повисала бы посередине. - Box(Modifier.fillMaxSize()) { StatusPanelCompose( - modifier = Modifier.align(Alignment.TopCenter).padding(top = 12.dp), + modifier = Modifier.align(Alignment.BottomCenter).padding(bottom = 10.dp), scale = scale, ) } diff --git a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/ui/GlassesMovieScreen.kt b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/ui/GlassesMovieScreen.kt index 74499a4..99db34e 100644 --- a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/ui/GlassesMovieScreen.kt +++ b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/ui/GlassesMovieScreen.kt @@ -104,45 +104,43 @@ fun GlassesMovieScreen( maxHeight = containerH - 25, ) - Box( - modifier = Modifier - .width(containerW.px) - .height(containerH.px) - .offset( - x = scaleOffsetX(side, screenWidthPx, scale).px, - y = verticalOffsetY(screenHeightPx, scale, vertical).px, - ), - ) { - Row( - modifier = Modifier.fillMaxWidth().background(Color.Black), - // Видео в контейнере прижимается к верху (vertical=1) или низу (vertical=0): - // Row-центрирование съедало вертикаль — картинка оставалась «по центру». - verticalAlignment = Alignment.Top, - horizontalArrangement = if (side == Side.LEFT) Arrangement.End else Arrangement.Start, + // Оверлей-обёртка половины: контейнер (смещается scale/vertical) + панель статуса + // поверх него. Панель — у низа экрана при любом масштабе/вертикали. + Box(Modifier.fillMaxSize()) { + Box( + modifier = Modifier + .width(containerW.px) + .height(containerH.px) + .offset( + x = scaleOffsetX(side, screenWidthPx, scale).px, + y = verticalOffsetY(screenHeightPx, scale, vertical).px, + ), ) { - if (SCALE_DEBUG_SQUARE) { - // Тестовый режим: большой красный квадрат вместо видео — быстрая - // проверка масштаба/позиций скрином без запуска видео. - Box(Modifier.fillMaxSize().background(Color.Red)) - } else { - BinocularVideoPlayer( - player = player, - renderer = renderer, - modifier = Modifier - .size(playerWidth.px, playerHeight.px) - .offset(y = videoOffsetY(containerH, playerHeight, vertical).px), - ) + Row( + modifier = Modifier.fillMaxWidth().background(Color.Black), + // Видео в контейнере прижимается к верху (vertical=1) или низу (vertical=0): + // Row-центрирование съедало вертикаль — картинка оставалась «по центру». + verticalAlignment = Alignment.Top, + horizontalArrangement = if (side == Side.LEFT) Arrangement.End else Arrangement.Start, + ) { + if (SCALE_DEBUG_SQUARE) { + // Тестовый режим: большой красный квадрат вместо видео — быстрая + // проверка масштаба/позиций скрином без запуска видео. + Box(Modifier.fillMaxSize().background(Color.Red)) + } else { + BinocularVideoPlayer( + player = player, + renderer = renderer, + modifier = Modifier + .size(playerWidth.px, playerHeight.px) + .offset(y = videoOffsetY(containerH, playerHeight, vertical).px), + ) + } } } - // Панель статуса (время/заряд) — вне контейнера, всегда у верха половины: - // при vertical=0 контейнер у низа, и панель иначе повисала бы посередине - // чёрного поля между верхом экрана и видео. - } - - Box(Modifier.fillMaxSize()) { StatusPanelCompose( - modifier = Modifier.align(Alignment.TopCenter).padding(top = 12.dp), + modifier = Modifier.align(Alignment.BottomCenter).padding(bottom = 10.dp), scale = scale, ) }