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, ) }