From 60965b767c91c41ff54da7daa87cb685d85f6f52 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 22 Aug 2023 16:20:26 +0200 Subject: [PATCH] Added missing add / go to contact action from calls list context menu + added logs --- .../ui/main/calls/fragment/CallFragment.kt | 1 - .../main/calls/fragment/CallsListFragment.kt | 56 +++++++++++++++---- .../fragment/CallsListMenuDialogFragment.kt | 13 ++++- .../contacts/fragment/ContactsFragment.kt | 6 ++ .../contacts/fragment/ContactsListFragment.kt | 54 +++++++++++------- .../contacts/fragment/NewContactFragment.kt | 4 ++ .../ui/main/viewmodel/SharedMainViewModel.kt | 2 + app/src/main/res/layout/call_popup_menu.xml | 2 +- .../res/layout/calls_list_long_press_menu.xml | 28 +++++++++- 9 files changed, 129 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt index 156547ee3..854ecb03f 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallFragment.kt @@ -138,7 +138,6 @@ class CallFragment : GenericFragment() { popupView.contactExists = viewModel.callLogModel.value?.friendExists == true popupView.setAddToContactsListener { - // TODO: go to new contact fragment sharedViewModel.sipAddressToAddToNewContact = viewModel.callLogModel.value?.displayedAddress.orEmpty() sharedViewModel.navigateToContactsEvent.value = Event(true) sharedViewModel.showNewContactEvent.value = Event(true) diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListFragment.kt index e9c88a481..dd20acb55 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListFragment.kt @@ -38,6 +38,7 @@ import androidx.navigation.navGraphViewModels import androidx.recyclerview.widget.LinearLayoutManager import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R +import org.linphone.core.tools.Log import org.linphone.databinding.CallsListFragmentBinding import org.linphone.databinding.CallsListPopupMenuBinding import org.linphone.ui.main.MainActivity @@ -50,6 +51,9 @@ import org.linphone.utils.Event @UiThread class CallsListFragment : GenericFragment() { + companion object { + const val TAG = "[Calls List Fragment]" + } private lateinit var binding: CallsListFragmentBinding @@ -89,17 +93,45 @@ class CallsListFragment : GenericFragment() { adapter.callLogLongClickedEvent.observe(viewLifecycleOwner) { it.consume { model -> - val modalBottomSheet = CallsListMenuDialogFragment({ - // onDismiss - adapter.resetSelection() - }, { - // onCopyNumberOrAddressToClipboard - copyNumberOrAddressToClipboard(model.displayedAddress) - }, { - // onDeleteCallLog - model.delete() - adapter.deleteSelection() - }) + val modalBottomSheet = CallsListMenuDialogFragment( + model.friendExists, + { // onDismiss + adapter.resetSelection() + }, + { // onAddToContact + val addressToAdd = model.displayedAddress + Log.i( + "$TAG Navigating to new contact with pre-filled value [$addressToAdd]" + ) + + sharedViewModel.sipAddressToAddToNewContact = addressToAdd + sharedViewModel.navigateToContactsEvent.value = Event(true) + sharedViewModel.showNewContactEvent.value = Event(true) + }, + { // onGoToContact + val friendRefKey = model.friendRefKey + if (!friendRefKey.isNullOrEmpty()) { + Log.i("$TAG Navigating to contact with ref key [$friendRefKey]") + + sharedViewModel.navigateToContactsEvent.value = Event(true) + sharedViewModel.showContactEvent.value = Event(friendRefKey) + } else { + Log.w( + "$TAG Can't navigate to existing friend, ref key is null or empty" + ) + } + }, + { // onCopyNumberOrAddressToClipboard + val addressToCopy = model.displayedAddress + Log.i("$TAG Copying number [$addressToCopy] to clipboard") + copyNumberOrAddressToClipboard(addressToCopy) + }, + { // onDeleteCallLog + Log.i("$TAG Deleting call log with ref key or call ID [${model.id}]") + model.delete() + adapter.deleteSelection() + } + ) modalBottomSheet.show(parentFragmentManager, CallsListMenuDialogFragment.TAG) } } @@ -113,6 +145,7 @@ class CallsListFragment : GenericFragment() { adapter.callLogCallBackClickedEvent.observe(viewLifecycleOwner) { it.consume { model -> coreContext.postOnCoreThread { + Log.i("$TAG Starting call to [${model.address.asStringUriOnly()}]") coreContext.startCall(model.address) } } @@ -200,6 +233,7 @@ class CallsListFragment : GenericFragment() { model.confirmRemovalEvent.observe(viewLifecycleOwner) { it.consume { + Log.w("$TAG Removing all call entries from database") listViewModel.removeAllCallLogs() dialog.dismiss() } diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListMenuDialogFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListMenuDialogFragment.kt index 60de06cc0..7c2bd56a8 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListMenuDialogFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/CallsListMenuDialogFragment.kt @@ -30,7 +30,10 @@ import org.linphone.databinding.CallsListLongPressMenuBinding @UiThread class CallsListMenuDialogFragment( + private val contactExists: Boolean, private val onDismiss: (() -> Unit)? = null, + private val onAddToContact: (() -> Unit)? = null, + private val onGoToContact: (() -> Unit)? = null, private val onCopyNumberOrAddressToClipboard: (() -> Unit)? = null, private val onDeleteCallLog: (() -> Unit)? = null ) : BottomSheetDialogFragment() { @@ -54,6 +57,7 @@ class CallsListMenuDialogFragment( savedInstanceState: Bundle? ): View { val view = CallsListLongPressMenuBinding.inflate(layoutInflater) + view.contactExists = contactExists view.setCopyNumberClickListener { onCopyNumberOrAddressToClipboard?.invoke() @@ -65,8 +69,13 @@ class CallsListMenuDialogFragment( dismiss() } - view.setNewContactClickListener { - // TODO + view.setAddToContactsListener { + onAddToContact?.invoke() + dismiss() + } + + view.setGoToContactClickListener { + onGoToContact?.invoke() dismiss() } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsFragment.kt index 08f18f90d..448d0c140 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsFragment.kt @@ -60,6 +60,12 @@ class ContactsFragment : GenericFragment() { } } + sharedViewModel.contactEditorReadyToBeDisplayedEvent.observe(viewLifecycleOwner) { + it.consume { + startPostponedEnterTransition() + } + } + binding.root.doOnPreDraw { val slidingPane = binding.slidingPaneLayout slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED 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 ba87be4cc..5db063867 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 @@ -32,6 +32,7 @@ import androidx.navigation.navGraphViewModels import androidx.recyclerview.widget.LinearLayoutManager import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R +import org.linphone.core.tools.Log import org.linphone.databinding.ContactsListFragmentBinding import org.linphone.ui.main.contacts.adapter.ContactsListAdapter import org.linphone.ui.main.contacts.viewmodel.ContactsListViewModel @@ -40,6 +41,10 @@ import org.linphone.utils.Event @UiThread class ContactsListFragment : GenericFragment() { + companion object { + const val TAG = "[Contacts List Fragment]" + } + private lateinit var binding: ContactsListFragmentBinding private val listViewModel: ContactsListViewModel by navGraphViewModels( @@ -95,6 +100,7 @@ class ContactsListFragment : GenericFragment() { viewLifecycleOwner ) { adapter.submitList(it) + Log.i("$TAG Contacts list is ready with [${it.size}] items") (view.parent as? ViewGroup)?.doOnPreDraw { startPostponedEnterTransition() @@ -106,6 +112,7 @@ class ContactsListFragment : GenericFragment() { viewLifecycleOwner ) { favouritesAdapter.submitList(it) + Log.i("$TAG Favourites contacts list is ready with [${it.size}] items") } sharedViewModel.searchFilter.observe(viewLifecycleOwner) { @@ -122,26 +129,35 @@ class ContactsListFragment : GenericFragment() { private fun configureAdapter(adapter: ContactsListAdapter) { adapter.contactLongClickedEvent.observe(viewLifecycleOwner) { it.consume { model -> - val modalBottomSheet = ContactsListMenuDialogFragment(model.friend.starred, { - adapter.resetSelection() - }, { - // onFavourite - coreContext.postOnCoreThread { - model.friend.edit() - model.friend.starred = !model.friend.starred - model.friend.done() - coreContext.contactsManager.notifyContactsListChanged() + val modalBottomSheet = ContactsListMenuDialogFragment( + model.friend.starred, + { // ondDismiss + adapter.resetSelection() + }, + { // onFavourite + coreContext.postOnCoreThread { + model.friend.edit() + val starred = !model.friend.starred + Log.i( + "$TAG Friend [${model.name.value}] will be ${if (starred) "added" else "removed"} from favourites" + ) + model.friend.starred = starred + model.friend.done() + coreContext.contactsManager.notifyContactsListChanged() + } + }, + { // onShare + Log.i("$TAG Sharing friend [${model.name.value}]") + // TODO + }, + { // onDelete + coreContext.postOnCoreThread { + Log.w("$TAG Removing friend [${model.name.value}]") + model.friend.remove() + coreContext.contactsManager.notifyContactsListChanged() + } } - }, { - // onShare - // TODO - }, { - // onDelete - coreContext.postOnCoreThread { - model.friend.remove() - coreContext.contactsManager.notifyContactsListChanged() - } - }) + ) modalBottomSheet.show(parentFragmentManager, ContactsListMenuDialogFragment.TAG) } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt index 69245e7e9..828b05a7e 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt @@ -101,7 +101,9 @@ class NewContactFragment : GenericFragment() { val addressToAdd = sharedViewModel.sipAddressToAddToNewContact if (addressToAdd.isNotEmpty()) { + Log.i("$TAG Pre-filling new contact form with SIP address [$addressToAdd]") sharedViewModel.sipAddressToAddToNewContact = "" + coreContext.postOnCoreThread { viewModel.addSipAddress(addressToAdd) } @@ -169,6 +171,8 @@ class NewContactFragment : GenericFragment() { removeCell(model) } } + + sharedViewModel.contactEditorReadyToBeDisplayedEvent.value = Event(true) } private fun addCell(model: NewOrEditNumberOrAddressModel) { 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 e8fa7cee9..a4e9d8216 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 @@ -61,6 +61,8 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { val contactsListReadyToBeDisplayedEvent = MutableLiveData>() + val contactEditorReadyToBeDisplayedEvent = MutableLiveData>() + val showContactEvent: MutableLiveData> by lazy { MutableLiveData>() } diff --git a/app/src/main/res/layout/call_popup_menu.xml b/app/src/main/res/layout/call_popup_menu.xml index 9d6c12d30..19e40480d 100644 --- a/app/src/main/res/layout/call_popup_menu.xml +++ b/app/src/main/res/layout/call_popup_menu.xml @@ -39,7 +39,7 @@ android:layout_marginStart="20dp" android:layout_marginEnd="20dp" android:gravity="left|center_vertical" - android:text="Ajouter aux contats" + android:text="Ajouter aux contacts" android:textSize="14sp" android:textColor="@color/gray_1" android:drawableStart="@drawable/add" diff --git a/app/src/main/res/layout/calls_list_long_press_menu.xml b/app/src/main/res/layout/calls_list_long_press_menu.xml index 50bb68ce1..db4c38c8c 100644 --- a/app/src/main/res/layout/calls_list_long_press_menu.xml +++ b/app/src/main/res/layout/calls_list_long_press_menu.xml @@ -5,7 +5,10 @@ + + + +