Added LIME algorithm dropdown in account advanced settings if developer mode is enabled

This commit is contained in:
Sylvain Berfini 2025-06-30 17:04:26 +02:00
parent f397456879
commit b4c2a52bf7
7 changed files with 152 additions and 22 deletions

View file

@ -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
}
}

View file

@ -100,6 +100,12 @@ class AccountSettingsViewModel
val accountFoundEvent = MutableLiveData<Event<Boolean>>()
val showDeveloperSettings = MutableLiveData<Boolean>()
val availableLimeAlgorithms = arrayListOf<String>()
val selectedLimeAlgorithm = MutableLiveData<String>()
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

View file

@ -34,15 +34,22 @@
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatSpinner
style="@style/default_text_style"
android:id="@+id/transport_spinner"
android:layout_width="0dp"
android:layout_height="50dp"
android:background="@drawable/edit_text_background"
android:paddingStart="15dp"
android:paddingEnd="30dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:gravity="center_vertical"
android:overlapAnchor="false"
android:dropDownVerticalOffset="25dp"
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/transport_title"
app:layout_constraintStart_toStartOf="@id/transport_title"
app:layout_constraintEnd_toEndOf="@id/transport_title" />
@ -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"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:id="@+id/lime_algo_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/assistant_sip_account_lime_algorithm"
android:maxLines="2"
android:ellipsize="end"
android:visibility="@{viewModel.showDeveloperSettings ? View.VISIBLE : View.GONE, default=gone}"
app:layout_constraintTop_toBottomOf="@id/lime_server"
app:layout_constraintBottom_toTopOf="@id/lime_algo_spinner"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatSpinner
style="@style/default_text_style"
android:id="@+id/lime_algo_spinner"
android:layout_width="0dp"
android:layout_height="50dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:gravity="center_vertical"
android:overlapAnchor="false"
android:dropDownVerticalOffset="25dp"
android:spinnerMode="dropdown"
android:popupBackground="@drawable/shape_squircle_white_background"
android:background="@drawable/edit_text_background"
android:visibility="@{viewModel.showDeveloperSettings ? View.VISIBLE : View.GONE, default=gone}"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintWidth_max="@dimen/text_input_max_width"
app:layout_constraintTop_toBottomOf="@id/lime_algo_title"
app:layout_constraintBottom_toTopOf="@id/update_password"
app:layout_constraintStart_toStartOf="@id/lime_algo_title"
app:layout_constraintEnd_toEndOf="@id/lime_algo_title" />
<ImageView
android:id="@+id/lime_algo_spinner_caret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/spinner_caret_end_margin"
android:src="@drawable/caret_down"
android:contentDescription="@null"
android:visibility="@{viewModel.showDeveloperSettings ? View.VISIBLE : View.GONE, default=gone}"
app:tint="?attr/color_main2_600"
app:layout_constraintTop_toTopOf="@id/lime_algo_spinner"
app:layout_constraintBottom_toBottomOf="@id/lime_algo_spinner"
app:layout_constraintEnd_toEndOf="@id/transport_spinner"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
@ -379,7 +454,7 @@
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/lime_server"
app:layout_constraintTop_toBottomOf="@id/lime_algo_spinner"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -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" />

View file

@ -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"

View file

@ -119,6 +119,7 @@
<string name="assistant_create_account_using_email_on_our_web_platform">Créez un compte avec votre email ici :</string>
<string name="assistant_already_have_an_account">Vous avez déjà un compte ?</string>
<string name="assistant_sip_account_transport_protocol">Transport</string>
<string name="assistant_sip_account_lime_algorithm">Algorithme LIME</string>
<string name="assistant_third_party_sip_account_warning_explanation">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.</string>
<string name="assistant_third_party_sip_account_create_linphone_account">Je préfère créer un compte &appName;</string>
<string name="assistant_third_party_sip_account_warning_ok">J\'ai compris</string>

View file

@ -160,6 +160,7 @@
<string name="assistant_create_account_using_email_on_our_web_platform">Create an account with your email on:</string>
<string name="assistant_already_have_an_account">Already have an account?</string>
<string name="assistant_sip_account_transport_protocol">Transport</string>
<string name="assistant_sip_account_lime_algorithm">LIME algorithm</string>
<string name="assistant_third_party_sip_account_warning_explanation">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.</string>
<string name="assistant_third_party_sip_account_create_linphone_account">I prefer to create a &appName; account</string>
<string name="assistant_third_party_sip_account_warning_ok">I understand</string>