Moved print logs in logcat & file sharing URL settings to developper section, added logs upload file sharing server URL setting, added setting to disable crashlytics logs collection

This commit is contained in:
Sylvain Berfini 2025-04-29 16:43:30 +02:00
parent cd8587ae41
commit 3de6b9b97e
11 changed files with 209 additions and 90 deletions

View file

@ -495,6 +495,9 @@ class CoreContext
private var logcatEnabled: Boolean = corePreferences.printLogsInLogcat private var logcatEnabled: Boolean = corePreferences.printLogsInLogcat
private var crashlyticsEnabled: Boolean = corePreferences.sendLogsToCrashlytics
private var crashlyticsAvailable = true
private val loggingServiceListener = object : LoggingServiceListenerStub() { private val loggingServiceListener = object : LoggingServiceListenerStub() {
@WorkerThread @WorkerThread
override fun onLogMessageWritten( override fun onLogMessageWritten(
@ -512,7 +515,9 @@ class CoreContext
else -> android.util.Log.d(domain, message) else -> android.util.Log.d(domain, message)
} }
} }
FirebaseCrashlytics.getInstance().log("[$domain] [${level.name}] $message") if (crashlyticsEnabled) {
FirebaseCrashlytics.getInstance().log("[$domain] [${level.name}] $message")
}
} }
} }
@ -532,9 +537,12 @@ class CoreContext
Factory.instance().loggingService.addListener(loggingServiceListener) Factory.instance().loggingService.addListener(loggingServiceListener)
} catch (e: Exception) { } catch (e: Exception) {
Log.e("$TAG Failed to instantiate Crashlytics: $e") Log.e("$TAG Failed to instantiate Crashlytics: $e")
crashlyticsEnabled = false
crashlyticsAvailable = false
} }
} else { } else {
Log.i("$TAG Crashlytics is disabled") Log.i("$TAG Crashlytics is disabled")
crashlyticsAvailable = false
} }
Log.i("=========================================") Log.i("=========================================")
Log.i("==== Linphone-android information dump ====") Log.i("==== Linphone-android information dump ====")
@ -1057,11 +1065,6 @@ class CoreContext
core.setUserAgent(userAgent, sdkUserAgent) core.setUserAgent(userAgent, sdkUserAgent)
} }
@WorkerThread
fun enableLogcat(enable: Boolean) {
logcatEnabled = enable
}
// Migration between versions related // Migration between versions related
@WorkerThread @WorkerThread
@ -1137,4 +1140,19 @@ class CoreContext
Log.i("$TAG Removing previous grammar files (without .belr extension)") Log.i("$TAG Removing previous grammar files (without .belr extension)")
corePreferences.clearPreviousGrammars() corePreferences.clearPreviousGrammars()
} }
@WorkerThread
fun isCrashlyticsAvailable(): Boolean {
return crashlyticsAvailable
}
@WorkerThread
fun updateLogcatEnabledSetting(enabled: Boolean) {
logcatEnabled = enabled
}
@WorkerThread
fun updateCrashlyticsEnabledSetting(enabled: Boolean) {
crashlyticsEnabled = enabled
}
} }

View file

@ -23,6 +23,7 @@ import android.content.Context
import androidx.annotation.AnyThread import androidx.annotation.AnyThread
import androidx.annotation.UiThread import androidx.annotation.UiThread
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import org.linphone.BuildConfig
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
@ -53,6 +54,13 @@ class CorePreferences
config.setBool("app", "debug", value) config.setBool("app", "debug", value)
} }
@get:WorkerThread @set:WorkerThread
var sendLogsToCrashlytics: Boolean
get() = config.getBool("app", "send_logs_to_crashlytics", BuildConfig.CRASHLYTICS_ENABLED)
set(value) {
config.setBool("app", "send_logs_to_crashlytics", value)
}
@get:WorkerThread @set:WorkerThread @get:WorkerThread @set:WorkerThread
var firstLaunch: Boolean var firstLaunch: Boolean
get() = config.getBool("app", "first_6.0_launch", true) get() = config.getBool("app", "first_6.0_launch", true)

View file

@ -32,7 +32,6 @@ import org.linphone.R
import org.linphone.contacts.ContactLoader.Companion.NATIVE_ADDRESS_BOOK_FRIEND_LIST import org.linphone.contacts.ContactLoader.Companion.NATIVE_ADDRESS_BOOK_FRIEND_LIST
import org.linphone.core.Core import org.linphone.core.Core
import org.linphone.core.CoreListenerStub import org.linphone.core.CoreListenerStub
import org.linphone.core.Factory
import org.linphone.core.VersionUpdateCheckResult import org.linphone.core.VersionUpdateCheckResult
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.ui.GenericViewModel import org.linphone.ui.GenericViewModel
@ -47,8 +46,6 @@ class HelpViewModel
private const val TAG = "[Help ViewModel]" private const val TAG = "[Help ViewModel]"
} }
val logcat = MutableLiveData<Boolean>()
val version = MutableLiveData<String>() val version = MutableLiveData<String>()
val appVersion = MutableLiveData<String>() val appVersion = MutableLiveData<String>()
@ -159,7 +156,6 @@ class HelpViewModel
coreContext.postOnCoreThread { core -> coreContext.postOnCoreThread { core ->
core.addListener(coreListener) core.addListener(coreListener)
logcat.postValue(corePreferences.printLogsInLogcat)
checkUpdateAvailable.postValue(corePreferences.checkForUpdateServerUrl.isNotEmpty()) checkUpdateAvailable.postValue(corePreferences.checkForUpdateServerUrl.isNotEmpty())
uploadLogsAvailable.postValue(!core.logCollectionUploadServerUrl.isNullOrEmpty()) uploadLogsAvailable.postValue(!core.logCollectionUploadServerUrl.isNullOrEmpty())
} }
@ -192,17 +188,6 @@ class HelpViewModel
} }
} }
@UiThread
fun toggleLogcat() {
val newValue = logcat.value == false
coreContext.postOnCoreThread {
corePreferences.printLogsInLogcat = newValue
coreContext.enableLogcat(newValue)
Factory.instance().enableLogcatLogs(newValue)
logcat.postValue(newValue)
}
}
@UiThread @UiThread
fun cleanLogs() { fun cleanLogs() {
coreContext.postOnCoreThread { core -> coreContext.postOnCoreThread { core ->

View file

@ -117,7 +117,6 @@ class SettingsAdvancedFragment : GenericMainFragment() {
override fun onPause() { override fun onPause() {
viewModel.updateDeviceName() viewModel.updateDeviceName()
viewModel.updateFileSharingServerUrl()
viewModel.updateRemoteProvisioningUrl() viewModel.updateRemoteProvisioningUrl()
super.onPause() super.onPause()

View file

@ -60,4 +60,10 @@ class SettingsDeveloperFragment : GenericMainFragment() {
startPostponedEnterTransition() startPostponedEnterTransition()
} }
override fun onPause() {
viewModel.updateSharingServersUrl()
super.onPause()
}
} }

View file

@ -190,12 +190,13 @@ class SettingsViewModel
// Advanced settings // Advanced settings
val showAdvancedSettings = MutableLiveData<Boolean>() val showAdvancedSettings = MutableLiveData<Boolean>()
val sendLogsToCrashlytics = MutableLiveData<Boolean>()
val isCrashlyticsAvailable = MutableLiveData<Boolean>()
val startAtBoot = MutableLiveData<Boolean>() val startAtBoot = MutableLiveData<Boolean>()
val keepAliveThirdPartyAccountsService = MutableLiveData<Boolean>() val keepAliveThirdPartyAccountsService = MutableLiveData<Boolean>()
val useSmffForCallRecording = MutableLiveData<Boolean>() val useSmffForCallRecording = MutableLiveData<Boolean>()
val deviceName = MutableLiveData<String>() val deviceName = MutableLiveData<String>()
val fileSharingServerUrl = MutableLiveData<String>()
val remoteProvisioningUrl = MutableLiveData<String>() val remoteProvisioningUrl = MutableLiveData<String>()
val expandAdvancedCalls = MutableLiveData<Boolean>() val expandAdvancedCalls = MutableLiveData<Boolean>()
@ -227,6 +228,9 @@ class SettingsViewModel
// Developer settings // Developer settings
val showDeveloperSettings = MutableLiveData<Boolean>() val showDeveloperSettings = MutableLiveData<Boolean>()
val logcat = MutableLiveData<Boolean>()
val fileSharingServerUrl = MutableLiveData<String>()
val logsSharingServerUrl = MutableLiveData<String>()
val createEndToEndEncryptedConferences = MutableLiveData<Boolean>() val createEndToEndEncryptedConferences = MutableLiveData<Boolean>()
private val coreListener = object : CoreListenerStub() { private val coreListener = object : CoreListenerStub() {
@ -250,6 +254,8 @@ class SettingsViewModel
core.addListener(coreListener) core.addListener(coreListener)
isTunnelAvailable.postValue(core.tunnelAvailable()) isTunnelAvailable.postValue(core.tunnelAvailable())
isCrashlyticsAvailable.postValue(coreContext.isCrashlyticsAvailable())
showConversationsSettings.postValue(!corePreferences.disableChat) showConversationsSettings.postValue(!corePreferences.disableChat)
showMeetingsSettings.postValue(!corePreferences.disableMeetings) showMeetingsSettings.postValue(!corePreferences.disableMeetings)
ldapAvailable.postValue(core.ldapAvailable()) ldapAvailable.postValue(core.ldapAvailable())
@ -329,11 +335,11 @@ class SettingsViewModel
setupTunnel() setupTunnel()
} }
sendLogsToCrashlytics.postValue(corePreferences.sendLogsToCrashlytics)
startAtBoot.postValue(corePreferences.autoStart) startAtBoot.postValue(corePreferences.autoStart)
keepAliveThirdPartyAccountsService.postValue(corePreferences.keepServiceAlive) keepAliveThirdPartyAccountsService.postValue(corePreferences.keepServiceAlive)
deviceName.postValue(corePreferences.deviceName) deviceName.postValue(corePreferences.deviceName)
fileSharingServerUrl.postValue(core.fileTransferServer)
remoteProvisioningUrl.postValue(core.provisioningUri) remoteProvisioningUrl.postValue(core.provisioningUri)
acceptEarlyMedia.postValue(corePreferences.acceptEarlyMedia) acceptEarlyMedia.postValue(corePreferences.acceptEarlyMedia)
@ -346,6 +352,9 @@ class SettingsViewModel
setupAudioDevices() setupAudioDevices()
setupCodecs() setupCodecs()
logcat.postValue(corePreferences.printLogsInLogcat)
fileSharingServerUrl.postValue(core.fileTransferServer)
logsSharingServerUrl.postValue(core.logCollectionUploadServerUrl)
createEndToEndEncryptedConferences.postValue(corePreferences.createEndToEndEncryptedMeetingsAndGroupCalls) createEndToEndEncryptedConferences.postValue(corePreferences.createEndToEndEncryptedMeetingsAndGroupCalls)
} }
} }
@ -712,6 +721,17 @@ class SettingsViewModel
} }
} }
@UiThread
fun toggleSendLogsToCrashlytics() {
val newValue = sendLogsToCrashlytics.value == false
coreContext.postOnCoreThread {
corePreferences.sendLogsToCrashlytics = newValue
sendLogsToCrashlytics.postValue(newValue)
coreContext.updateCrashlyticsEnabledSetting(newValue)
}
}
@UiThread @UiThread
fun toggleStartAtBoot() { fun toggleStartAtBoot() {
val newValue = startAtBoot.value == false val newValue = startAtBoot.value == false
@ -868,13 +888,19 @@ class SettingsViewModel
} }
@UiThread @UiThread
fun updateFileSharingServerUrl() { fun updateSharingServersUrl() {
coreContext.postOnCoreThread { core -> coreContext.postOnCoreThread { core ->
val newFileSharingServerUrl = fileSharingServerUrl.value.orEmpty().trim() val newFileSharingServerUrl = fileSharingServerUrl.value.orEmpty().trim()
if (newFileSharingServerUrl.isNotEmpty()) { if (newFileSharingServerUrl.isNotEmpty()) {
Log.i("$TAG Updated file sharing server URL to [$newFileSharingServerUrl]") Log.i("$TAG Updated file sharing server URL to [$newFileSharingServerUrl]")
core.fileTransferServer = newFileSharingServerUrl core.fileTransferServer = newFileSharingServerUrl
} }
val newLogsSharingServerUrl = logsSharingServerUrl.value.orEmpty().trim()
if (newLogsSharingServerUrl.isNotEmpty()) {
Log.i("$TAG Updated logs upload server URL to [$newLogsSharingServerUrl]")
core.logCollectionUploadServerUrl = newLogsSharingServerUrl
}
} }
} }
@ -1048,6 +1074,17 @@ class SettingsViewModel
} }
} }
@UiThread
fun toggleLogcat() {
val newValue = logcat.value == false
coreContext.postOnCoreThread {
corePreferences.printLogsInLogcat = newValue
coreContext.updateLogcatEnabledSetting(newValue)
Factory.instance().enableLogcatLogs(newValue)
logcat.postValue(newValue)
}
}
@UiThread @UiThread
fun toggleConferencesEndToEndEncryption() { fun toggleConferencesEndToEndEncryption() {
val newValue = createEndToEndEncryptedConferences.value == false val newValue = createEndToEndEncryptedConferences.value == false

View file

@ -64,34 +64,6 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/back" /> app:layout_constraintTop_toBottomOf="@id/back" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:onClick="@{() -> viewModel.toggleLogcat()}"
android:id="@+id/logcat_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/help_troubleshooting_print_logs_in_logcat"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/logcat_switch"
app:layout_constraintBottom_toBottomOf="@id/logcat_switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/logcat_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
style="@style/material_switch_style"
android:id="@+id/logcat_switch"
android:onClick="@{() -> viewModel.toggleLogcat()}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.logcat}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/title" />
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
style="@style/tertiary_button_label_style" style="@style/tertiary_button_label_style"
android:id="@+id/clean_logs" android:id="@+id/clean_logs"
@ -140,7 +112,7 @@
app:flow_horizontalStyle="spread_inside" app:flow_horizontalStyle="spread_inside"
app:constraint_referenced_ids="clean_logs, send_logs" app:constraint_referenced_ids="clean_logs, send_logs"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/logcat_switch" /> app:layout_constraintTop_toBottomOf="@id/title" />
<ImageView <ImageView
android:id="@+id/app_version_icon" android:id="@+id/app_version_icon"

View file

@ -61,6 +61,35 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:id="@+id/crashlytics_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_advanced_print_logs_crashlytics_title"
android:maxLines="3"
android:ellipsize="end"
android:visibility="@{viewModel.isCrashlyticsAvailable ? View.VISIBLE : View.GONE}"
app:layout_constraintTop_toTopOf="@id/crashlytics_switch"
app:layout_constraintBottom_toBottomOf="@id/crashlytics_switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/crashlytics_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
style="@style/material_switch_style"
android:id="@+id/crashlytics_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.sendLogsToCrashlytics}"
android:onClick="@{() -> viewModel.toggleSendLogsToCrashlytics()}"
android:visibility="@{viewModel.isCrashlyticsAvailable ? View.VISIBLE : View.GONE}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style" style="@style/settings_title_style"
android:id="@+id/start_at_boot_title" android:id="@+id/start_at_boot_title"
@ -86,7 +115,7 @@
android:checked="@{viewModel.startAtBoot}" android:checked="@{viewModel.startAtBoot}"
android:onClick="@{() -> viewModel.toggleStartAtBoot()}" android:onClick="@{() -> viewModel.toggleStartAtBoot()}"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/> app:layout_constraintTop_toBottomOf="@id/crashlytics_switch"/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style" style="@style/settings_title_style"
@ -148,39 +177,6 @@
app:layout_constraintStart_toStartOf="@id/device_id_label" app:layout_constraintStart_toStartOf="@id/device_id_label"
app:layout_constraintEnd_toEndOf="parent"/> app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:id="@+id/upload_server_url_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="@string/settings_advanced_upload_server_url"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/device_id"/>
<androidx.appcompat.widget.AppCompatEditText
style="@style/default_text_style"
android:id="@+id/upload_server_url"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginEnd="16dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.fileSharingServerUrl}"
android:textSize="14sp"
android:maxLines="1"
android:background="@drawable/edit_text_background"
android:inputType="text|textUri"
android:hint="@string/settings_advanced_upload_server_url"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintWidth_max="@dimen/text_input_max_width"
app:layout_constraintTop_toBottomOf="@id/upload_server_url_label"
app:layout_constraintStart_toStartOf="@id/upload_server_url_label"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style" style="@style/settings_title_style"
android:id="@+id/remote_provisioning_label" android:id="@+id/remote_provisioning_label"
@ -192,7 +188,7 @@
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:text="@string/settings_advanced_remote_provisioning_url" android:text="@string/settings_advanced_remote_provisioning_url"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/upload_server_url"/> app:layout_constraintTop_toBottomOf="@id/device_id"/>
<androidx.appcompat.widget.AppCompatEditText <androidx.appcompat.widget.AppCompatEditText
style="@style/default_text_style" style="@style/default_text_style"

View file

@ -85,6 +85,100 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:onClick="@{() -> viewModel.toggleLogcat()}"
android:id="@+id/logcat_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/help_troubleshooting_print_logs_in_logcat"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/logcat_switch"
app:layout_constraintBottom_toBottomOf="@id/logcat_switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/logcat_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
style="@style/material_switch_style"
android:id="@+id/logcat_switch"
android:onClick="@{() -> viewModel.toggleLogcat()}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.logcat}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/settings_developer_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:id="@+id/upload_server_url_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="@string/settings_advanced_upload_server_url"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/logcat_switch"/>
<androidx.appcompat.widget.AppCompatEditText
style="@style/default_text_style"
android:id="@+id/upload_server_url"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginEnd="16dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.fileSharingServerUrl}"
android:textSize="14sp"
android:maxLines="1"
android:background="@drawable/edit_text_background"
android:inputType="text|textUri"
android:hint="@string/settings_advanced_upload_server_url"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintWidth_max="@dimen/text_input_max_width"
app:layout_constraintTop_toBottomOf="@id/upload_server_url_label"
app:layout_constraintStart_toStartOf="@id/upload_server_url_label"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:id="@+id/logs_upload_server_url_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:text="@string/settings_advanced_logs_upload_server_url"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/upload_server_url"/>
<androidx.appcompat.widget.AppCompatEditText
style="@style/default_text_style"
android:id="@+id/logs_upload_server_url"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginEnd="16dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.fileSharingServerUrl}"
android:textSize="14sp"
android:maxLines="1"
android:background="@drawable/edit_text_background"
android:inputType="text|textUri"
android:hint="@string/settings_advanced_logs_upload_server_url"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintWidth_max="@dimen/text_input_max_width"
app:layout_constraintTop_toBottomOf="@id/logs_upload_server_url_label"
app:layout_constraintStart_toStartOf="@id/logs_upload_server_url_label"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style" style="@style/settings_title_style"
android:onClick="@{() -> viewModel.toggleConferencesEndToEndEncryption()}" android:onClick="@{() -> viewModel.toggleConferencesEndToEndEncryption()}"
@ -111,7 +205,7 @@
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:checked="@{viewModel.createEndToEndEncryptedConferences}" android:checked="@{viewModel.createEndToEndEncryptedConferences}"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/settings_developer_switch" /> app:layout_constraintTop_toBottomOf="@id/logs_upload_server_url" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -270,11 +270,13 @@
<string name="settings_tunnel_mode_auto_label">Auto</string> <string name="settings_tunnel_mode_auto_label">Auto</string>
<string name="settings_advanced_title">Paramètres avancés</string> <string name="settings_advanced_title">Paramètres avancés</string>
<string name="settings_advanced_print_logs_crashlytics_title">Aider les développeurs à corriger les problèmes en envoyant les logs à Crashlytics après un crash</string>
<string name="settings_advanced_start_at_boot_title">Démarrer au lancement du téléphone</string> <string name="settings_advanced_start_at_boot_title">Démarrer au lancement du téléphone</string>
<string name="settings_advanced_keep_alive_service_title">Garder l\'app en vie via un Service</string> <string name="settings_advanced_keep_alive_service_title">Garder l\'app en vie via un Service</string>
<string name="settings_advanced_device_id">Nom de l\'appareil</string> <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_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_upload_server_url">URL du serveur de partage de fichier</string>
<string name="settings_advanced_logs_upload_server_url">URL du serveur de partage des logs</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_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_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_title">Chiffrement du média</string>

View file

@ -310,11 +310,13 @@
<string name="settings_tunnel_mode_auto_label">Auto</string> <string name="settings_tunnel_mode_auto_label">Auto</string>
<string name="settings_advanced_title">Advanced settings</string> <string name="settings_advanced_title">Advanced settings</string>
<string name="settings_advanced_print_logs_crashlytics_title">Help developers troubleshoot issues by sending logs to Crashlytics after a crash</string>
<string name="settings_advanced_start_at_boot_title">Start when device boots</string> <string name="settings_advanced_start_at_boot_title">Start when device boots</string>
<string name="settings_advanced_keep_alive_service_title">Keep app alive using Service</string> <string name="settings_advanced_keep_alive_service_title">Keep app alive using Service</string>
<string name="settings_advanced_device_id">Device ID</string> <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_device_id_hint">Alpha-numerical characters only</string>
<string name="settings_advanced_upload_server_url">File sharing server URL</string> <string name="settings_advanced_upload_server_url">File sharing server URL</string>
<string name="settings_advanced_logs_upload_server_url">Logs 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_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_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_title">Media encryption</string>