Added advanced setting letting user choose whether to record in MKV or SMFF

This commit is contained in:
Sylvain Berfini 2025-03-18 16:43:14 +01:00
parent 6375e0db87
commit 043ed77c3a
8 changed files with 82 additions and 5 deletions

View file

@ -119,6 +119,13 @@ class CorePreferences
config.setBool("app", "route_audio_to_speaker_when_video_enabled", value)
}
@get:WorkerThread @set:WorkerThread
var callRecordingUseSmffFormat: Boolean
get() = config.getBool("app", "use_smff_for_call_recording", false)
set(value) {
config.setBool("app", "use_smff_for_call_recording", value)
}
@get:WorkerThread @set:WorkerThread
var automaticallyStartCallRecording: Boolean
get() = config.getBool("app", "auto_start_call_record", false)

View file

@ -38,6 +38,7 @@ import org.linphone.core.tools.Log
import org.linphone.ui.GenericViewModel
import org.linphone.ui.main.recordings.model.RecordingModel
import org.linphone.utils.AudioUtils
import org.linphone.utils.LinphoneUtils
class RecordingMediaPlayerViewModel
@UiThread
@ -56,6 +57,8 @@ class RecordingMediaPlayerViewModel
val position = MutableLiveData<Int>()
val isUsingSmffFileFormat = MutableLiveData<Boolean>()
private var audioFocusRequest: AudioFocusRequestCompat? = null
private val playerListener = PlayerListener {
@ -88,6 +91,7 @@ class RecordingMediaPlayerViewModel
recordingModel = model
coreContext.postOnCoreThread { core ->
isUsingSmffFileFormat.postValue(model.filePath.endsWith(LinphoneUtils.RECORDING_SMFF_FILE_EXTENSION))
initPlayer()
}
}

View file

@ -190,6 +190,7 @@ class SettingsViewModel
// Advanced settings
val startAtBoot = MutableLiveData<Boolean>()
val keepAliveThirdPartyAccountsService = MutableLiveData<Boolean>()
val useSmffForCallRecording = MutableLiveData<Boolean>()
val deviceName = MutableLiveData<String>()
val fileSharingServerUrl = MutableLiveData<String>()
@ -293,6 +294,7 @@ class SettingsViewModel
videoFecEnabled.postValue(core.isFecEnabled)
vibrateDuringIncomingCall.postValue(core.isVibrationOnIncomingCallEnabled)
autoRecordCalls.postValue(corePreferences.automaticallyStartCallRecording)
useSmffForCallRecording.postValue(corePreferences.callRecordingUseSmffFormat)
useWifiOnly.postValue(core.isWifiOnlyEnabled)
allowIpv6.postValue(core.isIpv6Enabled)
@ -419,6 +421,15 @@ class SettingsViewModel
}
}
@UiThread
fun toggleUseSmffForCallRecording() {
val newValue = useSmffForCallRecording.value == false
coreContext.postOnCoreThread { core ->
corePreferences.callRecordingUseSmffFormat = newValue
useSmffForCallRecording.postValue(newValue)
}
}
@UiThread
fun toggleVibrateOnIncomingCalls() {
val newValue = vibrateDuringIncomingCall.value == false

View file

@ -61,7 +61,8 @@ class LinphoneUtils {
const val RECORDING_FILE_NAME_HEADER = "call_recording_"
const val RECORDING_FILE_NAME_URI_TIMESTAMP_SEPARATOR = "_on_"
const val RECORDING_FILE_EXTENSION = ".smff"
const val RECORDING_MKV_FILE_EXTENSION = ".mkv"
const val RECORDING_SMFF_FILE_EXTENSION = ".smff"
@WorkerThread
fun getDefaultAccount(): Account? {
@ -451,7 +452,13 @@ class LinphoneUtils {
@WorkerThread
fun getRecordingFilePathForAddress(address: Address): String {
val fileName = "${RECORDING_FILE_NAME_HEADER}${address.asStringUriOnly()}${RECORDING_FILE_NAME_URI_TIMESTAMP_SEPARATOR}${System.currentTimeMillis()}$RECORDING_FILE_EXTENSION"
val extension = if (corePreferences.callRecordingUseSmffFormat) {
RECORDING_SMFF_FILE_EXTENSION
} else {
RECORDING_MKV_FILE_EXTENSION
}
Log.i("$TAG Using [$extension] file format for call recording")
val fileName = "${RECORDING_FILE_NAME_HEADER}${address.asStringUriOnly()}${RECORDING_FILE_NAME_URI_TIMESTAMP_SEPARATOR}${System.currentTimeMillis()}$extension"
return FileUtils.getFileStoragePath(fileName, isRecording = true).absolutePath
}

View file

@ -162,7 +162,7 @@
android:padding="15dp"
android:src="@drawable/share_network"
android:contentDescription="@string/content_description_share_file"
android:visibility="gone"
android:visibility="@{viewModel.isUsingSmffFileFormat ? View.GONE : View.VISIBLE}"
app:tint="@color/gray_main2_500"
app:layout_constraintEnd_toStartOf="@id/save"
app:layout_constraintTop_toTopOf="parent" />
@ -176,7 +176,7 @@
android:padding="15dp"
android:src="@drawable/download_simple"
android:contentDescription="@string/content_description_save_file"
android:visibility="gone"
android:visibility="@{viewModel.isUsingSmffFileFormat ? View.GONE : View.VISIBLE}"
app:tint="@color/gray_main2_500"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

View file

@ -145,6 +145,50 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/keep_alive_service_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:onClick="@{() -> viewModel.toggleUseSmffForCallRecording()}"
android:id="@+id/use_smff_call_recording_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_advanced_use_smff_format_for_call_recordings_title"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/use_smff_call_recording_switch"
app:layout_constraintBottom_toTopOf="@id/use_smff_call_recording_subtitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/use_smff_call_recording_switch"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_subtitle_style"
android:onClick="@{() -> viewModel.toggleUseSmffForCallRecording()}"
android:id="@+id/use_smff_call_recording_subtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_advanced_use_smff_format_for_call_recordings_subtitle"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toBottomOf="@id/use_smff_call_recording_title"
app:layout_constraintBottom_toBottomOf="@id/use_smff_call_recording_switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/use_smff_call_recording_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
style="@style/material_switch_style"
android:id="@+id/use_smff_call_recording_switch"
android:onClick="@{() -> viewModel.toggleUseSmffForCallRecording()}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.useSmffForCallRecording}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/enable_fec_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:id="@+id/media_encryption_label"
@ -156,7 +200,7 @@
android:paddingBottom="8dp"
android:text="@string/settings_advanced_media_encryption_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/enable_fec_switch"/>
app:layout_constraintTop_toBottomOf="@id/use_smff_call_recording_switch"/>
<androidx.appcompat.widget.AppCompatSpinner
style="@style/default_text_style"

View file

@ -266,6 +266,8 @@
<string name="settings_advanced_device_id">Nom de l\'appareil</string>
<string name="settings_advanced_device_id_hint">Caractères alpha-numériques uniquement</string>
<string name="settings_advanced_upload_server_url">URL du serveur de partage de fichier</string>
<string name="settings_advanced_use_smff_format_for_call_recordings_title">Enregistrer les appels vidéos utilisant H265/AV1</string>
<string name="settings_advanced_use_smff_format_for_call_recordings_subtitle">Utilisera un format de fichier propriétaire</string>
<string name="settings_advanced_media_encryption_title">Chiffrement du média</string>
<string name="settings_advanced_media_encryption_mandatory_title">Rendre le chiffrement du média obligatoire</string>
<string name="settings_advanced_create_e2e_encrypted_conferences_title">Créer en mode chiffré de bout en bout les réunions et les appels de groupe</string>

View file

@ -306,6 +306,8 @@
<string name="settings_advanced_device_id">Device ID</string>
<string name="settings_advanced_device_id_hint">Alpha-numerical characters only</string>
<string name="settings_advanced_upload_server_url">File sharing server URL</string>
<string name="settings_advanced_use_smff_format_for_call_recordings_title">Record video calls using H265/AV1</string>
<string name="settings_advanced_use_smff_format_for_call_recordings_subtitle">Will use a proprietary file format</string>
<string name="settings_advanced_media_encryption_title">Media encryption</string>
<string name="settings_advanced_media_encryption_mandatory_title">Media encryption mandatory</string>
<string name="settings_advanced_create_e2e_encrypted_conferences_title">Create end-to-end encrypted meetings &amp; group calls</string>