From 3ea3ff288b49dea54311d9669732165ba82a3ce6 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 21 Nov 2023 11:07:55 +0100 Subject: [PATCH] Added schedule meeting from conversation info, fixed previous participants removed when adding new participant(s) to a meeting schedule --- .../chat/fragment/ConversationInfoFragment.kt | 10 +++++ .../viewmodel/ConversationInfoViewModel.kt | 42 ++++++++++++++++++- .../meetings/fragment/MeetingsListFragment.kt | 16 +++++++ .../fragment/ScheduleMeetingFragment.kt | 9 ++++ .../viewmodel/ScheduleMeetingViewModel.kt | 9 +++- .../viewer/fragment/FileViewerFragment.kt | 1 - .../ui/main/viewmodel/SharedMainViewModel.kt | 4 ++ .../main/res/layout/chat_info_fragment.xml | 7 +--- .../main/res/navigation/main_nav_graph.xml | 5 +++ 9 files changed, 95 insertions(+), 8 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 127e8652c..b16a857ff 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 @@ -150,6 +150,16 @@ class ConversationInfoFragment : GenericFragment() { } } + viewModel.goToScheduleMeetingEvent.observe(viewLifecycleOwner) { + it.consume { participants -> + Log.i( + "$TAG Forward participants list of size [${participants.size}] to schedule meeting fragment" + ) + sharedViewModel.goToScheduleMeetingEvent.postValue(Event(participants)) + sharedViewModel.navigateToMeetingsEvent.postValue(Event(true)) + } + } + sharedViewModel.listOfSelectedSipUrisEvent.observe(viewLifecycleOwner) { it.consume { list -> Log.i("$TAG Found [${list.size}] new participants to add to the group, let's do it") diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt index ed7a6d89d..da26e8603 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt @@ -78,6 +78,10 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { MutableLiveData>>() } + val goToScheduleMeetingEvent: MutableLiveData>> by lazy { + MutableLiveData>>() + } + private lateinit var chatRoom: ChatRoom private val chatRoomListener = object : ChatRoomListenerStub() { @@ -224,7 +228,43 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { @UiThread fun call() { - // TODO + coreContext.postOnCoreThread { core -> + if (LinphoneUtils.isChatRoomAGroup(chatRoom)) { + // TODO + } else { + val firstParticipant = chatRoom.participants.firstOrNull() + val address = firstParticipant?.address + if (address != null) { + val params = core.createCallParams(null) + params?.isVideoEnabled = false + coreContext.startCall(address, params) + } else { + Log.e("$TAG Failed to find participant to call!") + } + } + } + } + + @UiThread + fun scheduleMeeting() { + coreContext.postOnCoreThread { + if (LinphoneUtils.isChatRoomAGroup(chatRoom)) { + val participantsList = arrayListOf() + for (participant in chatRoom.participants) { + participantsList.add(participant.address.asStringUriOnly()) + goToScheduleMeetingEvent.postValue(Event(participantsList)) + } + } else { + val firstParticipant = chatRoom.participants.firstOrNull() + val address = firstParticipant?.address + if (address != null) { + val participantsList = arrayListOf(address.asStringUriOnly()) + goToScheduleMeetingEvent.postValue(Event(participantsList)) + } else { + Log.e("$TAG Failed to find participant to call!") + } + } + } } @UiThread diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt index 7b5986dfa..cc2f7cce7 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt @@ -176,6 +176,22 @@ class MeetingsListFragment : AbstractTopBarFragment() { } } + sharedViewModel.goToScheduleMeetingEvent.observe(viewLifecycleOwner) { + it.consume { participants -> + if (findNavController().currentDestination?.id == R.id.meetingsListFragment) { + val participantsArray = participants.toTypedArray() + Log.i( + "$TAG Going to schedule meeting fragment with pre-populated participants array of size [${participantsArray.size}]" + ) + val action = + MeetingsListFragmentDirections.actionMeetingsListFragmentToScheduleMeetingFragment( + participantsArray + ) + findNavController().navigate(action) + } + } + } + // TopBarFragment related setViewModelAndTitle( 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 d20f9c0c0..e81ff3970 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 @@ -27,6 +27,7 @@ import android.view.ViewGroup import androidx.annotation.UiThread import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.datepicker.DateValidatorPointForward import com.google.android.material.datepicker.MaterialDatePicker @@ -49,6 +50,8 @@ class ScheduleMeetingFragment : GenericFragment() { private lateinit var viewModel: ScheduleMeetingViewModel + private val args: ScheduleMeetingFragmentArgs by navArgs() + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -70,6 +73,12 @@ class ScheduleMeetingFragment : GenericFragment() { viewModel = ViewModelProvider(this)[ScheduleMeetingViewModel::class.java] binding.viewModel = viewModel + val participants = args.participants + if (!participants.isNullOrEmpty()) { + Log.i("$TAG Found pre-populated array of participants of size [${participants.size}]") + viewModel.addParticipants(participants.toList()) + } + binding.setBackClickListener { goBack() } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/ScheduleMeetingViewModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/ScheduleMeetingViewModel.kt index c858f5e59..28e0d5647 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/ScheduleMeetingViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/ScheduleMeetingViewModel.kt @@ -264,9 +264,11 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { } @UiThread - fun addParticipants(toAdd: ArrayList) { + fun addParticipants(toAdd: List) { coreContext.postOnCoreThread { val list = arrayListOf() + list.addAll(participants.value.orEmpty()) + for (participant in toAdd) { val address = Factory.instance().createAddress(participant) if (address == null) { @@ -279,8 +281,13 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() { // onRemoveFromSelection } list.add(model) + Log.i("$TAG Added participant [${address.asStringUriOnly()}]") } } + + Log.i( + "$TAG [${toAdd.size}] participants added, now there are [${list.size}] participants in list" + ) participants.postValue(list) } } diff --git a/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt index d54ba5061..f3c24e743 100644 --- a/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/viewer/fragment/FileViewerFragment.kt @@ -44,7 +44,6 @@ class FileViewerFragment : GenericFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - isSlidingPaneChild = true super.onViewCreated(view, savedInstanceState) viewModel = ViewModelProvider(this)[FileViewModel::class.java] diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt index 6ec0b742a..bc87ac43e 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt @@ -128,6 +128,10 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } + val goToScheduleMeetingEvent: MutableLiveData>> by lazy { + MutableLiveData>>() + } + /* Other */ val listOfSelectedSipUrisEvent: MutableLiveData>> by lazy { diff --git a/app/src/main/res/layout/chat_info_fragment.xml b/app/src/main/res/layout/chat_info_fragment.xml index 9ceced9d9..980d108cc 100644 --- a/app/src/main/res/layout/chat_info_fragment.xml +++ b/app/src/main/res/layout/chat_info_fragment.xml @@ -12,9 +12,6 @@ - @@ -222,7 +219,7 @@ android:layout_height="56dp" android:layout_marginTop="40dp" android:background="@drawable/circle_light_blue_button_background" - android:onClick="@{scheduleMeetingClickListener}" + android:onClick="@{() -> viewModel.scheduleMeeting()}" android:padding="16dp" android:src="@drawable/meeting" app:layout_constraintEnd_toEndOf="parent" @@ -236,7 +233,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:onClick="@{scheduleMeetingClickListener}" + android:onClick="@{() -> viewModel.scheduleMeeting()}" android:text="@string/meeting_schedule_meeting_label" android:textSize="14sp" app:layout_constraintEnd_toEndOf="@id/meeting" diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml index 712bdcd58..53097c627 100644 --- a/app/src/main/res/navigation/main_nav_graph.xml +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -288,6 +288,11 @@ app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" /> +