From 344afdfcfa164ea6d71f768fb71911b8d865473a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 29 Apr 2025 16:43:30 +0200 Subject: [PATCH] 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 --- .../java/org/linphone/core/CoreContext.kt | 30 ++++-- .../java/org/linphone/core/CorePreferences.kt | 8 ++ .../ui/main/help/viewmodel/HelpViewModel.kt | 15 --- .../fragment/SettingsAdvancedFragment.kt | 1 - .../fragment/SettingsDeveloperFragment.kt | 6 ++ .../settings/viewmodel/SettingsViewModel.kt | 43 ++++++++- .../main/res/layout/help_debug_fragment.xml | 30 +----- .../res/layout/settings_advanced_fragment.xml | 66 ++++++------- .../layout/settings_developer_fragment.xml | 96 ++++++++++++++++++- app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 11 files changed, 209 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 04a9f9130..efc4c07fc 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -495,6 +495,9 @@ class CoreContext private var logcatEnabled: Boolean = corePreferences.printLogsInLogcat + private var crashlyticsEnabled: Boolean = corePreferences.sendLogsToCrashlytics + private var crashlyticsAvailable = true + private val loggingServiceListener = object : LoggingServiceListenerStub() { @WorkerThread override fun onLogMessageWritten( @@ -512,7 +515,9 @@ class CoreContext 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) } catch (e: Exception) { Log.e("$TAG Failed to instantiate Crashlytics: $e") + crashlyticsEnabled = false + crashlyticsAvailable = false } } else { Log.i("$TAG Crashlytics is disabled") + crashlyticsAvailable = false } Log.i("=========================================") Log.i("==== Linphone-android information dump ====") @@ -1057,11 +1065,6 @@ class CoreContext core.setUserAgent(userAgent, sdkUserAgent) } - @WorkerThread - fun enableLogcat(enable: Boolean) { - logcatEnabled = enable - } - // Migration between versions related @WorkerThread @@ -1137,4 +1140,19 @@ class CoreContext Log.i("$TAG Removing previous grammar files (without .belr extension)") corePreferences.clearPreviousGrammars() } + + @WorkerThread + fun isCrashlyticsAvailable(): Boolean { + return crashlyticsAvailable + } + + @WorkerThread + fun updateLogcatEnabledSetting(enabled: Boolean) { + logcatEnabled = enabled + } + + @WorkerThread + fun updateCrashlyticsEnabledSetting(enabled: Boolean) { + crashlyticsEnabled = enabled + } } diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index 76aa5d0d9..8c3b186a0 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -23,6 +23,7 @@ import android.content.Context import androidx.annotation.AnyThread import androidx.annotation.UiThread import androidx.annotation.WorkerThread +import org.linphone.BuildConfig import java.io.File import java.io.FileOutputStream import org.linphone.LinphoneApplication.Companion.coreContext @@ -53,6 +54,13 @@ class CorePreferences 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 var firstLaunch: Boolean get() = config.getBool("app", "first_6.0_launch", true) diff --git a/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt b/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt index 3b33ae420..8e43e7548 100644 --- a/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt @@ -32,7 +32,6 @@ import org.linphone.R import org.linphone.contacts.ContactLoader.Companion.NATIVE_ADDRESS_BOOK_FRIEND_LIST import org.linphone.core.Core import org.linphone.core.CoreListenerStub -import org.linphone.core.Factory import org.linphone.core.VersionUpdateCheckResult import org.linphone.core.tools.Log import org.linphone.ui.GenericViewModel @@ -47,8 +46,6 @@ class HelpViewModel private const val TAG = "[Help ViewModel]" } - val logcat = MutableLiveData() - val version = MutableLiveData() val appVersion = MutableLiveData() @@ -159,7 +156,6 @@ class HelpViewModel coreContext.postOnCoreThread { core -> core.addListener(coreListener) - logcat.postValue(corePreferences.printLogsInLogcat) checkUpdateAvailable.postValue(corePreferences.checkForUpdateServerUrl.isNotEmpty()) 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 fun cleanLogs() { coreContext.postOnCoreThread { core -> diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt index bcd6c96ae..b3e38aa44 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsAdvancedFragment.kt @@ -117,7 +117,6 @@ class SettingsAdvancedFragment : GenericMainFragment() { override fun onPause() { viewModel.updateDeviceName() - viewModel.updateFileSharingServerUrl() viewModel.updateRemoteProvisioningUrl() super.onPause() diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsDeveloperFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsDeveloperFragment.kt index 36556bee0..6f0a0bcd3 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsDeveloperFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsDeveloperFragment.kt @@ -60,4 +60,10 @@ class SettingsDeveloperFragment : GenericMainFragment() { startPostponedEnterTransition() } + + override fun onPause() { + viewModel.updateSharingServersUrl() + + super.onPause() + } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt index 4b6ce43b0..3b59e3c82 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt @@ -197,12 +197,13 @@ class SettingsViewModel // Advanced settings val showAdvancedSettings = MutableLiveData() + val sendLogsToCrashlytics = MutableLiveData() + val isCrashlyticsAvailable = MutableLiveData() val startAtBoot = MutableLiveData() val keepAliveThirdPartyAccountsService = MutableLiveData() val useSmffForCallRecording = MutableLiveData() val deviceName = MutableLiveData() - val fileSharingServerUrl = MutableLiveData() val remoteProvisioningUrl = MutableLiveData() val expandAdvancedCalls = MutableLiveData() @@ -234,6 +235,9 @@ class SettingsViewModel // Developer settings val showDeveloperSettings = MutableLiveData() + val logcat = MutableLiveData() + val fileSharingServerUrl = MutableLiveData() + val logsSharingServerUrl = MutableLiveData() val createEndToEndEncryptedConferences = MutableLiveData() private val coreListener = object : CoreListenerStub() { @@ -257,6 +261,8 @@ class SettingsViewModel core.addListener(coreListener) isTunnelAvailable.postValue(core.tunnelAvailable()) + isCrashlyticsAvailable.postValue(coreContext.isCrashlyticsAvailable()) + showConversationsSettings.postValue(!corePreferences.disableChat) showMeetingsSettings.postValue(!corePreferences.disableMeetings) ldapAvailable.postValue(core.ldapAvailable()) @@ -338,11 +344,11 @@ class SettingsViewModel setupTunnel() } + sendLogsToCrashlytics.postValue(corePreferences.sendLogsToCrashlytics) startAtBoot.postValue(corePreferences.autoStart) keepAliveThirdPartyAccountsService.postValue(corePreferences.keepServiceAlive) deviceName.postValue(corePreferences.deviceName) - fileSharingServerUrl.postValue(core.fileTransferServer) remoteProvisioningUrl.postValue(core.provisioningUri) acceptEarlyMedia.postValue(corePreferences.acceptEarlyMedia) @@ -355,6 +361,9 @@ class SettingsViewModel setupAudioDevices() setupCodecs() + logcat.postValue(corePreferences.printLogsInLogcat) + fileSharingServerUrl.postValue(core.fileTransferServer) + logsSharingServerUrl.postValue(core.logCollectionUploadServerUrl) createEndToEndEncryptedConferences.postValue(corePreferences.createEndToEndEncryptedMeetingsAndGroupCalls) } } @@ -728,6 +737,17 @@ class SettingsViewModel } } + @UiThread + fun toggleSendLogsToCrashlytics() { + val newValue = sendLogsToCrashlytics.value == false + + coreContext.postOnCoreThread { + corePreferences.sendLogsToCrashlytics = newValue + sendLogsToCrashlytics.postValue(newValue) + coreContext.updateCrashlyticsEnabledSetting(newValue) + } + } + @UiThread fun toggleStartAtBoot() { val newValue = startAtBoot.value == false @@ -884,13 +904,19 @@ class SettingsViewModel } @UiThread - fun updateFileSharingServerUrl() { + fun updateSharingServersUrl() { coreContext.postOnCoreThread { core -> val newFileSharingServerUrl = fileSharingServerUrl.value.orEmpty().trim() if (newFileSharingServerUrl.isNotEmpty()) { Log.i("$TAG Updated file sharing server URL to [$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 + } } } @@ -1064,6 +1090,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 fun toggleConferencesEndToEndEncryption() { val newValue = createEndToEndEncryptedConferences.value == false diff --git a/app/src/main/res/layout/help_debug_fragment.xml b/app/src/main/res/layout/help_debug_fragment.xml index 0e7412ce6..8de087722 100644 --- a/app/src/main/res/layout/help_debug_fragment.xml +++ b/app/src/main/res/layout/help_debug_fragment.xml @@ -64,34 +64,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/back" /> - - - - + app:layout_constraintTop_toBottomOf="@id/title" /> + + + + + app:layout_constraintTop_toBottomOf="@id/crashlytics_switch"/> - - - - + app:layout_constraintTop_toBottomOf="@id/device_id"/> + + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@id/logs_upload_server_url" /> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 07647ad89..643fb52cf 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -263,11 +263,13 @@ Auto Paramètres avancés + Aider les développeurs à corriger les problèmes en envoyant les logs à Crashlytics après un crash Démarrer au lancement du téléphone Garder l\'app en vie via un Service Nom de l\'appareil Caractères alpha-numériques uniquement URL du serveur de partage de fichier + URL du serveur de partage des logs Enregistrer les appels vidéos utilisant H265/AV1 Utilisera un format de fichier propriétaire Chiffrement du média diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a3a02f95f..54b631123 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -303,11 +303,13 @@ Auto Advanced settings + Help developers troubleshoot issues by sending logs to Crashlytics after a crash Start when device boots Keep app alive using Service Device ID Alpha-numerical characters only File sharing server URL + Logs sharing server URL Record video calls using H265/AV1 Will use a proprietary file format Media encryption