From 217a4bb27b1cce72e4a4e20f11960fbe416a2ed3 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 28 Oct 2026 09:54:54 +0100 Subject: [PATCH] Add descriptive headers to camera option menus --- .../java/com/utun/chat/ui/screens/CameraRecordScreen.kt | 5 +++++ .../java/com/utun/chat/ui/screens/CaptureControls.kt | 9 +++++++++ .../app/src/main/res/values-ru/strings.xml | 2 ++ .../chatgui-android/app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 18 insertions(+) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CameraRecordScreen.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CameraRecordScreen.kt index 6c1b9020..729b1739 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CameraRecordScreen.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CameraRecordScreen.kt @@ -367,6 +367,7 @@ fun CameraRecordScreen(initialMode: CaptureMode, onSend: (String, CaptureMode) - CaptureValueIcon(CaptureIconShape.CAMERA, focal, front = lens?.type == LensType.SELFIE) } DropdownMenu(expanded = menu == CameraOption.CAMERA, onDismissRequest = { menu = null }) { + CaptureMenuHeader(stringResource(R.string.camera)) lenses.forEach { item -> CaptureOptionItem("${item.label} ${item.mm}".trim(), lens == item, onClick = { menu = null; lens = item @@ -382,6 +383,7 @@ fun CameraRecordScreen(initialMode: CaptureMode, onSend: (String, CaptureMode) - CaptureValueIcon(CaptureIconShape.CHIP, codec.name) } DropdownMenu(expanded = menu == CameraOption.CODEC, onDismissRequest = { menu = null }) { + CaptureMenuHeader(stringResource(R.string.call_video_codec)) videoOptions?.forEach { (item, supported) -> CaptureOptionItem(item.label, codec == item, onClick = { menu = null; codec = item @@ -405,6 +407,7 @@ fun CameraRecordScreen(initialMode: CaptureMode, onSend: (String, CaptureMode) - CaptureValueIcon(CaptureIconShape.SCREEN, value) } DropdownMenu(expanded = menu == CameraOption.RESOLUTION, onDismissRequest = { menu = null }) { + CaptureMenuHeader(stringResource(R.string.call_video_resolution)) if (mode == CaptureMode.PHOTO) resolutions.forEach { item -> CaptureOptionItem(item.label, resolution == item, onClick = { menu = null; resolution = item @@ -426,6 +429,7 @@ fun CameraRecordScreen(initialMode: CaptureMode, onSend: (String, CaptureMode) - CaptureValueIcon(CaptureIconShape.GAUGE, captureBitrateLabel(bitrate)) } DropdownMenu(expanded = menu == CameraOption.BITRATE, onDismissRequest = { menu = null }) { + CaptureMenuHeader(stringResource(R.string.capture_bitrate_title)) VIDEO_BITRATES.forEach { item -> CaptureOptionItem(stringResource(R.string.stream_bitrate_value, item / 1_000_000.0), bitrate == item, onClick = { @@ -440,6 +444,7 @@ fun CameraRecordScreen(initialMode: CaptureMode, onSend: (String, CaptureMode) - CaptureValueIcon(CaptureIconShape.GAUGE, jpegQuality.toString(), detail = "JPEG") } DropdownMenu(expanded = menu == CameraOption.JPEG_QUALITY, onDismissRequest = { menu = null }) { + CaptureMenuHeader(stringResource(R.string.capture_jpeg_quality_title)) JPEG_QUALITIES.forEach { item -> CaptureOptionItem(item.toString(), jpegQuality == item, onClick = { menu = null; jpegQuality = item diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CaptureControls.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CaptureControls.kt index e1ae09c5..26225e13 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CaptureControls.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/CaptureControls.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.semantics.clearAndSetSemantics import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.heading import androidx.compose.ui.semantics.selected import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.font.FontWeight @@ -137,6 +138,14 @@ internal fun CaptureValueIcon(shape: CaptureIconShape, value: String, detail: St } } +/** Название параметра над вариантами меню; заголовок не является действием. */ +@Composable +internal fun CaptureMenuHeader(title: String) { + Text(title, Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 8.dp).semantics { heading() }, + style = MaterialTheme.typography.labelLarge, color = MaterialTheme.colorScheme.onSurfaceVariant) + HorizontalDivider() +} + /** Текущее значение отмечено галочкой и доступно средствам чтения экрана. */ @Composable internal fun CaptureOptionItem(label: String, active: Boolean, onClick: () -> Unit, icon: @Composable (() -> Unit)? = null) { diff --git a/tools/chatgui-android/app/src/main/res/values-ru/strings.xml b/tools/chatgui-android/app/src/main/res/values-ru/strings.xml index c3ffcadc..7620948b 100644 --- a/tools/chatgui-android/app/src/main/res/values-ru/strings.xml +++ b/tools/chatgui-android/app/src/main/res/values-ru/strings.xml @@ -167,6 +167,8 @@ "Фото" Видео Качество JPEG: %1$d + Качество JPEG + Битрейт видео Не удалось выполнить съёмку. Попробуйте ещё раз. Не удалось прочитать изображение "Подсветка" diff --git a/tools/chatgui-android/app/src/main/res/values/strings.xml b/tools/chatgui-android/app/src/main/res/values/strings.xml index 9fc4251c..e5659a82 100644 --- a/tools/chatgui-android/app/src/main/res/values/strings.xml +++ b/tools/chatgui-android/app/src/main/res/values/strings.xml @@ -168,6 +168,8 @@ "Photo" Video JPEG quality: %1$d + JPEG quality + Video bitrate Could not capture media. Try again. Could not read image "Fill light"