From b4c2a52bf7a921ac91315250374a5c299e3b1702 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 30 Jun 2025 17:04:26 +0200 Subject: [PATCH] Added LIME algorithm dropdown in account advanced settings if developer mode is enabled --- .../fragment/AccountSettingsFragment.kt | 62 ++++++++++---- .../viewmodel/AccountSettingsViewModel.kt | 17 ++++ .../res/layout/account_advanced_settings.xml | 85 +++++++++++++++++-- .../res/layout/account_profile_fragment.xml | 4 + .../res/layout/settings_advanced_fragment.xml | 4 +- app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 152 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt index 8a9f21810..15745cb45 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountSettingsFragment.kt @@ -54,7 +54,7 @@ class AccountSettingsFragment : GenericMainFragment() { private lateinit var viewModel: AccountSettingsViewModel - private val dropdownListener = object : AdapterView.OnItemSelectedListener { + private val transportDropdownListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { val transport = viewModel.availableTransports[position] val transportType = when (transport) { @@ -70,6 +70,17 @@ class AccountSettingsFragment : GenericMainFragment() { } } + private val limeAlgorithmDropdownListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + val limeAlgorithm = viewModel.availableLimeAlgorithms[position] + Log.i("$TAG Selected LIME algorithm is now [$limeAlgorithm]") + viewModel.selectedLimeAlgorithm.value = limeAlgorithm + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + } + override fun goBack(): Boolean { try { return findNavController().popBackStack() @@ -116,20 +127,8 @@ class AccountSettingsFragment : GenericMainFragment() { (view.parent as? ViewGroup)?.doOnPreDraw { startPostponedEnterTransition() - val adapter = ArrayAdapter( - requireContext(), - R.layout.drop_down_item, - viewModel.availableTransports - ) - adapter.setDropDownViewResource(R.layout.generic_dropdown_cell) - val currentTransport = viewModel.selectedTransport.value?.name?.uppercase( - Locale.getDefault() - ) - binding.accountAdvancedSettings.transportSpinner.adapter = adapter - binding.accountAdvancedSettings.transportSpinner.setSelection( - viewModel.availableTransports.indexOf(currentTransport) - ) - binding.accountAdvancedSettings.transportSpinner.onItemSelectedListener = dropdownListener + setupTransportDropdown() + setupLimeAlgorithmDropdown() } } else { Log.e( @@ -171,4 +170,37 @@ class AccountSettingsFragment : GenericMainFragment() { dialog.show() } + + private fun setupTransportDropdown() { + val adapter = ArrayAdapter( + requireContext(), + R.layout.drop_down_item, + viewModel.availableTransports + ) + adapter.setDropDownViewResource(R.layout.generic_dropdown_cell) + val currentTransport = viewModel.selectedTransport.value?.name?.uppercase( + Locale.getDefault() + ) + binding.accountAdvancedSettings.transportSpinner.adapter = adapter + binding.accountAdvancedSettings.transportSpinner.setSelection( + viewModel.availableTransports.indexOf(currentTransport) + ) + binding.accountAdvancedSettings.transportSpinner.onItemSelectedListener = transportDropdownListener + } + + private fun setupLimeAlgorithmDropdown() { + val adapter = ArrayAdapter( + requireContext(), + R.layout.drop_down_item, + viewModel.availableLimeAlgorithms + ) + adapter.setDropDownViewResource(R.layout.generic_dropdown_cell) + val currentLimeAlgo = viewModel.selectedLimeAlgorithm.value + + binding.accountAdvancedSettings.limeAlgoSpinner.adapter = adapter + binding.accountAdvancedSettings.limeAlgoSpinner.setSelection( + viewModel.availableLimeAlgorithms.indexOf(currentLimeAlgo) + ) + binding.accountAdvancedSettings.limeAlgoSpinner.onItemSelectedListener = limeAlgorithmDropdownListener + } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountSettingsViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountSettingsViewModel.kt index ed201c711..fbc8c0bc3 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountSettingsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountSettingsViewModel.kt @@ -100,6 +100,12 @@ class AccountSettingsViewModel val accountFoundEvent = MutableLiveData>() + val showDeveloperSettings = MutableLiveData() + + val availableLimeAlgorithms = arrayListOf() + + val selectedLimeAlgorithm = MutableLiveData() + private lateinit var account: Account private lateinit var natPolicy: NatPolicy private lateinit var natPolicyAuthInfo: AuthInfo @@ -119,6 +125,14 @@ class AccountSettingsViewModel imEncryptionMandatoryAvailable.addSource(conferenceFactoryUri) { imEncryptionMandatoryAvailable.value = isImEncryptionMandatoryAvailable() } + + showDeveloperSettings.postValue(corePreferences.showDeveloperSettings) + + availableLimeAlgorithms.add("c25519") + availableLimeAlgorithms.add("c448") + availableLimeAlgorithms.add("c25519k512") + availableLimeAlgorithms.add("c25519mlk512") + availableLimeAlgorithms.add("c448mlk1024") } @UiThread @@ -192,6 +206,8 @@ class AccountSettingsViewModel limeServerUrl.postValue(params.limeServerUrl) + selectedLimeAlgorithm.postValue(params.limeAlgo) + accountFoundEvent.postValue(Event(true)) } else { Log.e("$TAG Failed to find account matching identity [$identity]") @@ -313,6 +329,7 @@ class AccountSettingsViewModel newParams.ccmpServerUrl = ccmpServerUrl.value newParams.limeServerUrl = limeServerUrl.value + newParams.limeAlgo = selectedLimeAlgorithm.value newParams.useInternationalPrefixForCallsAndChats = applyPrefix.value == true newParams.isDialEscapePlusEnabled = replacePlusBy00.value == true diff --git a/app/src/main/res/layout/account_advanced_settings.xml b/app/src/main/res/layout/account_advanced_settings.xml index 4151858ae..f323e65ea 100644 --- a/app/src/main/res/layout/account_advanced_settings.xml +++ b/app/src/main/res/layout/account_advanced_settings.xml @@ -34,15 +34,22 @@ app:layout_constraintEnd_toEndOf="parent"/> @@ -87,6 +94,8 @@ android:text="@={viewModel.sipProxyServer}" android:inputType="text|textUri" android:hint="@string/account_settings_sip_proxy_url_title" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/sip_proxy_title"/> @@ -225,6 +234,8 @@ android:text="@={viewModel.expire}" android:inputType="number" android:hint="@string/account_settings_expire_title" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/expire_title"/> @@ -258,6 +269,8 @@ android:text="@={viewModel.conferenceFactoryUri}" android:inputType="text|textUri" android:hint="@string/account_settings_conference_factory_uri_title" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/conference_factory_uri_title"/> @@ -290,6 +303,8 @@ android:text="@={viewModel.audioVideoConferenceFactoryUri}" android:inputType="text|textUri" android:hint="@string/account_settings_audio_video_conference_factory_uri_title" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/audio_video_conference_factory_uri_title"/> @@ -322,6 +337,8 @@ android:text="@={viewModel.ccmpServerUrl}" android:inputType="text|textUri" android:hint="@string/account_settings_ccmp_server_url_title" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/ccmp_server_url_title"/> @@ -337,7 +354,10 @@ android:text="@string/account_settings_lime_server_url_title" android:maxLines="2" android:ellipsize="end" + app:layout_constraintVertical_chainStyle="packed" + app:layout_constraintVertical_bias="0" app:layout_constraintTop_toBottomOf="@id/ccmp_server_url" + app:layout_constraintBottom_toTopOf="@id/lime_server" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> @@ -355,10 +375,65 @@ android:text="@={viewModel.limeServerUrl}" android:inputType="text|textUri" android:hint="@string/account_settings_lime_server_url_title" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/lime_server_title" - app:layout_constraintBottom_toTopOf="@id/update_password"/> + app:layout_constraintBottom_toTopOf="@id/lime_algo_title"/> + + + + + + diff --git a/app/src/main/res/layout/account_profile_fragment.xml b/app/src/main/res/layout/account_profile_fragment.xml index 1b6682806..71e3a213f 100644 --- a/app/src/main/res/layout/account_profile_fragment.xml +++ b/app/src/main/res/layout/account_profile_fragment.xml @@ -234,6 +234,8 @@ android:drawablePadding="5dp" app:drawableTint="?attr/color_main2_600" android:visibility="@{!viewModel.hideSipAddresses || viewModel.showDeviceId ? View.VISIBLE : View.GONE, default=gone}" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintStart_toEndOf="@id/sip_address_label" app:layout_constraintEnd_toEndOf="@id/details_background" app:layout_constraintTop_toTopOf="@id/sip_address_label" @@ -352,6 +354,8 @@ android:spinnerMode="dropdown" android:popupBackground="@drawable/shape_squircle_white_background" android:background="@drawable/edit_text_background" + app:layout_constraintHorizontal_bias="0" + app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintTop_toBottomOf="@id/prefix_label" app:layout_constraintStart_toStartOf="@id/prefix_label" app:layout_constraintEnd_toEndOf="@id/details_background" /> diff --git a/app/src/main/res/layout/settings_advanced_fragment.xml b/app/src/main/res/layout/settings_advanced_fragment.xml index fa2e4ec8d..73b41c6f1 100644 --- a/app/src/main/res/layout/settings_advanced_fragment.xml +++ b/app/src/main/res/layout/settings_advanced_fragment.xml @@ -289,7 +289,7 @@ android:textColor="@color/gray_main2_600" android:gravity="center_vertical" android:overlapAnchor="false" - android:dropDownVerticalOffset="2dp" + android:dropDownVerticalOffset="25dp" android:spinnerMode="dropdown" android:popupBackground="@drawable/shape_squircle_white_background" android:background="@drawable/edit_text_background" @@ -340,7 +340,7 @@ android:textColor="@color/gray_main2_600" android:gravity="center_vertical" android:overlapAnchor="false" - android:dropDownVerticalOffset="2dp" + android:dropDownVerticalOffset="25dp" android:spinnerMode="dropdown" android:popupBackground="@drawable/shape_squircle_white_background" android:background="@drawable/edit_text_background" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a4c07454b..a1627dbbb 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -119,6 +119,7 @@ Créez un compte avec votre email ici : Vous avez déjà un compte ? Transport + Algorithme LIME Certaines fonctionnalités telles que les conversations de groupe, les vidéo-conférences, etc… nécessitent un compte &appName;.\n\nCes fonctionnalités seront masquées si vous utilisez un compte SIP tiers.\n\nPour les activer dans un projet commercial, merci de nous contacter. Je préfère créer un compte &appName; J\'ai compris diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 29a082dc7..ec8a1a444 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -160,6 +160,7 @@ Create an account with your email on: Already have an account? Transport + LIME algorithm Some features require a &appName; account, such as group messaging, video conferences…\n\nThese features are hidden when you register with a third party SIP account.\n\nTo enable it in a commercial project, please contact us. I prefer to create a &appName; account I understand