From b2a89a46ca4412cc3501a2c2ba6efb5eedf4376d Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 17 Aug 2023 13:19:06 +0200 Subject: [PATCH] Added delete all call logs menu & dialog --- .../main/calls/fragment/CallsListFragment.kt | 51 ++++++- .../model/RemoveAllCallLogsDialogModel.kt | 39 ++++++ .../calls/viewmodel/CallsListViewModel.kt | 10 ++ .../model/NumberOrAddressPickerDialogModel.kt | 3 +- .../java/org/linphone/utils/DialogUtils.kt | 39 +++++- .../res/layout-land/calls_list_fragment.xml | 5 +- app/src/main/res/layout/call_fragment.xml | 10 +- .../main/res/layout/calls_list_fragment.xml | 5 +- .../main/res/layout/calls_list_popup_menu.xml | 38 ++++++ .../res/layout/dialog_confirm_zrtp_sas.xml | 5 +- .../layout/dialog_remove_all_call_logs.xml | 127 ++++++++++++++++++ app/src/main/res/values-night/themes.xml | 10 ++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/themes.xml | 10 ++ 14 files changed, 337 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/org/linphone/ui/main/calls/model/RemoveAllCallLogsDialogModel.kt create mode 100644 app/src/main/res/layout/calls_list_popup_menu.xml create mode 100644 app/src/main/res/layout/dialog_remove_all_call_logs.xml 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 a8716fa4a..6368b0edf 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 @@ -23,11 +23,14 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.os.Bundle +import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.animation.Animation import android.view.animation.AnimationUtils +import android.widget.PopupWindow +import androidx.databinding.DataBindingUtil import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels @@ -35,9 +38,12 @@ import androidx.recyclerview.widget.LinearLayoutManager import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.databinding.CallsListFragmentBinding +import org.linphone.databinding.CallsListPopupMenuBinding import org.linphone.ui.main.calls.adapter.CallsListAdapter +import org.linphone.ui.main.calls.model.RemoveAllCallLogsDialogModel import org.linphone.ui.main.calls.viewmodel.CallsListViewModel import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.utils.DialogUtils import org.linphone.utils.Event import org.linphone.utils.slideInToastFromTopForDuration @@ -125,7 +131,7 @@ class CallsListFragment : GenericFragment() { } binding.setMenuClickListener { - // TODO show popup menu with delete all history button + showPopupMenu() } } @@ -140,4 +146,47 @@ class CallsListFragment : GenericFragment() { val target = binding.greenToast.root target.slideInToastFromTopForDuration(binding.root as ViewGroup, lifecycleScope) } + + private fun showPopupMenu() { + val popupView: CallsListPopupMenuBinding = DataBindingUtil.inflate( + LayoutInflater.from(requireContext()), + R.layout.calls_list_popup_menu, + null, + false + ) + val popupWindow = PopupWindow( + popupView.root, + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + true + ) + + popupView.setDeleteAllHistoryClickListener { + val model = RemoveAllCallLogsDialogModel() + val dialog = DialogUtils.getRemoveAllCallLogsConfirmationDialog( + requireActivity(), + model + ) + + model.dismissEvent.observe(viewLifecycleOwner) { + it.consume { + dialog.dismiss() + } + } + + model.confirmRemovalEvent.observe(viewLifecycleOwner) { + it.consume { + listViewModel.removeAllCallLogs() + dialog.dismiss() + } + } + + dialog.show() + 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/calls/model/RemoveAllCallLogsDialogModel.kt b/app/src/main/java/org/linphone/ui/main/calls/model/RemoveAllCallLogsDialogModel.kt new file mode 100644 index 000000000..e78c689c6 --- /dev/null +++ b/app/src/main/java/org/linphone/ui/main/calls/model/RemoveAllCallLogsDialogModel.kt @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.main.calls.model + +import androidx.lifecycle.MutableLiveData +import org.linphone.utils.Event + +class RemoveAllCallLogsDialogModel() { + val dismissEvent = MutableLiveData>() + + val confirmRemovalEvent = MutableLiveData>() + + fun dismiss() { + // UI thread + dismissEvent.value = Event(true) + } + + fun confirmRemoval() { + // UI thread + confirmRemovalEvent.value = Event(true) + } +} diff --git a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt index 354e6de70..19f1a0c4e 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt @@ -63,6 +63,16 @@ class CallsListViewModel : ViewModel() { } } + fun removeAllCallLogs() { + // UI thread + coreContext.postOnCoreThread { core -> + for (callLog in core.callLogs) { + core.removeCallLog(callLog) + } + computeCallLogsList(currentFilter) + } + } + private fun computeCallLogsList(filter: String) { // Core thread val list = arrayListOf() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/model/NumberOrAddressPickerDialogModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/model/NumberOrAddressPickerDialogModel.kt index dd7f6d175..7811c8a97 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/model/NumberOrAddressPickerDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/model/NumberOrAddressPickerDialogModel.kt @@ -20,11 +20,10 @@ package org.linphone.ui.main.contacts.model import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.ui.main.contacts.viewmodel.ContactViewModel import org.linphone.utils.Event -class NumberOrAddressPickerDialogModel(viewModel: ContactViewModel) : ViewModel() { +class NumberOrAddressPickerDialogModel(viewModel: ContactViewModel) { val sipAddressesAndPhoneNumbers = MutableLiveData>() val dismissEvent = MutableLiveData>() diff --git a/app/src/main/java/org/linphone/utils/DialogUtils.kt b/app/src/main/java/org/linphone/utils/DialogUtils.kt index e194494f8..7db8d07d2 100644 --- a/app/src/main/java/org/linphone/utils/DialogUtils.kt +++ b/app/src/main/java/org/linphone/utils/DialogUtils.kt @@ -31,6 +31,8 @@ import androidx.databinding.DataBindingUtil import org.linphone.R import org.linphone.databinding.DialogConfirmZrtpSasBinding import org.linphone.databinding.DialogPickNumberOrAddressBinding +import org.linphone.databinding.DialogRemoveAllCallLogsBinding +import org.linphone.ui.main.calls.model.RemoveAllCallLogsDialogModel import org.linphone.ui.main.contacts.model.NumberOrAddressPickerDialogModel import org.linphone.ui.voip.model.ZrtpSasConfirmationDialogModel @@ -40,7 +42,7 @@ class DialogUtils { context: Context, viewModel: NumberOrAddressPickerDialogModel ): Dialog { - val dialog = Dialog(context) + val dialog = Dialog(context, R.style.Theme_LinphoneDialog) dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) val binding: DialogPickNumberOrAddressBinding = DataBindingUtil.inflate( @@ -55,7 +57,7 @@ class DialogUtils { val d: Drawable = ColorDrawable( ContextCompat.getColor(dialog.context, R.color.dialog_background) ) - d.alpha = 100 + d.alpha = 166 dialog.window ?.setLayout( WindowManager.LayoutParams.MATCH_PARENT, @@ -64,11 +66,40 @@ class DialogUtils { dialog.window?.setBackgroundDrawable(d) return dialog } + fun getRemoveAllCallLogsConfirmationDialog( + context: Context, + model: RemoveAllCallLogsDialogModel + ): Dialog { + val dialog = Dialog(context, R.style.Theme_LinphoneDialog) + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + + val binding: DialogRemoveAllCallLogsBinding = DataBindingUtil.inflate( + LayoutInflater.from(context), + R.layout.dialog_remove_all_call_logs, + null, + false + ) + binding.viewModel = model + dialog.setContentView(binding.root) + + val d: Drawable = ColorDrawable( + ContextCompat.getColor(dialog.context, R.color.dialog_background) + ) + d.alpha = 166 + dialog.window + ?.setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT + ) + dialog.window?.setBackgroundDrawable(d) + return dialog + } + fun getZrtpSasConfirmationDialog( context: Context, viewModel: ZrtpSasConfirmationDialogModel ): Dialog { - val dialog = Dialog(context) + val dialog = Dialog(context, R.style.Theme_LinphoneDialog) dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) val binding: DialogConfirmZrtpSasBinding = DataBindingUtil.inflate( @@ -83,7 +114,7 @@ class DialogUtils { val d: Drawable = ColorDrawable( ContextCompat.getColor(dialog.context, R.color.dialog_background) ) - d.alpha = 100 + d.alpha = 166 dialog.window ?.setLayout( WindowManager.LayoutParams.MATCH_PARENT, diff --git a/app/src/main/res/layout-land/calls_list_fragment.xml b/app/src/main/res/layout-land/calls_list_fragment.xml index 33a56e599..8a93e333d 100644 --- a/app/src/main/res/layout-land/calls_list_fragment.xml +++ b/app/src/main/res/layout-land/calls_list_fragment.xml @@ -41,7 +41,10 @@ android:layout_width="24dp" android:layout_height="24dp" android:layout_marginEnd="9dp" - android:adjustViewBounds="true" + android:paddingTop="4dp" + android:paddingBottom="4dp" + android:paddingStart="10dp" + android:paddingEnd="10dp" android:src="@drawable/dot_menu" app:tint="@color/white" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/call_fragment.xml b/app/src/main/res/layout/call_fragment.xml index ce3344d2b..c030994c2 100644 --- a/app/src/main/res/layout/call_fragment.xml +++ b/app/src/main/res/layout/call_fragment.xml @@ -36,12 +36,14 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_confirm_zrtp_sas.xml b/app/src/main/res/layout/dialog_confirm_zrtp_sas.xml index 39afe6176..1150db06d 100644 --- a/app/src/main/res/layout/dialog_confirm_zrtp_sas.xml +++ b/app/src/main/res/layout/dialog_confirm_zrtp_sas.xml @@ -15,7 +15,6 @@ android:onClick="@{() -> viewModel.dismiss()}" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/in_call_black" android:clickable="true" android:focusable="true"> @@ -39,10 +38,8 @@ android:src="@drawable/shape_dialog_background" app:layout_constraintBottom_toBottomOf="@id/anchor" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="@id/title" - app:layout_constraintVertical_bias="1.0" /> + app:layout_constraintTop_toTopOf="@id/title" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 1ba01d44b..49f43007a 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -5,7 +5,17 @@ @color/primary_color @color/primary_color + + shortEdges true + @color/white + @color/white + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 9e835a98f..8b5c45e28 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,5 +1,7 @@ + #00000000 + #FF5E00 #FFEACB #B72D00 diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 1ba01d44b..49f43007a 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -5,7 +5,17 @@ @color/primary_color @color/primary_color + + shortEdges true + @color/white + @color/white + + + \ No newline at end of file