From 68f2535072b82a349d5e089af2a8b38e0963b88e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 6 May 2024 10:34:29 +0200 Subject: [PATCH] Added confirmation dialog before removing contact from list --- .../org/linphone/contacts/ContactsManager.kt | 2 +- .../model/ZrtpSasConfirmationDialogModel.kt | 2 +- .../main/contacts/fragment/ContactFragment.kt | 1 + .../contacts/fragment/ContactsListFragment.kt | 47 ++++++++++++------- .../viewmodel/ContactsListViewModel.kt | 25 ++++++++++ .../viewmodel/MediaViewModel.kt | 2 +- .../ui/main/fragment/DrawerMenuFragment.kt | 7 +-- 7 files changed, 60 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.kt b/app/src/main/java/org/linphone/contacts/ContactsManager.kt index b1c79e61a..a81785d09 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.kt @@ -347,7 +347,7 @@ class ContactsManager @UiThread constructor() { fakeFriend.name = LinphoneUtils.getDisplayName(localAccount.params.identityAddress) fakeFriend.photo = localAccount.params.pictureUri val model = ContactAvatarModel(fakeFriend) - model.trust.postValue(SecurityLevel.EndToEndEncryptedAndVerified) // TODO CHECK: as it is ourselves, force encrypted level? + model.trust.postValue(SecurityLevel.EndToEndEncryptedAndVerified) unknownContactsAvatarsMap[key] = model model } else { diff --git a/app/src/main/java/org/linphone/ui/call/model/ZrtpSasConfirmationDialogModel.kt b/app/src/main/java/org/linphone/ui/call/model/ZrtpSasConfirmationDialogModel.kt index fffae9745..e6043d9fb 100644 --- a/app/src/main/java/org/linphone/ui/call/model/ZrtpSasConfirmationDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/call/model/ZrtpSasConfirmationDialogModel.kt @@ -53,7 +53,7 @@ class ZrtpSasConfirmationDialogModel @UiThread constructor( authTokenToRead ) - // TODO: improve algo? + // TODO FIXME: use SDK API when it will be available val rnd = Random() val randomLetters1 = "${ALPHABET[rnd.nextInt(ALPHABET.length)]}${ALPHABET[ rnd.nextInt( diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt index 1c367094a..224f7bd56 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt @@ -224,6 +224,7 @@ class ContactFragment : SlidingPaneChildFragment() { Log.w( "$TAG Contact [${viewModel.contact.value?.name?.value}] has been deleted" ) + // TODO: show green toast goBack() } } 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 294f4e859..42d7e7724 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 @@ -38,14 +38,16 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.bottomsheet.BottomSheetDialogFragment 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.model.ContactAvatarModel import org.linphone.ui.main.contacts.viewmodel.ContactsListViewModel import org.linphone.ui.main.fragment.AbstractMainFragment +import org.linphone.ui.main.history.model.ConfirmationDialogModel +import org.linphone.utils.DialogUtils import org.linphone.utils.Event @UiThread @@ -203,16 +205,7 @@ class ContactsListFragment : AbstractMainFragment() { 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 to" else "removed from"} favourites" - ) - model.friend.starred = starred - model.friend.done() - coreContext.contactsManager.notifyContactsListChanged() - } + listViewModel.toggleContactFavoriteFlag(model) }, { // onShare Log.i( @@ -221,13 +214,7 @@ class ContactsListFragment : AbstractMainFragment() { listViewModel.exportContactAsVCard(model.friend) }, { // onDelete - coreContext.postOnCoreThread { - // TODO: confirmation dialog + confirmation toast once deleted - Log.w("$TAG Removing friend [${model.name.value}]") - coreContext.contactsManager.contactRemoved(model.friend) - model.friend.remove() - coreContext.contactsManager.notifyContactsListChanged() - } + showDeleteConfirmationDialog(model) } ) modalBottomSheet.show(parentFragmentManager, ContactsListMenuDialogFragment.TAG) @@ -320,4 +307,28 @@ class ContactsListFragment : AbstractMainFragment() { popupWindow.elevation = 20f popupWindow.showAsDropDown(view, 0, 0, Gravity.BOTTOM) } + + private fun showDeleteConfirmationDialog(contactModel: ContactAvatarModel) { + val model = ConfirmationDialogModel() + val dialog = DialogUtils.getDeleteContactConfirmationDialog( + requireActivity(), + model, + contactModel.contactName.orEmpty() + ) + + model.dismissEvent.observe(viewLifecycleOwner) { + it.consume { + dialog.dismiss() + } + } + + model.confirmEvent.observe(viewLifecycleOwner) { + it.consume { + listViewModel.deleteContact(contactModel) + dialog.dismiss() + } + } + + dialog.show() + } } 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 9c593908a..ebc784710 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 @@ -197,6 +197,31 @@ class ContactsListViewModel @UiThread constructor() : AbstractMainViewModel() { } } + @UiThread + fun toggleContactFavoriteFlag(contactModel: ContactAvatarModel) { + coreContext.postOnCoreThread { + contactModel.friend.edit() + val starred = !contactModel.friend.starred + Log.i( + "$TAG Friend [${contactModel.name.value}] will be ${if (starred) "added to" else "removed from"} favourites" + ) + contactModel.friend.starred = starred + contactModel.friend.done() + coreContext.contactsManager.notifyContactsListChanged() + } + } + + @UiThread + fun deleteContact(contactModel: ContactAvatarModel) { + coreContext.postOnCoreThread { + Log.w("$TAG Removing friend [${contactModel.contactName}]") + coreContext.contactsManager.contactRemoved(contactModel.friend) + contactModel.friend.remove() + coreContext.contactsManager.notifyContactsListChanged() + // TODO: show green toast + } + } + @WorkerThread private fun applyFilter( filter: String, diff --git a/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt index 382c826f3..997ddb4be 100644 --- a/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/viewmodel/MediaViewModel.kt @@ -73,7 +73,7 @@ class MediaViewModel @UiThread constructor() : ViewModel() { FileUtils.MimeType.Audio -> { Log.i("$TAG File [$file] seems to be an audio file") isAudio.value = true - // TODO: handle audio files + // TODO FIXME: handle audio files } else -> { } } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt index f1a118096..c22055a88 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt @@ -43,7 +43,6 @@ import org.linphone.ui.assistant.AssistantActivity import org.linphone.ui.main.MainActivity import org.linphone.ui.main.settings.fragment.AccountProfileFragmentDirections import org.linphone.ui.main.viewmodel.DrawerMenuViewModel -import org.linphone.ui.welcome.WelcomeActivity @UiThread class DrawerMenuFragment : GenericFragment() { @@ -81,11 +80,9 @@ class DrawerMenuFragment : GenericFragment() { } binding.setRecordingsClickListener { - // TODO: recordings feature - /*val navController = (requireActivity() as MainActivity).findNavController() + val navController = (requireActivity() as MainActivity).findNavController() navController.navigate(R.id.action_global_recordingsFragment) - (requireActivity() as MainActivity).closeDrawerMenu()*/ - startActivity(Intent(requireActivity(), WelcomeActivity::class.java)) + (requireActivity() as MainActivity).closeDrawerMenu() } binding.setHelpClickedListener {