diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt index 2b4cd934d..c224228c2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt @@ -331,10 +331,10 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter dividerPref() - sectionHeaderPref(R.string.preferences__internal_calling) + sectionHeaderPref(R.string.preferences__internal_calling_server) radioPref( - title = DSLSettingsText.from(R.string.preferences__internal_calling_default), + title = DSLSettingsText.from(R.string.preferences__internal_calling_server_default), summary = DSLSettingsText.from(BuildConfig.SIGNAL_SFU_URL), isChecked = state.callingServer == BuildConfig.SIGNAL_SFU_URL, onClick = { @@ -345,7 +345,7 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter BuildConfig.SIGNAL_SFU_INTERNAL_NAMES.zip(BuildConfig.SIGNAL_SFU_INTERNAL_URLS) .forEach { (name, server) -> radioPref( - title = DSLSettingsText.from(requireContext().getString(R.string.preferences__internal_calling_s_server, name)), + title = DSLSettingsText.from(requireContext().getString(R.string.preferences__internal_calling_server_s, name)), summary = DSLSettingsText.from(server), isChecked = state.callingServer == server, onClick = { @@ -354,14 +354,23 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter ) } - sectionHeaderPref(R.string.preferences__internal_audio) + sectionHeaderPref(R.string.preferences__internal_calling) radioListPref( - title = DSLSettingsText.from(R.string.preferences__internal_audio_processing_method), + title = DSLSettingsText.from(R.string.preferences__internal_calling_audio_processing_method), listItems = CallManager.AudioProcessingMethod.values().map { it.name }.toTypedArray(), - selected = CallManager.AudioProcessingMethod.values().indexOf(state.audioProcessingMethod), + selected = CallManager.AudioProcessingMethod.values().indexOf(state.callingAudioProcessingMethod), onSelected = { - viewModel.setInternalAudioProcessingMethod(CallManager.AudioProcessingMethod.values()[it]) + viewModel.setInternalCallingAudioProcessingMethod(CallManager.AudioProcessingMethod.values()[it]) + } + ) + + radioListPref( + title = DSLSettingsText.from(R.string.preferences__internal_calling_bandwidth_mode), + listItems = CallManager.BandwidthMode.values().map { it.name }.toTypedArray(), + selected = CallManager.BandwidthMode.values().indexOf(state.callingBandwidthMode), + onSelected = { + viewModel.setInternalCallingBandwidthMode(CallManager.BandwidthMode.values()[it]) } ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt index 528726035..06862eb2d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt @@ -14,7 +14,8 @@ data class InternalSettingsState( val disableAutoMigrationNotification: Boolean, val allowCensorshipSetting: Boolean, val callingServer: String, - val audioProcessingMethod: CallManager.AudioProcessingMethod, + val callingAudioProcessingMethod: CallManager.AudioProcessingMethod, + val callingBandwidthMode: CallManager.BandwidthMode, val useBuiltInEmojiSet: Boolean, val emojiVersion: EmojiFiles.Version?, val removeSenderKeyMinimium: Boolean, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt index da05e05e1..c59744d01 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt @@ -91,8 +91,13 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito refresh() } - fun setInternalAudioProcessingMethod(method: CallManager.AudioProcessingMethod) { - preferenceDataStore.putInt(InternalValues.AUDIO_PROCESSING_METHOD, method.ordinal) + fun setInternalCallingAudioProcessingMethod(method: CallManager.AudioProcessingMethod) { + preferenceDataStore.putInt(InternalValues.CALLING_AUDIO_PROCESSING_METHOD, method.ordinal) + refresh() + } + + fun setInternalCallingBandwidthMode(bandwidthMode: CallManager.BandwidthMode) { + preferenceDataStore.putInt(InternalValues.CALLING_BANDWIDTH_MODE, bandwidthMode.ordinal) refresh() } @@ -121,7 +126,8 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito disableAutoMigrationNotification = SignalStore.internalValues().disableGv1AutoMigrateNotification(), allowCensorshipSetting = SignalStore.internalValues().allowChangingCensorshipSetting(), callingServer = SignalStore.internalValues().groupCallingServer(), - audioProcessingMethod = SignalStore.internalValues().audioProcessingMethod(), + callingAudioProcessingMethod = SignalStore.internalValues().callingAudioProcessingMethod(), + callingBandwidthMode = SignalStore.internalValues().callingBandwidthMode(), useBuiltInEmojiSet = SignalStore.internalValues().forceBuiltInEmoji(), emojiVersion = null, removeSenderKeyMinimium = SignalStore.internalValues().removeSenderKeyMinimum(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java index 914e8b1fc..178b8cf9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java @@ -24,7 +24,8 @@ public final class InternalValues extends SignalStoreValues { public static final String REMOVE_SENDER_KEY_MINIMUM = "internal.remove_sender_key_minimum"; public static final String DELAY_RESENDS = "internal.delay_resends"; public static final String CALLING_SERVER = "internal.calling_server"; - public static final String AUDIO_PROCESSING_METHOD = "internal.audio_processing_method"; + public static final String CALLING_AUDIO_PROCESSING_METHOD = "internal.calling_audio_processing_method"; + public static final String CALLING_BANDWIDTH_MODE = "internal.calling_bandwidth_mode"; public static final String SHAKE_TO_REPORT = "internal.shake_to_report"; public static final String DISABLE_STORAGE_SERVICE = "internal.disable_storage_service"; @@ -159,11 +160,22 @@ public final class InternalValues extends SignalStoreValues { /** * Setting to override the default handling of hardware/software AEC. */ - public synchronized CallManager.AudioProcessingMethod audioProcessingMethod() { + public synchronized CallManager.AudioProcessingMethod callingAudioProcessingMethod() { if (FeatureFlags.internalUser()) { - return CallManager.AudioProcessingMethod.values()[getInteger(AUDIO_PROCESSING_METHOD, CallManager.AudioProcessingMethod.Default.ordinal())]; + return CallManager.AudioProcessingMethod.values()[getInteger(CALLING_AUDIO_PROCESSING_METHOD, CallManager.AudioProcessingMethod.Default.ordinal())]; } else { return CallManager.AudioProcessingMethod.Default; } } + + /** + * Setting to override the default calling bandwidth mode. + */ + public synchronized CallManager.BandwidthMode callingBandwidthMode() { + if (FeatureFlags.internalUser()) { + return CallManager.BandwidthMode.values()[getInteger(CALLING_BANDWIDTH_MODE, CallManager.BandwidthMode.NORMAL.ordinal())]; + } else { + return CallManager.BandwidthMode.NORMAL; + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AudioProcessingMethodSelector.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AudioProcessingMethodSelector.kt index 9e15812b4..624bf4d8b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AudioProcessingMethodSelector.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/AudioProcessingMethodSelector.kt @@ -13,8 +13,8 @@ object AudioProcessingMethodSelector { @JvmStatic fun get(): AudioProcessingMethod { - if (SignalStore.internalValues().audioProcessingMethod() != AudioProcessingMethod.Default) { - return SignalStore.internalValues().audioProcessingMethod() + if (SignalStore.internalValues().callingAudioProcessingMethod() != AudioProcessingMethod.Default) { + return SignalStore.internalValues().callingAudioProcessingMethod() } val useAec3: Boolean = FeatureFlags.useAec3() diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/NetworkUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/NetworkUtil.java index e16cd6c3e..38293a8b2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/NetworkUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/NetworkUtil.java @@ -35,6 +35,10 @@ public final class NetworkUtil { } public static @NonNull CallManager.BandwidthMode getCallingBandwidthMode(@NonNull Context context, @NonNull PeerConnection.AdapterType networkAdapter) { + if (SignalStore.internalValues().callingBandwidthMode() != CallManager.BandwidthMode.NORMAL) { + return SignalStore.internalValues().callingBandwidthMode(); + } + return useLowBandwidthCalling(context, networkAdapter) ? CallManager.BandwidthMode.LOW : CallManager.BandwidthMode.NORMAL; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 26edaa390..d01c99d09 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2692,11 +2692,12 @@ Local Metrics Clear local metrics Click to clear all local metrics state. - Group call server - Default - %1$s server - Audio options - Audio processing method + Group call server + Default + %1$s server + Calling options + Audio processing method + Bandwidth mode Badges Enqueue redemption. Release channel