From 141c613eb97f62413f7f164f0da0d31adbbcee29 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 21 Sep 2023 11:29:51 +0200 Subject: [PATCH] Added confirmation dialog for contact removal & call logs removal --- .../ui/main/calls/fragment/CallFragment.kt | 30 ++++- .../main/calls/fragment/CallsListFragment.kt | 46 ++++---- .../main/contacts/fragment/ContactFragment.kt | 41 ++++++- .../contacts/viewmodel/ContactViewModel.kt | 5 + .../java/org/linphone/utils/DialogUtils.kt | 39 +++++++ .../main/res/layout/dialog_delete_contact.xml | 103 ++++++++++++++++++ .../res/layout/dialog_remove_call_logs.xml | 103 ++++++++++++++++++ app/src/main/res/values/strings.xml | 6 +- 8 files changed, 347 insertions(+), 26 deletions(-) create mode 100644 app/src/main/res/layout/dialog_delete_contact.xml create mode 100644 app/src/main/res/layout/dialog_remove_call_logs.xml 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 9e971a571..1f326d4d3 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 @@ -41,8 +41,10 @@ import org.linphone.databinding.CallFragmentBinding import org.linphone.databinding.CallPopupMenuBinding import org.linphone.ui.main.MainActivity import org.linphone.ui.main.calls.adapter.CallHistoryListAdapter +import org.linphone.ui.main.calls.model.ConfirmationDialogModel import org.linphone.ui.main.calls.viewmodel.CallLogViewModel import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.utils.DialogUtils import org.linphone.utils.Event @UiThread @@ -175,7 +177,7 @@ class CallFragment : GenericFragment() { } popupView.setDeleteAllHistoryClickListener { - viewModel.deleteHistory() + showDeleteConfirmationDialog() popupWindow.dismiss() } @@ -188,4 +190,30 @@ class CallFragment : GenericFragment() { popupWindow.elevation = 20f popupWindow.showAsDropDown(binding.menu, 0, 0, Gravity.BOTTOM) } + + private fun showDeleteConfirmationDialog() { + val model = ConfirmationDialogModel() + val dialog = DialogUtils.getRemoveCallLogsConfirmationDialog( + requireActivity(), + model + ) + + model.dismissEvent.observe(viewLifecycleOwner) { + it.consume { + dialog.dismiss() + } + } + + model.confirmRemovalEvent.observe(viewLifecycleOwner) { + it.consume { + Log.w( + "$TAG Removing call entries with [${viewModel.callLogModel.value?.address?.asStringUriOnly()}] from database" + ) + viewModel.deleteHistory() + dialog.dismiss() + } + } + + dialog.show() + } } 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 997467f04..f7df9844e 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 @@ -249,27 +249,7 @@ class CallsListFragment : AbstractTopBarFragment() { ) popupView.setDeleteAllHistoryClickListener { - val model = ConfirmationDialogModel() - val dialog = DialogUtils.getRemoveAllCallLogsConfirmationDialog( - requireActivity(), - model - ) - - model.dismissEvent.observe(viewLifecycleOwner) { - it.consume { - dialog.dismiss() - } - } - - model.confirmRemovalEvent.observe(viewLifecycleOwner) { - it.consume { - Log.w("$TAG Removing all call entries from database") - listViewModel.removeAllCallLogs() - dialog.dismiss() - } - } - - dialog.show() + showDeleteConfirmationDialog() popupWindow.dismiss() } @@ -277,4 +257,28 @@ class CallsListFragment : AbstractTopBarFragment() { popupWindow.elevation = 20f popupWindow.showAsDropDown(binding.menu, 0, 0, Gravity.BOTTOM) } + + private fun showDeleteConfirmationDialog() { + val model = ConfirmationDialogModel() + val dialog = DialogUtils.getRemoveAllCallLogsConfirmationDialog( + requireActivity(), + model + ) + + model.dismissEvent.observe(viewLifecycleOwner) { + it.consume { + dialog.dismiss() + } + } + + model.confirmRemovalEvent.observe(viewLifecycleOwner) { + it.consume { + Log.w("$TAG Removing all call entries from database") + listViewModel.removeAllCallLogs() + dialog.dismiss() + } + } + + dialog.show() + } } 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 d03d1fe49..dca48753f 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 @@ -41,6 +41,7 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ContactFragmentBinding import org.linphone.ui.main.MainActivity +import org.linphone.ui.main.calls.model.ConfirmationDialogModel import org.linphone.ui.main.contacts.model.NumberOrAddressPickerDialogModel import org.linphone.ui.main.contacts.model.TrustCallDialogModel import org.linphone.ui.main.contacts.viewmodel.ContactViewModel @@ -100,9 +101,7 @@ class ContactFragment : GenericFragment() { } binding.setDeleteClickListener { - viewModel.deleteContact() - goBack() - // TODO: show toast ? show confirmation dialog ? + showDeleteConfirmationDialog() } sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { slideable -> @@ -199,6 +198,15 @@ class ContactFragment : GenericFragment() { } } + viewModel.contactRemovedEvent.observe(viewLifecycleOwner) { + it.consume { + Log.w( + "$TAG Contact [${viewModel.contact.value?.name?.value}] has been deleted" + ) + goBack() + } + } + // TODO: remove later binding.chat.isEnabled = false } @@ -288,4 +296,31 @@ class ContactFragment : GenericFragment() { dialog.show() } + + private fun showDeleteConfirmationDialog() { + val model = ConfirmationDialogModel() + val dialog = DialogUtils.getDeleteContactConfirmationDialog( + requireActivity(), + model, + viewModel.contact.value?.name?.value ?: "" + ) + + model.dismissEvent.observe(viewLifecycleOwner) { + it.consume { + dialog.dismiss() + } + } + + model.confirmRemovalEvent.observe(viewLifecycleOwner) { + it.consume { + Log.w( + "$TAG Deleting contact [${viewModel.contact.value?.name?.value}]" + ) + viewModel.deleteContact() + dialog.dismiss() + } + } + + dialog.show() + } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt index 5f0f298dc..37f4a69a3 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt @@ -93,6 +93,10 @@ class ContactViewModel @UiThread constructor() : ViewModel() { MutableLiveData>>() } + val contactRemovedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private val listener = object : ContactNumberOrAddressClickListener { @UiThread override fun onClicked(model: ContactNumberOrAddressModel) { @@ -274,6 +278,7 @@ class ContactViewModel @UiThread constructor() : ViewModel() { Log.w("$TAG Deleting friend [$friend]") friend.remove() coreContext.contactsManager.notifyContactsListChanged() + contactRemovedEvent.postValue(Event(true)) } } } diff --git a/app/src/main/java/org/linphone/utils/DialogUtils.kt b/app/src/main/java/org/linphone/utils/DialogUtils.kt index cf2a411e3..cf15383c5 100644 --- a/app/src/main/java/org/linphone/utils/DialogUtils.kt +++ b/app/src/main/java/org/linphone/utils/DialogUtils.kt @@ -39,9 +39,11 @@ import org.linphone.databinding.DialogCancelContactChangesBinding import org.linphone.databinding.DialogConfirmZrtpSasBinding import org.linphone.databinding.DialogContactConfirmTrustCallBinding import org.linphone.databinding.DialogContactTrustProcessBinding +import org.linphone.databinding.DialogDeleteContactBinding import org.linphone.databinding.DialogPickNumberOrAddressBinding import org.linphone.databinding.DialogRemoveAccountBinding import org.linphone.databinding.DialogRemoveAllCallLogsBinding +import org.linphone.databinding.DialogRemoveCallLogsBinding import org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel import org.linphone.ui.assistant.model.ConfirmPhoneNumberDialogModel import org.linphone.ui.main.calls.model.ConfirmationDialogModel @@ -176,6 +178,43 @@ class DialogUtils { return dialog } + @UiThread + fun getDeleteContactConfirmationDialog( + context: Context, + viewModel: ConfirmationDialogModel, + contactName: String + ): Dialog { + val binding: DialogDeleteContactBinding = DataBindingUtil.inflate( + LayoutInflater.from(context), + R.layout.dialog_delete_contact, + null, + false + ) + binding.viewModel = viewModel + binding.title.text = context.getString( + R.string.dialog_contact_delete_title, + contactName + ) + + return getDialog(context, binding) + } + + @UiThread + fun getRemoveCallLogsConfirmationDialog( + context: Context, + viewModel: ConfirmationDialogModel + ): Dialog { + val binding: DialogRemoveCallLogsBinding = DataBindingUtil.inflate( + LayoutInflater.from(context), + R.layout.dialog_remove_call_logs, + null, + false + ) + binding.viewModel = viewModel + + return getDialog(context, binding) + } + @UiThread fun getRemoveAllCallLogsConfirmationDialog( context: Context, diff --git a/app/src/main/res/layout/dialog_delete_contact.xml b/app/src/main/res/layout/dialog_delete_contact.xml new file mode 100644 index 000000000..811a1ee76 --- /dev/null +++ b/app/src/main/res/layout/dialog_delete_contact.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_remove_call_logs.xml b/app/src/main/res/layout/dialog_remove_call_logs.xml new file mode 100644 index 000000000..ed6740ac7 --- /dev/null +++ b/app/src/main/res/layout/dialog_remove_call_logs.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 579504bcd..44cb62041 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -71,9 +71,13 @@ You\'re about to make a call to $1%s\'s device $2%s.\nDo you want to make the call? What does it mean? Blah blah blah + Delete %s? + This contact will be definitively removed. Which canal do you choose? Do you really want to delete all calls history? - All calls will be deleted of the history + All calls will be removed from the history + Do you really want to delete the history with that person? + All calls will be removed from the history Blah Blah Delete %s?