From d6ea531ceaca51e011c89a5a0c7304a276822610 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 8 Apr 2024 14:01:19 +0200 Subject: [PATCH] Moved some code around & added invite participant into conf --- .../java/org/linphone/ui/call/CallActivity.kt | 4 +- .../ConferenceParticipantsListAdapter.kt | 2 +- .../fragment/ActiveConferenceCallFragment.kt | 3 +- .../ConferenceActiveSpeakerFragment.kt | 9 +- .../ConferenceAddParticipantsFragment.kt | 108 ++++++++++++++++++ .../fragment/ConferenceAudioOnlyFragment.kt | 9 +- .../fragment/ConferenceGridFragment.kt | 9 +- .../ConferenceLayoutMenuDialogFragment.kt | 12 +- .../ConferenceParticipantsListFragment.kt | 20 +++- .../model/ConferenceParticipantDeviceModel.kt | 2 +- .../model/ConferenceParticipantModel.kt | 2 +- .../{ => conference}/view/GridBoxLayout.kt | 2 +- .../viewmodel/ConferenceViewModel.kt} | 32 +++++- .../ui/call/fragment/ActiveCallFragment.kt | 12 +- .../ui/call/viewmodel/CurrentCallViewModel.kt | 6 +- .../org/linphone/utils/DataBindingUtils.kt | 2 +- .../res/layout/assistant_landing_fragment.xml | 2 +- .../res/layout/assistant_login_fragment.xml | 2 +- .../call_active_conference_fragment.xml | 4 +- .../call_conference_active_speaker_cell.xml | 2 +- ...all_conference_active_speaker_fragment.xml | 4 +- .../call_conference_audio_only_cell.xml | 2 +- .../call_conference_audio_only_fragment.xml | 4 +- .../res/layout/call_conference_grid_cell.xml | 2 +- .../layout/call_conference_grid_fragment.xml | 6 +- .../call_conference_layout_bottom_sheet.xml | 10 +- .../call_conference_participant_list_cell.xml | 2 +- .../res/layout/chat_conversation_fragment.xml | 6 +- .../main/res/navigation/call_nav_graph.xml | 19 ++- .../res/navigation/conference_nav_graph.xml | 6 +- 30 files changed, 239 insertions(+), 66 deletions(-) rename app/src/main/java/org/linphone/ui/call/{ => conference}/fragment/ActiveConferenceCallFragment.kt (98%) rename app/src/main/java/org/linphone/ui/call/{ => conference}/fragment/ConferenceActiveSpeakerFragment.kt (92%) create mode 100644 app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAddParticipantsFragment.kt rename app/src/main/java/org/linphone/ui/call/{ => conference}/fragment/ConferenceAudioOnlyFragment.kt (92%) rename app/src/main/java/org/linphone/ui/call/{ => conference}/fragment/ConferenceGridFragment.kt (91%) rename app/src/main/java/org/linphone/ui/call/{ => conference}/fragment/ConferenceLayoutMenuDialogFragment.kt (87%) rename app/src/main/java/org/linphone/ui/call/{ => conference}/fragment/ConferenceParticipantsListFragment.kt (75%) rename app/src/main/java/org/linphone/ui/call/{ => conference}/model/ConferenceParticipantDeviceModel.kt (99%) rename app/src/main/java/org/linphone/ui/call/{ => conference}/model/ConferenceParticipantModel.kt (98%) rename app/src/main/java/org/linphone/ui/call/{ => conference}/view/GridBoxLayout.kt (99%) rename app/src/main/java/org/linphone/ui/call/{model/ConferenceModel.kt => conference/viewmodel/ConferenceViewModel.kt} (94%) diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index e436f810a..2b8d833b4 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -47,10 +47,10 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallActivityBinding import org.linphone.ui.GenericActivity +import org.linphone.ui.call.conference.fragment.ActiveConferenceCallFragmentDirections +import org.linphone.ui.call.conference.fragment.ConferenceLayoutMenuDialogFragment import org.linphone.ui.call.fragment.ActiveCallFragmentDirections -import org.linphone.ui.call.fragment.ActiveConferenceCallFragmentDirections import org.linphone.ui.call.fragment.AudioDevicesMenuDialogFragment -import org.linphone.ui.call.fragment.ConferenceLayoutMenuDialogFragment import org.linphone.ui.call.fragment.IncomingCallFragmentDirections import org.linphone.ui.call.fragment.OutgoingCallFragmentDirections import org.linphone.ui.call.model.AudioDeviceModel diff --git a/app/src/main/java/org/linphone/ui/call/adapter/ConferenceParticipantsListAdapter.kt b/app/src/main/java/org/linphone/ui/call/adapter/ConferenceParticipantsListAdapter.kt index 69b832887..f56514bba 100644 --- a/app/src/main/java/org/linphone/ui/call/adapter/ConferenceParticipantsListAdapter.kt +++ b/app/src/main/java/org/linphone/ui/call/adapter/ConferenceParticipantsListAdapter.kt @@ -29,7 +29,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.linphone.R import org.linphone.databinding.CallConferenceParticipantListCellBinding -import org.linphone.ui.call.model.ConferenceParticipantModel +import org.linphone.ui.call.conference.model.ConferenceParticipantModel class ConferenceParticipantsListAdapter : ListAdapter(ParticipantDiffCallback()) { diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveConferenceCallFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt similarity index 98% rename from app/src/main/java/org/linphone/ui/call/fragment/ActiveConferenceCallFragment.kt rename to app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt index 8999ee426..4e99cb21d 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveConferenceCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.fragment +package org.linphone.ui.call.conference.fragment import android.content.ClipData import android.content.ClipboardManager @@ -35,6 +35,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallActiveConferenceFragmentBinding +import org.linphone.ui.call.fragment.GenericCallFragment import org.linphone.ui.call.viewmodel.CallsViewModel import org.linphone.ui.call.viewmodel.CurrentCallViewModel import org.linphone.utils.Event diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceActiveSpeakerFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceActiveSpeakerFragment.kt similarity index 92% rename from app/src/main/java/org/linphone/ui/call/fragment/ConferenceActiveSpeakerFragment.kt rename to app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceActiveSpeakerFragment.kt index f494b20e7..7816f4a89 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceActiveSpeakerFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceActiveSpeakerFragment.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.fragment +package org.linphone.ui.call.conference.fragment import android.os.Bundle import android.view.LayoutInflater @@ -30,7 +30,8 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallConferenceActiveSpeakerFragmentBinding -import org.linphone.ui.call.model.ConferenceModel +import org.linphone.ui.call.conference.viewmodel.ConferenceViewModel +import org.linphone.ui.call.fragment.GenericCallFragment import org.linphone.ui.call.viewmodel.CurrentCallViewModel @UiThread class ConferenceActiveSpeakerFragment : GenericCallFragment() { @@ -64,7 +65,7 @@ class ConferenceActiveSpeakerFragment : GenericCallFragment() { callViewModel.conferenceModel.conferenceLayout.observe(viewLifecycleOwner) { when (it) { - ConferenceModel.GRID_LAYOUT -> { + ConferenceViewModel.GRID_LAYOUT -> { Log.i( "$TAG Conference layout changed to mosaic, navigating to matching fragment" ) @@ -74,7 +75,7 @@ class ConferenceActiveSpeakerFragment : GenericCallFragment() { ) } } - ConferenceModel.AUDIO_ONLY_LAYOUT -> { + ConferenceViewModel.AUDIO_ONLY_LAYOUT -> { Log.i( "$TAG Conference layout changed to audio only, navigating to matching fragment" ) diff --git a/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAddParticipantsFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAddParticipantsFragment.kt new file mode 100644 index 000000000..073f1e76a --- /dev/null +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAddParticipantsFragment.kt @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2010-2024 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.call.conference.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.UiThread +import androidx.core.view.doOnPreDraw +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.fragment.findNavController +import org.linphone.core.Address +import org.linphone.core.Friend +import org.linphone.core.tools.Log +import org.linphone.databinding.GenericAddParticipantsFragmentBinding +import org.linphone.ui.call.viewmodel.CurrentCallViewModel +import org.linphone.ui.main.fragment.GenericAddressPickerFragment +import org.linphone.ui.main.viewmodel.AddParticipantsViewModel + +@UiThread +class ConferenceAddParticipantsFragment : GenericAddressPickerFragment() { + companion object { + private const val TAG = "[Conference Add Participants Fragment]" + } + + private lateinit var binding: GenericAddParticipantsFragmentBinding + + override lateinit var viewModel: AddParticipantsViewModel + + private lateinit var callViewModel: CurrentCallViewModel + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = GenericAddParticipantsFragmentBinding.inflate(layoutInflater) + return binding.root + } + + override fun goBack(): Boolean { + return findNavController().popBackStack() + } + + override fun onSingleAddressSelected(address: Address, friend: Friend) { + Log.e("$TAG This shouldn't happen as we should always be in multiple selection mode here!") + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + viewModel = ViewModelProvider(this)[AddParticipantsViewModel::class.java] + + callViewModel = requireActivity().run { + ViewModelProvider(this)[CurrentCallViewModel::class.java] + } + + postponeEnterTransition() + super.onViewCreated(view, savedInstanceState) + + binding.lifecycleOwner = viewLifecycleOwner + + binding.viewModel = viewModel + + binding.setBackClickListener { + goBack() + } + + setupRecyclerView(binding.contactsList) + + viewModel.contactsAndSuggestionsList.observe( + viewLifecycleOwner + ) { + Log.i("$TAG Contacts & suggestions list is ready with [${it.size}] items") + adapter.submitList(it) + + attachAdapter() + + (view.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() + } + } + + viewModel.selectedSipUrisEvent.observe(viewLifecycleOwner) { + it.consume { list -> + Log.i("$TAG Trying to add participant(s) [${list.size}] to conference") + callViewModel.conferenceModel.inviteSipUrisIntoConference(list) + goBack() + } + } + } +} diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceAudioOnlyFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAudioOnlyFragment.kt similarity index 92% rename from app/src/main/java/org/linphone/ui/call/fragment/ConferenceAudioOnlyFragment.kt rename to app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAudioOnlyFragment.kt index 455dcf5a3..ba60fb21a 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceAudioOnlyFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceAudioOnlyFragment.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.fragment +package org.linphone.ui.call.conference.fragment import android.os.Bundle import android.view.LayoutInflater @@ -29,7 +29,8 @@ import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallConferenceAudioOnlyFragmentBinding -import org.linphone.ui.call.model.ConferenceModel +import org.linphone.ui.call.conference.viewmodel.ConferenceViewModel +import org.linphone.ui.call.fragment.GenericCallFragment import org.linphone.ui.call.viewmodel.CurrentCallViewModel @UiThread class ConferenceAudioOnlyFragment : GenericCallFragment() { @@ -63,7 +64,7 @@ class ConferenceAudioOnlyFragment : GenericCallFragment() { callViewModel.conferenceModel.conferenceLayout.observe(viewLifecycleOwner) { when (it) { - ConferenceModel.ACTIVE_SPEAKER_LAYOUT -> { + ConferenceViewModel.ACTIVE_SPEAKER_LAYOUT -> { Log.i( "$TAG Conference layout changed to active speaker, navigating to matching fragment" ) @@ -73,7 +74,7 @@ class ConferenceAudioOnlyFragment : GenericCallFragment() { ) } } - ConferenceModel.GRID_LAYOUT -> { + ConferenceViewModel.GRID_LAYOUT -> { Log.i( "$TAG Conference layout changed to mosaic, navigating to matching fragment" ) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceGridFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceGridFragment.kt similarity index 91% rename from app/src/main/java/org/linphone/ui/call/fragment/ConferenceGridFragment.kt rename to app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceGridFragment.kt index ee413e119..5c13f73d1 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceGridFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceGridFragment.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.fragment +package org.linphone.ui.call.conference.fragment import android.os.Bundle import android.view.LayoutInflater @@ -29,7 +29,8 @@ import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallConferenceGridFragmentBinding -import org.linphone.ui.call.model.ConferenceModel +import org.linphone.ui.call.conference.viewmodel.ConferenceViewModel +import org.linphone.ui.call.fragment.GenericCallFragment import org.linphone.ui.call.viewmodel.CurrentCallViewModel @UiThread class ConferenceGridFragment : GenericCallFragment() { @@ -63,7 +64,7 @@ class ConferenceGridFragment : GenericCallFragment() { callViewModel.conferenceModel.conferenceLayout.observe(viewLifecycleOwner) { when (it) { - ConferenceModel.ACTIVE_SPEAKER_LAYOUT -> { + ConferenceViewModel.ACTIVE_SPEAKER_LAYOUT -> { Log.i( "$TAG Conference layout changed to active speaker, navigating to matching fragment" ) @@ -73,7 +74,7 @@ class ConferenceGridFragment : GenericCallFragment() { ) } } - ConferenceModel.AUDIO_ONLY_LAYOUT -> { + ConferenceViewModel.AUDIO_ONLY_LAYOUT -> { Log.i( "$TAG Conference layout changed to audio only, navigating to matching fragment" ) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceLayoutMenuDialogFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceLayoutMenuDialogFragment.kt similarity index 87% rename from app/src/main/java/org/linphone/ui/call/fragment/ConferenceLayoutMenuDialogFragment.kt rename to app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceLayoutMenuDialogFragment.kt index 7ad9736fb..8950883af 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceLayoutMenuDialogFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceLayoutMenuDialogFragment.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.fragment +package org.linphone.ui.call.conference.fragment import android.app.Dialog import android.content.DialogInterface @@ -30,11 +30,11 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import org.linphone.databinding.CallConferenceLayoutBottomSheetBinding -import org.linphone.ui.call.model.ConferenceModel +import org.linphone.ui.call.conference.viewmodel.ConferenceViewModel @UiThread class ConferenceLayoutMenuDialogFragment( - val conferenceModel: ConferenceModel, + val conferenceModel: ConferenceViewModel, private val onDismiss: (() -> Unit)? = null ) : BottomSheetDialogFragment() { companion object { @@ -71,18 +71,18 @@ class ConferenceLayoutMenuDialogFragment( view.setGridClickListener { if (conferenceModel.participantDevices.value.orEmpty().size < 6) { - conferenceModel.changeLayout(ConferenceModel.GRID_LAYOUT) + conferenceModel.changeLayout(ConferenceViewModel.GRID_LAYOUT) dismiss() } else { // TODO: notify user } } view.setActiveSpeakerClickListener { - conferenceModel.changeLayout(ConferenceModel.ACTIVE_SPEAKER_LAYOUT) + conferenceModel.changeLayout(ConferenceViewModel.ACTIVE_SPEAKER_LAYOUT) dismiss() } view.setAudioOnlyClickListener { - conferenceModel.changeLayout(ConferenceModel.AUDIO_ONLY_LAYOUT) + conferenceModel.changeLayout(ConferenceViewModel.AUDIO_ONLY_LAYOUT) dismiss() } diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceParticipantsListFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt similarity index 75% rename from app/src/main/java/org/linphone/ui/call/fragment/ConferenceParticipantsListFragment.kt rename to app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt index 3ac825494..1b59ed6b7 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ConferenceParticipantsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ConferenceParticipantsListFragment.kt @@ -17,18 +17,22 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.fragment +package org.linphone.ui.call.conference.fragment import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.AnimationUtils import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager +import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallConferenceParticipantsListFragmentBinding import org.linphone.ui.call.adapter.ConferenceParticipantsListAdapter +import org.linphone.ui.call.fragment.GenericCallFragment import org.linphone.ui.call.viewmodel.CurrentCallViewModel class ConferenceParticipantsListFragment : GenericCallFragment() { @@ -42,6 +46,14 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { private lateinit var adapter: ConferenceParticipantsListAdapter + override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { + if (findNavController().currentDestination?.id == R.id.conferenceAddParticipantsFragment) { + // Holds fragment in place while new fragment slides over it + return AnimationUtils.loadAnimation(activity, R.anim.hold) + } + return super.onCreateAnimation(transit, enter, nextAnim) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -79,7 +91,11 @@ class ConferenceParticipantsListFragment : GenericCallFragment() { } binding.setAddParticipantsClickListener { - // TODO FIXME: display add participants fragment + if (findNavController().currentDestination?.id == R.id.conferenceParticipantsListFragment) { + val action = + ConferenceParticipantsListFragmentDirections.actionConferenceParticipantsListFragmentToConferenceAddParticipantsFragment() + findNavController().navigate(action) + } } viewModel.conferenceModel.participants.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/org/linphone/ui/call/model/ConferenceParticipantDeviceModel.kt b/app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantDeviceModel.kt similarity index 99% rename from app/src/main/java/org/linphone/ui/call/model/ConferenceParticipantDeviceModel.kt rename to app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantDeviceModel.kt index 079fb7b7a..91e55b118 100644 --- a/app/src/main/java/org/linphone/ui/call/model/ConferenceParticipantDeviceModel.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantDeviceModel.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.model +package org.linphone.ui.call.conference.model import android.view.TextureView import androidx.annotation.UiThread diff --git a/app/src/main/java/org/linphone/ui/call/model/ConferenceParticipantModel.kt b/app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantModel.kt similarity index 98% rename from app/src/main/java/org/linphone/ui/call/model/ConferenceParticipantModel.kt rename to app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantModel.kt index 119e9e47f..e5b311f9f 100644 --- a/app/src/main/java/org/linphone/ui/call/model/ConferenceParticipantModel.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/model/ConferenceParticipantModel.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.model +package org.linphone.ui.call.conference.model import androidx.annotation.UiThread import androidx.annotation.WorkerThread diff --git a/app/src/main/java/org/linphone/ui/call/view/GridBoxLayout.kt b/app/src/main/java/org/linphone/ui/call/conference/view/GridBoxLayout.kt similarity index 99% rename from app/src/main/java/org/linphone/ui/call/view/GridBoxLayout.kt rename to app/src/main/java/org/linphone/ui/call/conference/view/GridBoxLayout.kt index a36e482cf..2507c6d10 100644 --- a/app/src/main/java/org/linphone/ui/call/view/GridBoxLayout.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/view/GridBoxLayout.kt @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.view +package org.linphone.ui.call.conference.view import android.annotation.SuppressLint import android.content.Context diff --git a/app/src/main/java/org/linphone/ui/call/model/ConferenceModel.kt b/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt similarity index 94% rename from app/src/main/java/org/linphone/ui/call/model/ConferenceModel.kt rename to app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt index 682c87542..632ec7f83 100644 --- a/app/src/main/java/org/linphone/ui/call/model/ConferenceModel.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/viewmodel/ConferenceViewModel.kt @@ -17,13 +17,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.ui.call.model +package org.linphone.ui.call.conference.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R +import org.linphone.core.Address import org.linphone.core.Call import org.linphone.core.Conference import org.linphone.core.ConferenceListenerStub @@ -32,11 +33,13 @@ import org.linphone.core.Participant import org.linphone.core.ParticipantDevice import org.linphone.core.StreamType import org.linphone.core.tools.Log -import org.linphone.ui.call.view.GridBoxLayout +import org.linphone.ui.call.conference.model.ConferenceParticipantDeviceModel +import org.linphone.ui.call.conference.model.ConferenceParticipantModel +import org.linphone.ui.call.conference.view.GridBoxLayout import org.linphone.utils.AppUtils import org.linphone.utils.Event -class ConferenceModel { +class ConferenceViewModel { companion object { private const val TAG = "[Conference ViewModel]" @@ -259,6 +262,29 @@ class ConferenceModel { } } + @UiThread + fun inviteSipUrisIntoConference(uris: List) { + coreContext.postOnCoreThread { core -> + val addresses = arrayListOf
() + for (uri in uris) { + val address = core.interpretUrl(uri, false) + if (address != null) { + addresses.add(address) + Log.i("$TAG Address [${address.asStringUriOnly()}] will be added to conference") + } else { + Log.e( + "$TAG Failed to parse SIP URI [$uri] into address, can't add it to the conference!" + ) + // TODO: notify user + } + } + val addressesArray = arrayOfNulls
(addresses.size) + addresses.toArray(addressesArray) + Log.i("$TAG Trying to add [${addressesArray.size}] new participant(s) into conference") + conference.addParticipants(addressesArray) + } + } + @WorkerThread fun setNewLayout(newLayout: Int) { val call = conference.call diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt index f992ee69d..c2a72c9aa 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt @@ -124,11 +124,15 @@ class ActiveCallFragment : GenericCallFragment() { } override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { - if (findNavController().currentDestination?.id == R.id.newCallFragment || findNavController().currentDestination?.id == R.id.callsListFragment) { - // Holds fragment in place while new fragment slides over it - return AnimationUtils.loadAnimation(activity, R.anim.hold) + return when (findNavController().currentDestination?.id) { + R.id.newCallFragment, R.id.callsListFragment, R.id.transferCallFragment, R.id.inCallConversationFragment -> { + // Holds fragment in place while new fragment slides over it + AnimationUtils.loadAnimation(activity, R.anim.hold) + } + else -> { + super.onCreateAnimation(transit, enter, nextAnim) + } } - return super.onCreateAnimation(transit, enter, nextAnim) } override fun onCreateView( 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 8892964cb..7baf5b2af 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 @@ -51,10 +51,10 @@ import org.linphone.core.MediaEncryption import org.linphone.core.SecurityLevel import org.linphone.core.StreamType import org.linphone.core.tools.Log +import org.linphone.ui.call.conference.viewmodel.ConferenceViewModel import org.linphone.ui.call.model.AudioDeviceModel import org.linphone.ui.call.model.CallMediaEncryptionModel import org.linphone.ui.call.model.CallStatsModel -import org.linphone.ui.call.model.ConferenceModel import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.ui.main.history.model.NumpadModel import org.linphone.ui.main.model.isInSecureMode @@ -173,7 +173,7 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { // Conference - val conferenceModel = ConferenceModel() + val conferenceModel = ConferenceViewModel() val goToConferenceEvent: MutableLiveData> by lazy { MutableLiveData>() @@ -592,7 +592,7 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { Log.i("$TAG Conference found and video disabled in params, enabling it") params.isVideoEnabled = true params.videoDirection = MediaDirection.SendRecv - conferenceModel.setNewLayout(ConferenceModel.ACTIVE_SPEAKER_LAYOUT) + conferenceModel.setNewLayout(ConferenceViewModel.ACTIVE_SPEAKER_LAYOUT) } else { if (params?.videoDirection == MediaDirection.SendRecv || params?.videoDirection == MediaDirection.SendOnly) { Log.i( diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 49cdf1ec9..403127a55 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -62,7 +62,7 @@ import org.linphone.contacts.AbstractAvatarModel import org.linphone.contacts.AvatarGenerator import org.linphone.core.ConsolidatedPresence import org.linphone.core.tools.Log -import org.linphone.ui.call.model.ConferenceParticipantDeviceModel +import org.linphone.ui.call.conference.model.ConferenceParticipantDeviceModel /** * This file contains all the data binding necessary for the app diff --git a/app/src/main/res/layout/assistant_landing_fragment.xml b/app/src/main/res/layout/assistant_landing_fragment.xml index 39c719f89..53579e662 100644 --- a/app/src/main/res/layout/assistant_landing_fragment.xml +++ b/app/src/main/res/layout/assistant_landing_fragment.xml @@ -98,7 +98,7 @@ android:textSize="14sp" android:textColor="?attr/color_main2_600" android:background="@drawable/edit_text_background" - android:inputType="text" + android:inputType="text|textNoSuggestions" android:hint="@string/sip_address_hint" app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintTop_toBottomOf="@id/sip_identity_label" diff --git a/app/src/main/res/layout/assistant_login_fragment.xml b/app/src/main/res/layout/assistant_login_fragment.xml index 26e78bdc3..d4bb790eb 100644 --- a/app/src/main/res/layout/assistant_login_fragment.xml +++ b/app/src/main/res/layout/assistant_login_fragment.xml @@ -88,7 +88,7 @@ android:textSize="14sp" android:textColor="?attr/color_main2_600" android:background="@drawable/edit_text_background" - android:inputType="text" + android:inputType="text|textNoSuggestions" android:hint="@string/sip_address_hint" app:layout_constraintWidth_max="@dimen/text_input_max_width" app:layout_constraintTop_toBottomOf="@id/sip_identity_label" diff --git a/app/src/main/res/layout/call_active_conference_fragment.xml b/app/src/main/res/layout/call_active_conference_fragment.xml index 3b1274d0c..2b4066ff8 100644 --- a/app/src/main/res/layout/call_active_conference_fragment.xml +++ b/app/src/main/res/layout/call_active_conference_fragment.xml @@ -5,7 +5,7 @@ - + @@ -29,7 +29,7 @@ type="org.linphone.ui.call.viewmodel.CurrentCallViewModel" /> + type="org.linphone.ui.call.conference.viewmodel.ConferenceViewModel" /> diff --git a/app/src/main/res/layout/call_conference_active_speaker_cell.xml b/app/src/main/res/layout/call_conference_active_speaker_cell.xml index e35120d99..f79c8fef4 100644 --- a/app/src/main/res/layout/call_conference_active_speaker_cell.xml +++ b/app/src/main/res/layout/call_conference_active_speaker_cell.xml @@ -7,7 +7,7 @@ + type="org.linphone.ui.call.conference.model.ConferenceParticipantDeviceModel" /> - + + type="org.linphone.ui.call.conference.viewmodel.ConferenceViewModel" /> + type="org.linphone.ui.call.conference.model.ConferenceParticipantDeviceModel" /> - + + type="org.linphone.ui.call.conference.viewmodel.ConferenceViewModel" /> + type="org.linphone.ui.call.conference.model.ConferenceParticipantDeviceModel" /> - + + type="org.linphone.ui.call.conference.viewmodel.ConferenceViewModel" /> - - + @@ -16,7 +16,7 @@ type="View.OnClickListener" /> + type="org.linphone.ui.call.conference.viewmodel.ConferenceViewModel" /> @@ -56,7 +56,7 @@ android:layout_marginBottom="1dp" android:drawableEnd="@drawable/picture_in_picture" android:drawableTint="@color/white" - android:checked="@{viewModel.conferenceLayout == ConferenceModel.ACTIVE_SPEAKER_LAYOUT}" + android:checked="@{viewModel.conferenceLayout == ConferenceViewModel.ACTIVE_SPEAKER_LAYOUT}" app:useMaterialThemeColors="false" app:buttonTint="@color/white"/> @@ -73,7 +73,7 @@ android:layout_marginBottom="1dp" android:drawableEnd="@drawable/waveform" android:drawableTint="@color/white" - android:checked="@{viewModel.conferenceLayout == ConferenceModel.AUDIO_ONLY_LAYOUT}" + android:checked="@{viewModel.conferenceLayout == ConferenceViewModel.AUDIO_ONLY_LAYOUT}" app:useMaterialThemeColors="false" app:buttonTint="@color/white"/> diff --git a/app/src/main/res/layout/call_conference_participant_list_cell.xml b/app/src/main/res/layout/call_conference_participant_list_cell.xml index d53d9a32e..9662d0e56 100644 --- a/app/src/main/res/layout/call_conference_participant_list_cell.xml +++ b/app/src/main/res/layout/call_conference_participant_list_cell.xml @@ -13,7 +13,7 @@ type="View.OnLongClickListener" /> + type="org.linphone.ui.call.conference.model.ConferenceParticipantModel" /> + app:layout_constraintTop_toTopOf="@id/scroll_to_bottom" + app:layout_constraintStart_toEndOf="@id/scroll_to_bottom"/> diff --git a/app/src/main/res/navigation/call_nav_graph.xml b/app/src/main/res/navigation/call_nav_graph.xml index 1bc392934..6832aa57a 100644 --- a/app/src/main/res/navigation/call_nav_graph.xml +++ b/app/src/main/res/navigation/call_nav_graph.xml @@ -130,7 +130,7 @@ + tools:layout="@layout/call_conference_participants_list_fragment"> + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/conference_nav_graph.xml b/app/src/main/res/navigation/conference_nav_graph.xml index f7a5bd7d1..2e53a984d 100644 --- a/app/src/main/res/navigation/conference_nav_graph.xml +++ b/app/src/main/res/navigation/conference_nav_graph.xml @@ -7,7 +7,7 @@