From d58e5f9fc29716e0bb0a913d1f566aa966575552 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 25 Sep 2023 15:08:41 +0200 Subject: [PATCH] Added contacts list filter popup menu --- .../java/org/linphone/core/CoreContext.kt | 1 - .../ui/call/viewmodel/CurrentCallViewModel.kt | 8 +- .../contacts/fragment/ContactsListFragment.kt | 42 ++++++++- .../viewmodel/ContactsListViewModel.kt | 8 +- .../contacts_list_filter_popup_menu.xml | 89 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/layout/contacts_list_filter_popup_menu.xml diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 790606bca..056fe30d9 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -33,7 +33,6 @@ import androidx.emoji2.text.EmojiCompat import androidx.lifecycle.MutableLiveData import java.util.* import org.linphone.BuildConfig -import org.linphone.LinphoneApplication import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.contacts.ContactsManager import org.linphone.core.tools.Log 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 40b1e145b..51e56e5c0 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 @@ -265,10 +265,14 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { // TODO FIXME: Remote is call being transferred, not transferee ! if (state == Call.State.OutgoingProgress) { - val displayName = coreContext.contactsManager.findDisplayName(transfered.remoteAddress) + val displayName = coreContext.contactsManager.findDisplayName( + transfered.remoteAddress + ) transferInProgressEvent.postValue(Event(displayName)) } else if (LinphoneUtils.isCallEnding(state)) { - val displayName = coreContext.contactsManager.findDisplayName(transfered.remoteAddress) + val displayName = coreContext.contactsManager.findDisplayName( + transfered.remoteAddress + ) transferFailedEvent.postValue(Event(displayName)) } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt index d2420f61e..ccad67dd0 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt @@ -22,18 +22,22 @@ package org.linphone.ui.main.contacts.fragment import android.content.Intent import android.os.Bundle import android.provider.ContactsContract +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.content.FileProvider import androidx.core.view.doOnPreDraw +import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import java.io.File import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log +import org.linphone.databinding.ContactsListFilterPopupMenuBinding import org.linphone.databinding.ContactsListFragmentBinding import org.linphone.ui.main.contacts.adapter.ContactsListAdapter import org.linphone.ui.main.contacts.viewmodel.ContactsListViewModel @@ -133,8 +137,7 @@ class ContactsListFragment : AbstractTopBarFragment() { } binding.setFilterClickListener { - // TODO FIXME: show context menu first to let user decides which filter to use - listViewModel.toggleContactsFilter() + showFilterPopupMenu(binding.filter) } sharedViewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { @@ -230,4 +233,39 @@ class ContactsListFragment : AbstractTopBarFragment() { val shareIntent = Intent.createChooser(sendIntent, null) startActivity(shareIntent) } + + private fun showFilterPopupMenu(view: View) { + val popupView: ContactsListFilterPopupMenuBinding = DataBindingUtil.inflate( + LayoutInflater.from(requireContext()), + R.layout.contacts_list_filter_popup_menu, + null, + false + ) + popupView.seeAllSelected = listViewModel.areAllContactsDisplayed() + + val popupWindow = PopupWindow( + popupView.root, + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + true + ) + + popupView.setNoFilterClickListener { + if (!listViewModel.areAllContactsDisplayed()) { + listViewModel.changeContactsFilter(onlyLinphoneContacts = false) + } + popupWindow.dismiss() + } + + popupView.setLinphoneOnlyClickListener { + if (listViewModel.areAllContactsDisplayed()) { + listViewModel.changeContactsFilter(onlyLinphoneContacts = true) + } + popupWindow.dismiss() + } + + // Elevation is for showing a shadow around the popup + popupWindow.elevation = 20f + popupWindow.showAsDropDown(view, 0, 0, Gravity.BOTTOM) + } } 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 28c9c628e..62b7f010a 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 @@ -120,11 +120,15 @@ class ContactsListViewModel @UiThread constructor() : AbstractTopBarViewModel() } @UiThread - fun toggleContactsFilter() { - limitSearchToLinphoneAccounts = !limitSearchToLinphoneAccounts + fun changeContactsFilter(onlyLinphoneContacts: Boolean) { + limitSearchToLinphoneAccounts = onlyLinphoneContacts applyFilter(currentFilter) } + fun areAllContactsDisplayed(): Boolean { + return !limitSearchToLinphoneAccounts + } + @UiThread fun toggleFavouritesVisibility() { showFavourites.value = showFavourites.value == false diff --git a/app/src/main/res/layout/contacts_list_filter_popup_menu.xml b/app/src/main/res/layout/contacts_list_filter_popup_menu.xml new file mode 100644 index 000000000..88f061660 --- /dev/null +++ b/app/src/main/res/layout/contacts_list_filter_popup_menu.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f038f8777..35e55c7b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -243,6 +243,8 @@ No contact for the moment… Favourites All contacts + See all + See &appName; contacts New contact Edit contact