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