diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 420f5d0cf..8f2468e8a 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -32,8 +32,6 @@ import android.os.Handler import android.os.HandlerThread import android.os.Looper import android.os.PowerManager -import android.provider.Settings -import android.provider.Settings.SettingNotFoundException import androidx.annotation.AnyThread import androidx.annotation.UiThread import androidx.annotation.WorkerThread @@ -1111,23 +1109,6 @@ class CoreContext keepAliveServiceStarted = false } - @WorkerThread - fun playDtmf(character: Char, duration: Int = 200, ignoreSystemPolicy: Boolean = false) { - try { - if (ignoreSystemPolicy || 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") - } - } catch (snfe: SettingNotFoundException) { - Log.e("$TAG DTMF_TONE_WHEN_DIALING system setting not found: $snfe") - } - } - @WorkerThread fun computeUserAgent() { val savedDeviceName = corePreferences.deviceName diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt index dc1933d07..9c8e10ba2 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt @@ -304,6 +304,12 @@ class ActiveCallFragment : GenericCallFragment() { } } + callViewModel.clearPressedDtmfBarEvent.observe(viewLifecycleOwner) { + it.consume { + binding.callNumpad.digitsHistory.setText("") + } + } + callViewModel.appendDigitToSearchBarEvent.observe(viewLifecycleOwner) { it.consume { digit -> binding.callNumpad.digitsHistory.addCharacterAtPosition(digit) 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 9785cc738..9b5234a90 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 @@ -260,6 +260,10 @@ class CurrentCallViewModel MutableLiveData() } + val clearPressedDtmfBarEvent: MutableLiveData> by lazy { + MutableLiveData() + } + // Sliding answer/decline button val isScreenLocked = MutableLiveData() @@ -577,6 +581,7 @@ class CurrentCallViewModel { // OnBlindTransferClicked }, { // OnClearInput + clearPressedDtmfBarEvent.value = Event(true) } ) 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 9a74695c9..5eff23c66 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 @@ -19,12 +19,16 @@ */ package org.linphone.ui.main.history.model +import android.provider.Settings +import android.provider.Settings.SettingNotFoundException +import android.view.View import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.core.tools.Log import org.linphone.utils.LinphoneUtils +import org.linphone.utils.TouchListener open class NumpadModel @UiThread @@ -47,7 +51,38 @@ open class NumpadModel val showLetters = MutableLiveData() + val systemPolicyAllowsDtmf: Boolean + + val touchListener = object : TouchListener { + override fun onPressed(view: View): Boolean { + Log.i("$TAG Numpad digit [${view.tag}] pressed") + startPlayingDtmf(view.tag.toString()) + return false + } + + override fun onReleased(view: View): Boolean { + Log.i("$TAG Numpad digit [${view.tag}] released") + stopPlayingDtmf(view.tag.toString()) + return false + } + } + init { + var dtmfAllowed = false + try { + dtmfAllowed = Settings.System.getInt( + coreContext.context.contentResolver, + Settings.System.DTMF_TONE_WHEN_DIALING + ) != 0 + if (!dtmfAllowed) { + Log.w("$TAG Numpad DTMF tones are disabled in system settings, not playing them") + } + } catch (snfe: SettingNotFoundException) { + Log.e("$TAG DTMF_TONE_WHEN_DIALING system setting not found: $snfe") + dtmfAllowed = false + } + systemPolicyAllowsDtmf = dtmfAllowed + coreContext.postOnCoreThread { showLetters.postValue(corePreferences.showLettersOnDialpad) @@ -61,12 +96,6 @@ open class NumpadModel fun onDigitClicked(value: String) { Log.i("$TAG Clicked on digit [$value]") onDigitClicked.invoke(value) - - if (value.isNotEmpty()) { - coreContext.postOnCoreThread { - coreContext.playDtmf(value[0], ignoreSystemPolicy = inCallNumpad) - } - } } @UiThread @@ -113,4 +142,24 @@ open class NumpadModel Log.i("$TAG Transferring call") onTransferCallClicked.invoke() } + + @UiThread + private fun startPlayingDtmf(dtmf: String) { + if (dtmf.isEmpty() || (!inCallNumpad && !systemPolicyAllowsDtmf)) return + + coreContext.postOnCoreThread { core -> + Log.i("$TAG Start playing DTMF [$dtmf]") + core.playDtmf(dtmf[0], -1) + } + } + + @UiThread + private fun stopPlayingDtmf(dtmf: String) { + if (dtmf.isEmpty() || (!inCallNumpad && !systemPolicyAllowsDtmf)) return + + coreContext.postOnCoreThread { core -> + Log.i("$TAG Stop playing DTMF [$dtmf]") + core.stopDtmf() + } + } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt index 08f498ba2..6a85ee4ec 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt @@ -328,7 +328,7 @@ class SettingsViewModel } adaptiveRateControlEnabled.postValue(core.isAdaptiveRateControlEnabled) - + videoFecEnabled.postValue(core.isFecEnabled) vibrateDuringIncomingCall.postValue(core.isVibrationOnIncomingCallEnabled) autoRecordCalls.postValue(corePreferences.automaticallyStartCallRecording) diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 007053b80..5cc171bcb 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -26,6 +26,7 @@ import android.graphics.drawable.AnimatedVectorDrawable import android.text.Editable import android.text.TextWatcher import android.view.LayoutInflater +import android.view.MotionEvent import android.view.TextureView import android.view.View import android.view.ViewGroup @@ -652,3 +653,21 @@ fun EmojiPickerView.setEmojiPickedListener(listener: EmojiPickedListener) { interface EmojiPickedListener { fun onEmojiPicked(item: EmojiViewItem) } + +@SuppressLint("ClickableViewAccessibility") +@BindingAdapter("onTouchListener") +fun View.setTouchListener(listener: TouchListener) { + setOnTouchListener { view, event -> + return@setOnTouchListener when (event.action) { + MotionEvent.ACTION_DOWN -> listener.onPressed(view) + MotionEvent.ACTION_UP -> listener.onReleased(view) + else -> false + } + } +} + +interface TouchListener { + fun onPressed(view: View): Boolean + + fun onReleased(view: View): Boolean +} diff --git a/app/src/main/res/layout-land/call_numpad_bottom_sheet.xml b/app/src/main/res/layout-land/call_numpad_bottom_sheet.xml index d19fd4257..75dc310e9 100644 --- a/app/src/main/res/layout-land/call_numpad_bottom_sheet.xml +++ b/app/src/main/res/layout-land/call_numpad_bottom_sheet.xml @@ -63,6 +63,7 @@ diff --git a/app/src/main/res/layout/call_numpad_digit_with_letters.xml b/app/src/main/res/layout/call_numpad_digit_with_letters.xml index e56ecd448..92ba4b2f1 100644 --- a/app/src/main/res/layout/call_numpad_digit_with_letters.xml +++ b/app/src/main/res/layout/call_numpad_digit_with_letters.xml @@ -18,6 +18,8 @@ diff --git a/app/src/main/res/layout/call_numpad_digit_with_plus.xml b/app/src/main/res/layout/call_numpad_digit_with_plus.xml index ea9ff20a8..099213dc9 100644 --- a/app/src/main/res/layout/call_numpad_digit_with_plus.xml +++ b/app/src/main/res/layout/call_numpad_digit_with_plus.xml @@ -16,6 +16,8 @@ diff --git a/app/src/main/res/layout/call_numpad_digit_with_voicemail.xml b/app/src/main/res/layout/call_numpad_digit_with_voicemail.xml index 8b1933102..c7792a7e6 100644 --- a/app/src/main/res/layout/call_numpad_digit_with_voicemail.xml +++ b/app/src/main/res/layout/call_numpad_digit_with_voicemail.xml @@ -18,6 +18,8 @@