diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt
index 9aeba5ea..05faae39 100644
--- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt
+++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt
@@ -1,6 +1,7 @@
package com.utun.chat.ui.screens
import com.utun.chat.R
+import kotlin.math.roundToInt
import androidx.compose.ui.res.stringResource
import androidx.compose.foundation.clickable
import androidx.compose.foundation.Canvas
@@ -35,6 +36,7 @@ import com.utun.chat.data.RadioOverlayService
import com.utun.chat.data.RadioAudioEngine
import com.utun.chat.data.RadioAutoSettings
import com.utun.chat.data.ConfigProvider
+import com.utun.chat.data.CallVideoBitrateRange
import com.utun.chat.data.MicrophonePermission
import com.utun.chat.data.LogManager
import com.utun.chat.data.ServerEntry
@@ -903,6 +905,11 @@ private fun AudioSettingsTab(vm: ChatViewModel) {
var presetExpanded by remember { mutableStateOf(false) }
var jitterReserveMs by remember { mutableStateOf(provider.getInt("chat.call_jitter_max_reserve_ms")) }
+ val savedVideoRange = remember { provider.getCallVideoBitrateRange() }
+ var videoMinimum by rememberSaveable { mutableIntStateOf(savedVideoRange.minimum) }
+ var videoMaximum by rememberSaveable { mutableIntStateOf(savedVideoRange.maximum) }
+ var videoRangeSaving by remember { mutableStateOf(false) }
+ var videoRangeSaveFailed by remember { mutableStateOf(false) }
/* Все параметры восстанавливаются из одного снимка DataStore. */
var compressorOn by remember { mutableStateOf(savedVoiceSettings.compressorEnabled) }
@@ -1035,6 +1042,34 @@ private fun AudioSettingsTab(vm: ChatViewModel) {
}
)
+ Text(stringResource(R.string.call_video_bitrate_range), style = MaterialTheme.typography.titleMedium)
+ Text(stringResource(R.string.call_video_bitrate_range_value, videoMinimum, videoMaximum))
+ Text(stringResource(R.string.call_video_bitrate_range_hint), style = MaterialTheme.typography.bodySmall)
+ RangeSlider(
+ value = videoMinimum.toFloat()..videoMaximum.toFloat(),
+ onValueChange = { videoMinimum = it.start.roundToInt(); videoMaximum = it.endInclusive.roundToInt() },
+ valueRange = 300f..4000f,
+ steps = 36,
+ enabled = !videoRangeSaving,
+ onValueChangeFinished = {
+ val range = CallVideoBitrateRange(videoMinimum, videoMaximum)
+ videoRangeSaving = true
+ videoRangeSaveFailed = false
+ vm.viewModelScope.launch {
+ try {
+ provider.saveCallVideoBitrateRange(range)
+ NativeLib.setChatSetting("call_video_bitrate_range_kbps", range.encode())
+ } catch (e: IOException) {
+ videoRangeSaveFailed = true
+ LogManager.addLog("ERROR", "CallSettings", "Video bitrate range save failed: $range: $e")
+ } finally {
+ videoRangeSaving = false
+ }
+ }
+ }
+ )
+ if (videoRangeSaveFailed) Text(stringResource(R.string.call_video_bitrate_range_save_failed), color = MaterialTheme.colorScheme.error)
+
/* ── Voice Compressor ── */
Text(stringResource(R.string.voice_compressor), style = MaterialTheme.typography.titleMedium)
Row(verticalAlignment = Alignment.CenterVertically) {
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 37c334d8..4b1e3515 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
@@ -282,6 +282,10 @@
"Проверить"
"Качество голосового кодека"
"Звонки: максимальный запас джиттер-буфера"
+ Звонки: диапазон битрейта видео
+ %1$d–%2$d кбит/с
+ Битрейт видео подстраивается под связь в заданном диапазоне. По умолчанию: 300–4000 кбит/с.
+ Не удалось сохранить диапазон битрейта видеозвонка. Попробуйте ещё раз.
"%1$s с · применяется к следующему звонку"
"Голосовой компрессор"
"Время анализа:"
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 2a896740..a48e162c 100644
--- a/tools/chatgui-android/app/src/main/res/values/strings.xml
+++ b/tools/chatgui-android/app/src/main/res/values/strings.xml
@@ -283,6 +283,10 @@
"Test"
"Voice codec quality"
"Calls: maximum jitter buffer reserve"
+ Calls: video bitrate range
+ %1$d–%2$d kbit/s
+ Video bitrate adapts to the connection within this range. Default: 300–4000 kbit/s.
+ Could not save the call video bitrate range. Try again.
"%1$s s · applies to the next call"
"Voice compressor"
"Lookback time:"