From 5ac5cec8e86b7f148e4ef04c11b96f77e18acfd2 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 3 Apr 2026 14:17:33 +0200 Subject: [PATCH 01/10] Hide participants list header as well in read-only group chat room --- app/src/main/res/layout/chat_info_fragment.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/chat_info_fragment.xml b/app/src/main/res/layout/chat_info_fragment.xml index 5dd2ec24f..a5a2315f7 100644 --- a/app/src/main/res/layout/chat_info_fragment.xml +++ b/app/src/main/res/layout/chat_info_fragment.xml @@ -352,7 +352,7 @@ android:onClick="@{() -> viewModel.toggleParticipantsExpand()}" android:padding="10dp" android:text="@{viewModel.participantsLabel, default=@string/conversation_info_participants_list_title}" - android:visibility="@{viewModel.isGroup ? View.VISIBLE : View.GONE}" + android:visibility="@{viewModel.isGroup && !viewModel.isReadOnly ? View.VISIBLE : View.GONE}" android:background="@drawable/squircle_transparent_button_background" app:layout_constraintWidth_max="@dimen/section_max_width" app:layout_constraintEnd_toEndOf="parent" From 07b33c3e3a7cf4c5a3d20ad1c255e115e60b7289 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 3 Apr 2026 14:22:38 +0200 Subject: [PATCH 02/10] Hide do ZRTP SAS validation again while in conference --- .../layout-land/call_media_encryption_stats_bottom_sheet.xml | 2 +- .../res/layout/call_media_encryption_stats_bottom_sheet.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout-land/call_media_encryption_stats_bottom_sheet.xml b/app/src/main/res/layout-land/call_media_encryption_stats_bottom_sheet.xml index ed9cfa403..6b43d9184 100644 --- a/app/src/main/res/layout-land/call_media_encryption_stats_bottom_sheet.xml +++ b/app/src/main/res/layout-land/call_media_encryption_stats_bottom_sheet.xml @@ -142,7 +142,7 @@ android:layout_height="wrap_content" android:layout_margin="15dp" android:text="@string/call_do_zrtp_sas_validation_again" - android:visibility="@{model.isMediaEncryptionZrtp ? View.VISIBLE : View.GONE}" + android:visibility="@{model.isMediaEncryptionZrtp && !viewModel.conferenceModel.isCurrentCallInConference() ? View.VISIBLE : View.GONE}" app:layout_columnSpan="2" app:layout_gravity="center_horizontal"/> diff --git a/app/src/main/res/layout/call_media_encryption_stats_bottom_sheet.xml b/app/src/main/res/layout/call_media_encryption_stats_bottom_sheet.xml index e25eb89c1..cb9cfea1d 100644 --- a/app/src/main/res/layout/call_media_encryption_stats_bottom_sheet.xml +++ b/app/src/main/res/layout/call_media_encryption_stats_bottom_sheet.xml @@ -136,7 +136,7 @@ android:layout_margin="15dp" android:text="@string/call_do_zrtp_sas_validation_again" android:layout_gravity="center_horizontal" - android:visibility="@{model.isMediaEncryptionZrtp ? View.VISIBLE : View.GONE}"/> + android:visibility="@{model.isMediaEncryptionZrtp && !viewModel.conferenceModel.isCurrentCallInConference() ? View.VISIBLE : View.GONE}"/> From a3742824429ac4938540fd70fbee1fda68a3f22e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 3 Apr 2026 14:31:28 +0200 Subject: [PATCH 03/10] Allow multi lines in sceduled meeting description --- app/src/main/res/layout/meeting_edit_fragment.xml | 2 +- app/src/main/res/layout/meeting_schedule_fragment.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/meeting_edit_fragment.xml b/app/src/main/res/layout/meeting_edit_fragment.xml index 3b4044fec..5a8115d2d 100644 --- a/app/src/main/res/layout/meeting_edit_fragment.xml +++ b/app/src/main/res/layout/meeting_edit_fragment.xml @@ -259,7 +259,7 @@ android:text="@={viewModel.description}" android:textSize="14sp" android:textColor="?attr/color_main2_600" - android:inputType="text|textCapSentences" + android:inputType="text|textCapSentences|textMultiLine" android:drawableStart="@drawable/file_text" android:drawablePadding="8dp" android:drawableTint="?attr/color_main2_600" diff --git a/app/src/main/res/layout/meeting_schedule_fragment.xml b/app/src/main/res/layout/meeting_schedule_fragment.xml index 85c6e05a3..25c8a781d 100644 --- a/app/src/main/res/layout/meeting_schedule_fragment.xml +++ b/app/src/main/res/layout/meeting_schedule_fragment.xml @@ -397,7 +397,7 @@ android:text="@={viewModel.description}" android:textSize="14sp" android:textColor="?attr/color_main2_600" - android:inputType="text|textCapSentences" + android:inputType="text|textCapSentences|textMultiLine" android:drawableStart="@drawable/file_text" android:drawablePadding="8dp" android:drawableTint="?attr/color_main2_600" From e2db7fe1149100e24584c3ecb725d860afaf8f76 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 3 Apr 2026 14:39:15 +0200 Subject: [PATCH 04/10] Fixed empty list when filtering meetings if there is no result --- .../layout-land/meetings_list_fragment.xml | 33 +++++++++++++++++++ .../res/layout/meetings_list_fragment.xml | 33 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/app/src/main/res/layout-land/meetings_list_fragment.xml b/app/src/main/res/layout-land/meetings_list_fragment.xml index 61f7f0e05..5b8d7098b 100644 --- a/app/src/main/res/layout-land/meetings_list_fragment.xml +++ b/app/src/main/res/layout-land/meetings_list_fragment.xml @@ -32,6 +32,12 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + + + + + + + + + + Date: Fri, 3 Apr 2026 14:46:04 +0200 Subject: [PATCH 05/10] Show call transfer icon in calls list shown during call transfer instead of call state --- .../java/org/linphone/ui/call/adapter/CallsListAdapter.kt | 4 +++- .../org/linphone/ui/call/fragment/TransferCallFragment.kt | 2 +- app/src/main/res/layout/call_list_cell.xml | 6 +++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/call/adapter/CallsListAdapter.kt b/app/src/main/java/org/linphone/ui/call/adapter/CallsListAdapter.kt index bd0d08654..e87ede7b4 100644 --- a/app/src/main/java/org/linphone/ui/call/adapter/CallsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/call/adapter/CallsListAdapter.kt @@ -28,12 +28,13 @@ import androidx.lifecycle.findViewTreeLifecycleOwner import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import org.linphone.BR.showTransferIcon import org.linphone.R import org.linphone.databinding.CallListCellBinding import org.linphone.ui.call.model.CallModel import org.linphone.utils.Event -class CallsListAdapter : +class CallsListAdapter(private val showTransferIconInsteadOfCallState: Boolean = false) : ListAdapter(CallDiffCallback()) { var selectedAdapterPosition = -1 @@ -55,6 +56,7 @@ class CallsListAdapter : val viewHolder = ViewHolder(binding) binding.apply { lifecycleOwner = parent.findViewTreeLifecycleOwner() + showTransferIcon = showTransferIconInsteadOfCallState setOnClickListener { callClickedEvent.value = Event(model!!) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt index 5fc4193fa..087a55b69 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt @@ -87,7 +87,7 @@ class TransferCallFragment : GenericCallFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - callsAdapter = CallsListAdapter() + callsAdapter = CallsListAdapter(showTransferIconInsteadOfCallState = true) contactsAdapter = ConversationsContactsAndSuggestionsListAdapter() } diff --git a/app/src/main/res/layout/call_list_cell.xml b/app/src/main/res/layout/call_list_cell.xml index 986f32d47..c96518ee1 100644 --- a/app/src/main/res/layout/call_list_cell.xml +++ b/app/src/main/res/layout/call_list_cell.xml @@ -14,6 +14,9 @@ + Date: Fri, 3 Apr 2026 14:51:52 +0200 Subject: [PATCH 06/10] Empty filter textfield when leaving new call/transfer call fragments --- .../main/java/org/linphone/ui/call/fragment/NewCallFragment.kt | 1 + .../java/org/linphone/ui/call/fragment/TransferCallFragment.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/NewCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/NewCallFragment.kt index 660fbee3f..fd10c345e 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/NewCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/NewCallFragment.kt @@ -228,6 +228,7 @@ class NewCallFragment : GenericCallFragment() { override fun onPause() { super.onPause() + viewModel.searchFilter.value = "" numberOrAddressPickerDialog?.dismiss() numberOrAddressPickerDialog = null } diff --git a/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt index 087a55b69..a2c73f30d 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt @@ -249,6 +249,7 @@ class TransferCallFragment : GenericCallFragment() { override fun onPause() { super.onPause() + viewModel.searchFilter.value = "" numberOrAddressPickerDialog?.dismiss() numberOrAddressPickerDialog = null } From 528ea325ad7fbc5fbcf795d05ba9cecc9308c91b Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 3 Apr 2026 14:55:49 +0200 Subject: [PATCH 07/10] Change call recording button label while recording is ongoing --- app/src/main/res/layout/call_actions_bottom_sheet.xml | 2 +- app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/call_actions_bottom_sheet.xml b/app/src/main/res/layout/call_actions_bottom_sheet.xml index 169de2ab8..882ec1bb7 100644 --- a/app/src/main/res/layout/call_actions_bottom_sheet.xml +++ b/app/src/main/res/layout/call_actions_bottom_sheet.xml @@ -285,7 +285,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:paddingBottom="15dp" - android:text="@string/call_action_record_call" + android:text="@{viewModel.isRecording ? @string/call_action_stop_record_call : @string/call_action_record_call, default=@string/call_action_record_call}" android:labelFor="@id/record_call" app:layout_constraintTop_toBottomOf="@id/record_call" app:layout_constraintStart_toStartOf="@id/calls_list_label" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 0a495859c..5cb64b172 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -712,6 +712,7 @@ Mettre en pause Reprendre Enregistrer + Arrêter l\'enregistrement Raccrocher Décliner Décrocher diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bd5cedc2c..9d117bb4c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -755,6 +755,7 @@ Pause Resume Record + Stop recording Hang up Decline Answer From e7c43d12589dfa117d3650bcefc7e2b858b4dff1 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 3 Apr 2026 15:00:41 +0200 Subject: [PATCH 08/10] Added a toast to let user know call recording as been stored when it's been toggled off --- .../java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt | 2 ++ app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 4 insertions(+) diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index 9b5234a90..4bb10d33a 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -866,6 +866,8 @@ class CurrentCallViewModel isRecording.postValue(recording) if (recording) { showRecordingToast() + } else { + showGreenToast(R.string.call_has_been_recorded, R.drawable.record_fill) } } } diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5cb64b172..4163d8638 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -735,6 +735,7 @@ Appel non chiffré Liste des appels L\'appel est enregistré + Enregistrement sauvegardé %s enregistre l\'appel %s appels %s appels en pause diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d117bb4c..89a1a04b2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -778,6 +778,7 @@ Call is not encrypted Calls list Call is being recorded + Call recording has been saved %s is recording %s calls %s paused calls From c9f052f39cd7783edb2a6ef7d510872cf54e5559 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 3 Apr 2026 15:06:40 +0200 Subject: [PATCH 09/10] Show toast when LDAP server changes have been saved --- .../org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 3 insertions(+) diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt index 8478321a9..9469063cd 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt @@ -212,6 +212,7 @@ class LdapViewModel : GenericViewModel() { core.addLdap(ldap) Log.i("$TAG New LDAP config created") } + showGreenToast(R.string.settings_contacts_ldap_saved_toast, R.drawable.check) ldapServerOperationSuccessfulEvent.postValue(Event(true)) } catch (e: Exception) { Log.e("$TAG Exception while creating LDAP: $e") diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4163d8638..0add41d91 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -266,6 +266,7 @@ Attributs de nom Attributs SIP Domaine SIP + Configuration LDAP sauvegardée Une erreur s\'est produite, la configuration LDAP n\'a pas été sauvegardée ! Tous les champs doivent être remplis Réunions diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 89a1a04b2..597d9d55b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -308,6 +308,7 @@ Name attributes SIP attributes SIP domain + LDAP server saved A error occurred, LDAP server not saved! All fields must be filled Meetings From 498d903548bf6d8a586781975dfe42d130b92025 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 3 Apr 2026 15:13:05 +0200 Subject: [PATCH 10/10] Fixed sharing logs to contact shortcut --- .../chat/fragment/ConversationFragment.kt | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index 02935e759..9198718a8 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -548,6 +548,26 @@ open class ConversationFragment : SlidingPaneChildFragment() { } } } + + sharedViewModel.textToShareFromIntent.observe(viewLifecycleOwner) { text -> + if (text.isNotEmpty() && sharedViewModel.displayedChatRoom != null) { + Log.i("$TAG Found text to share from intent") + sendMessageViewModel.textToSend.value = text + + sharedViewModel.textToShareFromIntent.value = "" + } + } + + sharedViewModel.filesToShareFromIntent.observe(viewLifecycleOwner) { files -> + if (files.isNotEmpty() && sharedViewModel.displayedChatRoom != null) { + Log.i("$TAG Found [${files.size}] files to share from intent") + for (path in files) { + sendMessageViewModel.addAttachments(arrayListOf(path)) + } + + sharedViewModel.filesToShareFromIntent.value = arrayListOf() + } + } } } } @@ -1001,26 +1021,6 @@ open class ConversationFragment : SlidingPaneChildFragment() { } } - sharedViewModel.textToShareFromIntent.observe(viewLifecycleOwner) { text -> - if (text.isNotEmpty() && sharedViewModel.displayedChatRoom != null) { - Log.i("$TAG Found text to share from intent") - sendMessageViewModel.textToSend.value = text - - sharedViewModel.textToShareFromIntent.value = "" - } - } - - sharedViewModel.filesToShareFromIntent.observe(viewLifecycleOwner) { files -> - if (files.isNotEmpty()) { - Log.i("$TAG Found [${files.size}] files to share from intent") - for (path in files) { - sendMessageViewModel.addAttachments(arrayListOf(path)) - } - - sharedViewModel.filesToShareFromIntent.value = arrayListOf() - } - } - sharedViewModel.forceRefreshConversationInfoEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG Force refreshing conversation info")