From 01f6ac29e98ae712d5e5e869474fcb69fd20e91c Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 4 Jun 2024 15:30:04 +0200 Subject: [PATCH] Adding clear input when long pressing backspace button in numpad + playing DTMF tone if enabled at OS level --- .../main/java/org/linphone/core/CoreContext.kt | 10 ++++++++++ .../ui/call/viewmodel/CurrentCallViewModel.kt | 2 ++ .../main/history/fragment/StartCallFragment.kt | 6 ++++++ .../ui/main/history/model/NumpadModel.kt | 17 ++++++++++++++++- .../history/viewmodel/StartCallViewModel.kt | 7 +++++++ .../layout/start_call_numpad_bottom_sheet.xml | 1 + 6 files changed, 42 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 213587f8c..cdd14c0ee 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -29,6 +29,7 @@ import android.media.AudioManager import android.os.Handler import android.os.HandlerThread import android.os.Looper +import android.provider.Settings import androidx.annotation.AnyThread import androidx.annotation.UiThread import androidx.annotation.WorkerThread @@ -744,6 +745,15 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C } } + @WorkerThread + fun playDtmf(character: Char, duration: Int = 200) { + if (Settings.System.getInt(context.contentResolver, Settings.System.DTMF_TONE_WHEN_DIALING) != 0) { + core.playDtmf(character, duration) + } else { + Log.w("$TAG Numpad DTMF tones are disabled in system settings, not playing them") + } + } + @WorkerThread private fun computeUserAgent() { val deviceName = AppUtils.getDeviceName(context) 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 d32485047..075421538 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 @@ -473,6 +473,8 @@ class CurrentCallViewModel @UiThread constructor() : GenericViewModel() { removedCharacterAtCurrentPositionEvent.value = Event(true) }, { // OnCallClicked + }, + { // OnClearInput } ) diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt index 67645509b..e59f753f1 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt @@ -110,6 +110,12 @@ class StartCallFragment : GenericAddressPickerFragment() { } } + viewModel.clearSearchBarEvent.observe(viewLifecycleOwner) { + it.consume { + binding.searchBar.setText("") + } + } + viewModel.appendDigitToSearchBarEvent.observe(viewLifecycleOwner) { it.consume { digit -> binding.searchBar.addCharacterAtPosition(digit) 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 21629d71a..af5f5bc52 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 @@ -21,12 +21,14 @@ package org.linphone.ui.main.history.model import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData +import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.tools.Log open class NumpadModel @UiThread constructor( private val onDigitClicked: (value: String) -> (Unit), private val onBackspaceClicked: () -> (Unit), - private val onCallClicked: () -> (Unit) + private val onCallClicked: () -> (Unit), + private val onClearClicked: () -> (Unit) ) { companion object { private const val TAG = "[Numpad Model]" @@ -38,6 +40,12 @@ open class NumpadModel @UiThread constructor( fun onDigitClicked(value: String) { Log.i("$TAG Clicked on digit [$value]") onDigitClicked.invoke(value) + + if (value.isNotEmpty()) { + coreContext.postOnCoreThread { core -> + coreContext.playDtmf(value[0]) + } + } } fun onDigitLongClicked(value: String): Boolean { @@ -52,6 +60,13 @@ open class NumpadModel @UiThread constructor( onBackspaceClicked.invoke() } + @UiThread + fun onBackspaceLongClicked(): Boolean { + Log.i("$TAG Long clicked on backspace, clearing input") + onClearClicked.invoke() + return true + } + @UiThread fun onCallClicked() { Log.i("$TAG Starting call") 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 0bfaddf02..88954c472 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 @@ -66,6 +66,10 @@ class StartCallViewModel @UiThread constructor() : AddressSelectionViewModel() { MutableLiveData>() } + val clearSearchBarEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val requestKeyboardVisibilityChangedEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -143,6 +147,9 @@ class StartCallViewModel @UiThread constructor() : AddressSelectionViewModel() { } } } + }, + { // OnClearInput + clearSearchBarEvent.value = Event(true) } ) 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 4d2251b4d..1ec8e3ed2 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 @@ -192,6 +192,7 @@