diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt index 948fe4b67..7f9099f81 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt @@ -110,7 +110,6 @@ class ConversationsListViewModel @UiThread constructor() : AbstractTopBarViewMod val list = arrayListOf() var count = 0 - // TODO? : Add support for chat rooms in magic search val account = LinphoneUtils.getDefaultAccount() val chatRooms = account?.chatRooms ?: coreContext.core.chatRooms for (chatRoom in chatRooms) { diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt index 59574aeab..3a2abad02 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt @@ -144,6 +144,7 @@ class ContactsListViewModel @UiThread constructor() : AbstractTopBarViewModel() val list = arrayListOf() val favouritesList = arrayListOf() var previousLetter = "" + var count = 0 for (result in results) { val friend = result.friend @@ -167,9 +168,16 @@ class ContactsListViewModel @UiThread constructor() : AbstractTopBarViewModel() model.firstContactStartingByThatLetter.postValue(displayLetter) list.add(model) + count += 1 + if (friend?.starred == true) { favouritesList.add(model) } + + if (count == 20) { + contactsList.postValue(list) + fetchInProgress.postValue(false) + } } favourites.postValue(favouritesList) diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt index d550be022..88432c833 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt @@ -23,16 +23,22 @@ import android.content.ActivityNotFoundException import android.content.Intent import android.os.Bundle import android.provider.CalendarContract +import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.PopupWindow import androidx.annotation.UiThread import androidx.core.view.doOnPreDraw +import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs +import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.MeetingFragmentBinding +import org.linphone.databinding.MeetingPopupMenuBinding +import org.linphone.ui.main.MainActivity import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.meetings.viewmodel.MeetingViewModel import org.linphone.utils.Event @@ -114,6 +120,10 @@ class MeetingFragment : GenericFragment() { } } + binding.setMenuClickListener { + showPopupMenu() + } + sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { slideable -> viewModel.showBackButton.value = slideable } @@ -133,5 +143,41 @@ class MeetingFragment : GenericFragment() { } } } + + viewModel.conferenceInfoDeletedEvent.observe(viewLifecycleOwner) { + it.consume { + Log.i("$TAG Meeting info has been deleted successfully") + (requireActivity() as MainActivity).showGreenToast( + getString(R.string.meeting_info_deleted_toast), + R.drawable.trash_simple + ) + sharedViewModel.forceRefreshMeetingsListEvent.value = Event(true) + goBack() + } + } + } + + private fun showPopupMenu() { + val popupView: MeetingPopupMenuBinding = DataBindingUtil.inflate( + LayoutInflater.from(requireContext()), + R.layout.meeting_popup_menu, + null, + false + ) + val popupWindow = PopupWindow( + popupView.root, + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + true + ) + + popupView.setDeleteClickListener { + viewModel.delete() + popupWindow.dismiss() + } + + // Elevation is for showing a shadow around the popup + popupWindow.elevation = 20f + popupWindow.showAsDropDown(binding.menu, 0, 0, Gravity.BOTTOM) } } 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 942ca4fbf..ce50cd9a9 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 @@ -107,6 +107,13 @@ class MeetingsListFragment : AbstractTopBarFragment() { } } + sharedViewModel.forceRefreshMeetingsListEvent.observe(viewLifecycleOwner) { + it.consume { + Log.i("$TAG We were asked to refresh the meetings list, doing it now") + listViewModel.applyFilter() + } + } + sharedViewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { it.consume { Log.i( diff --git a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingViewModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingViewModel.kt index e6013706f..d3a7f84dc 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingViewModel.kt @@ -66,6 +66,10 @@ class MeetingViewModel @UiThread constructor() : ViewModel() { val startTimeStamp = MutableLiveData() val endTimeStamp = MutableLiveData() + val conferenceInfoDeletedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private lateinit var conferenceInfo: ConferenceInfo init { @@ -104,6 +108,17 @@ class MeetingViewModel @UiThread constructor() : ViewModel() { // TODO } + @UiThread + fun delete() { + coreContext.postOnCoreThread { core -> + if (::conferenceInfo.isInitialized) { + Log.i("$TAG Deleting conference information [$conferenceInfo]") + core.deleteConferenceInformation(conferenceInfo) + conferenceInfoDeletedEvent.postValue(Event(true)) + } + } + } + @WorkerThread private fun configureConferenceInfo() { if (::conferenceInfo.isInitialized) { 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 8654d1b60..d34c7d52c 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 @@ -118,4 +118,8 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { val showMeetingEvent: MutableLiveData> by lazy { MutableLiveData>() } + + val forceRefreshMeetingsListEvent: MutableLiveData> by lazy { + MutableLiveData>() + } } diff --git a/app/src/main/res/layout-land/chat_list_fragment.xml b/app/src/main/res/layout-land/chat_list_fragment.xml index 7d9c766b7..3aca8752e 100644 --- a/app/src/main/res/layout-land/chat_list_fragment.xml +++ b/app/src/main/res/layout-land/chat_list_fragment.xml @@ -113,9 +113,9 @@ - + bind:visibility="@{viewModel.fetchInProgress}" />--> diff --git a/app/src/main/res/layout-land/contacts_list_fragment.xml b/app/src/main/res/layout-land/contacts_list_fragment.xml index 896843d6b..403b1fbae 100644 --- a/app/src/main/res/layout-land/contacts_list_fragment.xml +++ b/app/src/main/res/layout-land/contacts_list_fragment.xml @@ -167,9 +167,9 @@ - + bind:visibility="@{viewModel.fetchInProgress}" />--> 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 78857e34d..eefe9f355 100644 --- a/app/src/main/res/layout-land/meetings_list_fragment.xml +++ b/app/src/main/res/layout-land/meetings_list_fragment.xml @@ -128,9 +128,9 @@ - + bind:visibility="@{viewModel.fetchInProgress}" />--> diff --git a/app/src/main/res/layout/chat_list_fragment.xml b/app/src/main/res/layout/chat_list_fragment.xml index 0aa141aed..b88f77813 100644 --- a/app/src/main/res/layout/chat_list_fragment.xml +++ b/app/src/main/res/layout/chat_list_fragment.xml @@ -113,9 +113,9 @@ - + bind:visibility="@{viewModel.fetchInProgress}" />--> diff --git a/app/src/main/res/layout/contacts_list_fragment.xml b/app/src/main/res/layout/contacts_list_fragment.xml index 05bc5a2d9..276f9b827 100644 --- a/app/src/main/res/layout/contacts_list_fragment.xml +++ b/app/src/main/res/layout/contacts_list_fragment.xml @@ -169,9 +169,9 @@ - + bind:visibility="@{viewModel.fetchInProgress}" />--> diff --git a/app/src/main/res/layout/history_list_fragment.xml b/app/src/main/res/layout/history_list_fragment.xml index b47aea629..e21584282 100644 --- a/app/src/main/res/layout/history_list_fragment.xml +++ b/app/src/main/res/layout/history_list_fragment.xml @@ -131,9 +131,9 @@ - + bind:visibility="@{viewModel.fetchInProgress}" />--> diff --git a/app/src/main/res/layout/meeting_fragment.xml b/app/src/main/res/layout/meeting_fragment.xml index 6892adb61..fa33159e0 100644 --- a/app/src/main/res/layout/meeting_fragment.xml +++ b/app/src/main/res/layout/meeting_fragment.xml @@ -7,6 +7,9 @@ + @@ -60,6 +63,7 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/meetings_list_fragment.xml b/app/src/main/res/layout/meetings_list_fragment.xml index 0ee610894..5b63cf251 100644 --- a/app/src/main/res/layout/meetings_list_fragment.xml +++ b/app/src/main/res/layout/meetings_list_fragment.xml @@ -128,9 +128,9 @@ - + bind:visibility="@{viewModel.fetchInProgress}" />--> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 10ea19b21..7a60275f8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -350,6 +350,8 @@ Send invitation to participants Join the meeting now Organizer + Delete meeting + Meeting has been deleted Operation in progress, please wait