Add descriptive headers to camera option menus

This commit is contained in:
evgeny committed 2026-10-28 12:08:07 +01:00
1 parent 93da173987
commit 217a4bb27b
4 files changed
+18

No files matched your search

@@ -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
@@ -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) {
@@ -167,6 +167,8 @@
<string name="photo">"Фото"</string>
<string name="capture_video">Видео</string>
<string name="capture_jpeg_quality">Качество JPEG: %1$d</string>
<string name="capture_jpeg_quality_title">Качество JPEG</string>
<string name="capture_bitrate_title">Битрейт видео</string>
<string name="capture_failed">Не удалось выполнить съёмку. Попробуйте ещё раз.</string>
<string name="image_failed">Не удалось прочитать изображение</string>
<string name="camera_light">"Подсветка"</string>
@@ -168,6 +168,8 @@
<string name="photo">"Photo"</string>
<string name="capture_video">Video</string>
<string name="capture_jpeg_quality">JPEG quality: %1$d</string>
<string name="capture_jpeg_quality_title">JPEG quality</string>
<string name="capture_bitrate_title">Video bitrate</string>
<string name="capture_failed">Could not capture media. Try again.</string>
<string name="image_failed">Could not read image</string>
<string name="camera_light">"Fill light"</string>