From 74a15cd0a1a5ba235d665ccc7f9724c4412e0e84 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 17 Aug 2023 14:14:32 +0200 Subject: [PATCH] Started call history detail popup menu --- .../ui/main/calls/fragment/CallFragment.kt | 54 +++++++++ .../main/calls/viewmodel/CallLogViewModel.kt | 8 ++ app/src/main/res/drawable/contact.xml | 20 ++++ .../main/res/layout/account_popup_menu.xml | 1 + app/src/main/res/layout/call_fragment.xml | 4 + app/src/main/res/layout/call_popup_menu.xml | 109 ++++++++++++++++++ 6 files changed, 196 insertions(+) create mode 100644 app/src/main/res/drawable/contact.xml create mode 100644 app/src/main/res/layout/call_popup_menu.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 0c65e7638..f2c601a70 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 @@ -19,18 +19,28 @@ */ package org.linphone.ui.main.calls.fragment +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.widget.PopupWindow import androidx.core.view.doOnPreDraw +import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.navArgs +import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallFragmentBinding +import org.linphone.databinding.CallPopupMenuBinding import org.linphone.ui.main.calls.viewmodel.CallLogViewModel import org.linphone.ui.main.fragment.GenericFragment import org.linphone.utils.Event +import org.linphone.utils.slideInToastFromTopForDuration class CallFragment : GenericFragment() { private lateinit var binding: CallFragmentBinding @@ -70,6 +80,10 @@ class CallFragment : GenericFragment() { goBack() } + binding.setMenuClickListener { + showPopupMenu() + } + sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { slideable -> viewModel.showBackButton.value = slideable } @@ -81,4 +95,44 @@ class CallFragment : GenericFragment() { sharedViewModel.openSlidingPaneEvent.value = Event(true) } } + + private fun copyNumberOrAddressToClipboard(value: String) { + val clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val label = "SIP address" + clipboard.setPrimaryClip(ClipData.newPlainText(label, value)) + + binding.greenToast.message = "Numéro copié dans le presse-papier" + binding.greenToast.icon = R.drawable.check + + val target = binding.greenToast.root + target.slideInToastFromTopForDuration(binding.root as ViewGroup, lifecycleScope) + } + + private fun showPopupMenu() { + val popupView: CallPopupMenuBinding = DataBindingUtil.inflate( + LayoutInflater.from(requireContext()), + R.layout.call_popup_menu, + null, + false + ) + + popupView.setDeleteAllHistoryClickListener { + viewModel.deleteHistory() + } + + popupView.setCopyNumberClickListener { + copyNumberOrAddressToClipboard(viewModel.callLogModel.value?.displayedAddress.orEmpty()) + } + + val popupWindow = PopupWindow( + popupView.root, + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + true + ) + + // 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/viewmodel/CallLogViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt index c9a22512e..43218d27a 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt @@ -43,7 +43,13 @@ class CallLogViewModel : ViewModel() { } } + fun deleteHistory() { + // UI thread + // TODO + } + fun startAudioCall() { + // UI thread coreContext.postOnCoreThread { core -> val params = core.createCallParams(null) params?.isVideoEnabled = false @@ -52,6 +58,7 @@ class CallLogViewModel : ViewModel() { } fun startVideoCall() { + // UI thread coreContext.postOnCoreThread { core -> val params = core.createCallParams(null) params?.isVideoEnabled = true @@ -60,6 +67,7 @@ class CallLogViewModel : ViewModel() { } fun sendMessage() { + // UI thread // TODO } } diff --git a/app/src/main/res/drawable/contact.xml b/app/src/main/res/drawable/contact.xml new file mode 100644 index 000000000..12982c3a3 --- /dev/null +++ b/app/src/main/res/drawable/contact.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/app/src/main/res/layout/account_popup_menu.xml b/app/src/main/res/layout/account_popup_menu.xml index cc8b60634..21fd84a95 100644 --- a/app/src/main/res/layout/account_popup_menu.xml +++ b/app/src/main/res/layout/account_popup_menu.xml @@ -27,6 +27,7 @@ android:textColor="@color/gray_1" android:drawableStart="@drawable/manage_profile" android:drawablePadding="5dp" + app:drawableTint="@color/gray_8" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/call_fragment.xml b/app/src/main/res/layout/call_fragment.xml index c030994c2..329bc0435 100644 --- a/app/src/main/res/layout/call_fragment.xml +++ b/app/src/main/res/layout/call_fragment.xml @@ -9,6 +9,9 @@ + @@ -35,6 +38,7 @@ app:layout_constraintBottom_toBottomOf="@id/menu"/> + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file