From f532214e1a2f77ac4a98faa230aed2ce03c06d3a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 26 Apr 2024 10:21:13 +0200 Subject: [PATCH] Add already selected participants to list when adding new participants --- .../chat/fragment/ConversationInfoFragment.kt | 9 ++++- .../main/fragment/AddParticipantsFragment.kt | 8 +++++ .../meetings/fragment/EditMeetingFragment.kt | 9 ++++- .../fragment/ScheduleMeetingFragment.kt | 9 ++++- .../viewmodel/AddParticipantsViewModel.kt | 36 +++++++++++++++++++ .../main/res/navigation/chat_nav_graph.xml | 8 ++++- .../main/res/navigation/main_nav_graph.xml | 8 ++++- .../res/navigation/meetings_nav_graph.xml | 8 ++++- 8 files changed, 89 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt index 52b0bfb50..27e89dd8b 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt @@ -218,8 +218,15 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { binding.setAddParticipantsClickListener { if (findNavController().currentDestination?.id == R.id.conversationInfoFragment) { Log.i("$TAG Going into participant picker fragment") + val selection = arrayListOf() + for (participant in viewModel.participants.value.orEmpty()) { + selection.add(participant.address.asStringUriOnly()) + } + Log.i("$TAG [${selection.size}] participants are already selected, keeping them") val action = - ConversationInfoFragmentDirections.actionConversationInfoFragmentToAddParticipantsFragment() + ConversationInfoFragmentDirections.actionConversationInfoFragmentToAddParticipantsFragment( + selection.toTypedArray() + ) findNavController().navigate(action) } } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt index 7fba7f8f8..6ed2261ae 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/AddParticipantsFragment.kt @@ -27,6 +27,7 @@ import androidx.annotation.UiThread import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs import org.linphone.core.Address import org.linphone.core.Friend import org.linphone.core.tools.Log @@ -44,6 +45,8 @@ class AddParticipantsFragment : GenericAddressPickerFragment() { override lateinit var viewModel: AddParticipantsViewModel + private val args: AddParticipantsFragmentArgs by navArgs() + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -77,6 +80,11 @@ class AddParticipantsFragment : GenericAddressPickerFragment() { setupRecyclerView(binding.contactsList) + val participants = args.selectedParticipants + if (!participants.isNullOrEmpty()) { + viewModel.addSelectedParticipants(participants) + } + viewModel.contactsAndSuggestionsList.observe( viewLifecycleOwner ) { diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt index f77b954dd..b32977522 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt @@ -160,8 +160,15 @@ class EditMeetingFragment : SlidingPaneChildFragment() { binding.setPickParticipantsClickListener { if (findNavController().currentDestination?.id == R.id.editMeetingFragment) { Log.i("$TAG Going into participant picker fragment") + val selection = arrayListOf() + for (participant in viewModel.participants.value.orEmpty()) { + selection.add(participant.address.asStringUriOnly()) + } + Log.i("$TAG [${selection.size}] participants are already selected, keeping them") val action = - EditMeetingFragmentDirections.actionEditMeetingFragmentToAddParticipantsFragment() + EditMeetingFragmentDirections.actionEditMeetingFragmentToAddParticipantsFragment( + selection.toTypedArray() + ) findNavController().navigate(action) } } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt index 52e232b88..09c077205 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt @@ -161,8 +161,15 @@ class ScheduleMeetingFragment : GenericFragment() { binding.setPickParticipantsClickListener { if (findNavController().currentDestination?.id == R.id.scheduleMeetingFragment) { Log.i("$TAG Going into participant picker fragment") + val selection = arrayListOf() + for (participant in viewModel.participants.value.orEmpty()) { + selection.add(participant.address.asStringUriOnly()) + } + Log.i("$TAG [${selection.size}] participants are already selected, keeping them") val action = - ScheduleMeetingFragmentDirections.actionScheduleMeetingFragmentToAddParticipantsFragment() + ScheduleMeetingFragmentDirections.actionScheduleMeetingFragmentToAddParticipantsFragment( + selection.toTypedArray() + ) findNavController().navigate(action) } } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AddParticipantsViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AddParticipantsViewModel.kt index 52695aae7..83f8a7335 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AddParticipantsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AddParticipantsViewModel.kt @@ -22,7 +22,10 @@ package org.linphone.ui.main.viewmodel import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.R import org.linphone.core.tools.Log +import org.linphone.ui.main.model.SelectedAddressModel +import org.linphone.utils.AppUtils import org.linphone.utils.Event class AddParticipantsViewModel @UiThread constructor() : AddressSelectionViewModel() { @@ -37,6 +40,39 @@ class AddParticipantsViewModel @UiThread constructor() : AddressSelectionViewMod switchToMultipleSelectionMode() } + @UiThread + fun addSelectedParticipants(participants: Array) { + coreContext.postOnCoreThread { core -> + Log.i("$TAG Adding [${participants.size}] pre-selected participants") + val list = arrayListOf() + + for (uri in participants) { + val address = core.interpretUrl(uri, false) + if (address == null) { + Log.e("$TAG Failed to parse participant URI [$uri] as address!") + continue + } + + val avatarModel = coreContext.contactsManager.getContactAvatarModelForAddress( + address + ) + val model = SelectedAddressModel(address, avatarModel) { + removeAddressModelFromSelection(it) + } + list.add(model) + } + + selectionCount.postValue( + AppUtils.getStringWithPlural( + R.plurals.selection_count_label, + list.size, + list.size.toString() + ) + ) + selection.postValue(list) + } + } + @UiThread fun addParticipants() { val selected = selection.value.orEmpty() diff --git a/app/src/main/res/navigation/chat_nav_graph.xml b/app/src/main/res/navigation/chat_nav_graph.xml index c31d70c73..00390cdb3 100644 --- a/app/src/main/res/navigation/chat_nav_graph.xml +++ b/app/src/main/res/navigation/chat_nav_graph.xml @@ -99,7 +99,13 @@ android:id="@+id/addParticipantsFragment" android:name="org.linphone.ui.main.fragment.AddParticipantsFragment" android:label="AddParticipantsFragment" - tools:layout="@layout/generic_add_participants_fragment" /> + tools:layout="@layout/generic_add_participants_fragment"> + + + tools:layout="@layout/generic_add_participants_fragment"> + + + tools:layout="@layout/generic_add_participants_fragment"> + + \ No newline at end of file