From c64bd5bc1cbe0bbf42727017c831b9fbac917bc5 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 16 Apr 2025 18:46:20 +0200 Subject: [PATCH] Fixed numpad dial button while transfering a call --- .../ui/call/fragment/TransferCallFragment.kt | 20 +++++++---- .../ui/call/viewmodel/CurrentCallViewModel.kt | 2 ++ .../ui/main/history/model/NumpadModel.kt | 7 ++++ .../history/viewmodel/StartCallViewModel.kt | 22 ++++++++++++ .../res/layout/call_transfer_fragment.xml | 1 + .../layout/start_call_numpad_bottom_sheet.xml | 36 +++++++++++++++++-- 6 files changed, 78 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt index be9a14d2e..b2b58745c 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/TransferCallFragment.kt @@ -35,6 +35,7 @@ import kotlin.getValue import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R +import org.linphone.core.Address import org.linphone.core.tools.Log import org.linphone.databinding.CallTransferFragmentBinding import org.linphone.ui.call.adapter.CallsListAdapter @@ -44,9 +45,9 @@ import org.linphone.ui.call.viewmodel.CurrentCallViewModel import org.linphone.ui.main.adapter.ConversationsContactsAndSuggestionsListAdapter import org.linphone.ui.main.history.viewmodel.StartCallViewModel import org.linphone.utils.ConfirmationDialogModel -import org.linphone.ui.main.model.ConversationContactOrSuggestionModel import org.linphone.utils.AppUtils import org.linphone.utils.DialogUtils +import org.linphone.utils.LinphoneUtils import org.linphone.utils.RecyclerViewHeaderDecoration import org.linphone.utils.hideKeyboard import org.linphone.utils.setKeyboardInsetListener @@ -144,7 +145,7 @@ class TransferCallFragment : GenericCallFragment() { contactsAdapter.onClickedEvent.observe(viewLifecycleOwner) { it.consume { model -> - showConfirmBlindTransferDialog(model) + showConfirmBlindTransferDialog(model.address, model.name) } } @@ -231,6 +232,12 @@ class TransferCallFragment : GenericCallFragment() { } } + viewModel.initiateBlindTransferEvent.observe(viewLifecycleOwner) { + it.consume { address -> + showConfirmBlindTransferDialog(address, LinphoneUtils.getDisplayName(address)) + } + } + binding.root.setKeyboardInsetListener { keyboardVisible -> if (keyboardVisible) { viewModel.isNumpadVisible.value = false @@ -300,14 +307,13 @@ class TransferCallFragment : GenericCallFragment() { dialog.show() } - private fun showConfirmBlindTransferDialog(contactModel: ConversationContactOrSuggestionModel) { + private fun showConfirmBlindTransferDialog(toAddress: Address, toDisplayName: String) { val from = callViewModel.displayedName.value.orEmpty() - val to = contactModel.name - Log.i("$TAG Asking user confirmation before doing blind transfer of call with [$from] to [$to](${contactModel.address.asStringUriOnly()})") + Log.i("$TAG Asking user confirmation before doing blind transfer of call with [$from] to [$toDisplayName](${toAddress.asStringUriOnly()})") val label = AppUtils.getFormattedString( R.string.call_transfer_confirm_dialog_message, from, - to + toDisplayName ) val model = ConfirmationDialogModel(label) val dialog = DialogUtils.getConfirmCallTransferCallDialog( @@ -325,7 +331,7 @@ class TransferCallFragment : GenericCallFragment() { model.confirmEvent.observe(viewLifecycleOwner) { it.consume { coreContext.postOnCoreThread { - val address = contactModel.address + val address = toAddress Log.i("$TAG Transferring (blind) call to [${address.asStringUriOnly()}]") callViewModel.blindTransferCallTo(address) } diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index 3e46cc2be..891c3e75e 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -580,6 +580,8 @@ class CurrentCallViewModel }, { // OnCallClicked }, + { // OnBlindTransferClicked + }, { // OnClearInput } ) diff --git a/app/src/main/java/org/linphone/ui/main/history/model/NumpadModel.kt b/app/src/main/java/org/linphone/ui/main/history/model/NumpadModel.kt index 2a98dafb7..9a74695c9 100644 --- a/app/src/main/java/org/linphone/ui/main/history/model/NumpadModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/model/NumpadModel.kt @@ -34,6 +34,7 @@ open class NumpadModel private val onVoicemailClicked: () -> (Unit), private val onBackspaceClicked: () -> (Unit), private val onCallClicked: () -> (Unit), + private val onTransferCallClicked: () -> (Unit), private val onClearClicked: () -> (Unit) ) { companion object { @@ -106,4 +107,10 @@ open class NumpadModel Log.i("$TAG Starting call") onCallClicked.invoke() } + + @UiThread + fun onBlindTransferClicked() { + Log.i("$TAG Transferring call") + onTransferCallClicked.invoke() + } } diff --git a/app/src/main/java/org/linphone/ui/main/history/viewmodel/StartCallViewModel.kt b/app/src/main/java/org/linphone/ui/main/history/viewmodel/StartCallViewModel.kt index b19f385ea..cb3054428 100644 --- a/app/src/main/java/org/linphone/ui/main/history/viewmodel/StartCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/viewmodel/StartCallViewModel.kt @@ -80,6 +80,10 @@ class StartCallViewModel MutableLiveData>() } + val initiateBlindTransferEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private val conferenceListener = object : ConferenceListenerStub() { @WorkerThread override fun onStateChanged(conference: Conference, newState: Conference.State?) { @@ -139,6 +143,24 @@ class StartCallViewModel } } }, + { // OnBlindTransferClicked + val suggestion = searchFilter.value.orEmpty() + if (suggestion.isNotEmpty()) { + Log.i("$TAG Using numpad transfer button to blind forward call to [$suggestion]") + coreContext.postOnCoreThread { core -> + val address = core.interpretUrl( + suggestion, + LinphoneUtils.applyInternationalPrefix() + ) + if (address != null) { + initiateBlindTransferEvent.postValue(Event(address)) + leaveFragmentEvent.postValue(Event(true)) + } else { + Log.e("$TAG Failed to parse [$suggestion] as SIP address") + } + } + } + }, { // OnClearInput clearSearchBarEvent.value = Event(true) } diff --git a/app/src/main/res/layout/call_transfer_fragment.xml b/app/src/main/res/layout/call_transfer_fragment.xml index d63a24017..4b5392950 100644 --- a/app/src/main/res/layout/call_transfer_fragment.xml +++ b/app/src/main/res/layout/call_transfer_fragment.xml @@ -220,6 +220,7 @@ android:id="@+id/numpad_layout" bind:handleClickedListener="@{hideNumpadClickListener}" bind:model="@{viewModel.numpadModel}" + bind:showCallTransferIcon="@{true}" layout="@layout/start_call_numpad_bottom_sheet" /> diff --git a/app/src/main/res/layout/start_call_numpad_bottom_sheet.xml b/app/src/main/res/layout/start_call_numpad_bottom_sheet.xml index ee886f1d9..dc7b51ec7 100644 --- a/app/src/main/res/layout/start_call_numpad_bottom_sheet.xml +++ b/app/src/main/res/layout/start_call_numpad_bottom_sheet.xml @@ -11,6 +11,9 @@ + + + + +