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 e952c2be3..f1751b5a1 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 @@ -123,6 +123,13 @@ class ConversationInfoFragment : GenericFragment() { } } + sharedViewModel.listOfSelectedSipUrisEvent.observe(viewLifecycleOwner) { + it.consume { list -> + Log.i("$TAG Found [${list.size}] new participants to add to the group, let's do it") + viewModel.addParticipants(list) + } + } + binding.setBackClickListener { goBack() } 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 2dd41c78d..81afd4c40 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 @@ -25,6 +25,7 @@ import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.core.Address import org.linphone.core.ChatRoom import org.linphone.core.ChatRoomListenerStub import org.linphone.core.EventLog @@ -256,6 +257,37 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { } } + @UiThread + fun addParticipants(toAdd: ArrayList) { + coreContext.postOnCoreThread { + if (::chatRoom.isInitialized) { + if (!LinphoneUtils.isChatRoomAGroup(chatRoom)) { + Log.e("$TAG Can't add participants to a chat room that's not a group!") + return@postOnCoreThread + } + + val list = arrayListOf
() + for (participant in toAdd) { + val address = Factory.instance().createAddress(participant) + if (address == null) { + Log.e("$TAG Failed to parse [$participant] as address!") + } else { + list.add(address) + } + } + + val participantsToAdd = arrayOfNulls
(list.size) + list.toArray(participantsToAdd) + Log.i("$TAG Adding [${participantsToAdd.size}] new participants to chat room") + val ok = chatRoom.addParticipants(participantsToAdd) + if (!ok) { + Log.w("$TAG Failed to add some/all participants to the group!") + // TODO: show toast + } + } + } + } + @WorkerThread private fun configureChatRoom() { isMuted.postValue(chatRoom.muted) 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 30068f4d2..31bb8928a 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 @@ -32,6 +32,7 @@ import org.linphone.core.Friend import org.linphone.core.tools.Log import org.linphone.databinding.GenericAddParticipantsFragmentBinding import org.linphone.ui.main.viewmodel.AddParticipantsViewModel +import org.linphone.utils.Event @UiThread class AddParticipantsFragment : GenericAddressPickerFragment() { @@ -93,5 +94,12 @@ class AddParticipantsFragment : GenericAddressPickerFragment() { } } } + + viewModel.selectedSipUrisEvent.observe(viewLifecycleOwner) { + it.consume { list -> + sharedViewModel.listOfSelectedSipUrisEvent.value = Event(list) + goBack() + } + } } } 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 89f829064..52695aae7 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 @@ -20,13 +20,35 @@ package org.linphone.ui.main.viewmodel import androidx.annotation.UiThread +import androidx.lifecycle.MutableLiveData +import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.core.tools.Log +import org.linphone.utils.Event class AddParticipantsViewModel @UiThread constructor() : AddressSelectionViewModel() { companion object { private const val TAG = "[Add Participants ViewModel]" } + val selectedSipUrisEvent = MutableLiveData>>() + init { + Log.i("$TAG Forcing multiple selection mode") switchToMultipleSelectionMode() } + + @UiThread + fun addParticipants() { + val selected = selection.value.orEmpty() + Log.i("$TAG [${selected.size}] participants selected") + + coreContext.postOnCoreThread { + val list = arrayListOf() + for (model in selected) { + list.add(model.address.asStringUriOnly()) + } + + selectedSipUrisEvent.postValue(Event(list)) + } + } } 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 d34c7d52c..d2cc5a364 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 @@ -122,4 +122,10 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { val forceRefreshMeetingsListEvent: MutableLiveData> by lazy { MutableLiveData>() } + + /* Other */ + + val listOfSelectedSipUrisEvent: MutableLiveData>> by lazy { + MutableLiveData>>() + } } diff --git a/app/src/main/res/layout/generic_add_participants_fragment.xml b/app/src/main/res/layout/generic_add_participants_fragment.xml index 919acb449..cffb930af 100644 --- a/app/src/main/res/layout/generic_add_participants_fragment.xml +++ b/app/src/main/res/layout/generic_add_participants_fragment.xml @@ -43,10 +43,24 @@ android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:text="@string/conversation_add_participants_title" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@id/add_participants" app:layout_constraintStart_toEndOf="@id/back" app:layout_constraintTop_toTopOf="parent" /> + +