From df42812afc625d4f525664dd40dd41b46fa81327 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 12 May 2020 14:18:12 +0200 Subject: [PATCH] Added setting to automatically start call when app is launched from another --- .../main/dialer/fragments/DialerFragment.kt | 10 ++++++- .../main/dialer/viewmodels/DialerViewModel.kt | 30 +++++++++++++++++++ .../viewmodels/CallSettingsViewModel.kt | 8 +++++ .../java/org/linphone/core/CorePreferences.kt | 6 ++++ .../res/layout/settings_call_fragment.xml | 7 +++++ app/src/main/res/values/strings.xml | 2 ++ 6 files changed, 62 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt b/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt index c40a1b1b1..ad734dbbb 100644 --- a/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt @@ -28,6 +28,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.main.dialer.viewmodels.DialerViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel @@ -90,7 +91,14 @@ class DialerFragment : Fragment() { sharedViewModel.pendingCallTransfer = arguments?.getBoolean("Transfer") ?: false } if (arguments?.containsKey("URI") == true) { - viewModel.enteredUri.value = arguments?.getString("URI") + val address = arguments?.getString("URI") ?: "" + + if (corePreferences.callRightAway) { + Log.i("[Dialer] Call right away setting is enabled, start the call to $address") + viewModel.directCall(address) + } else { + viewModel.enteredUri.value = address + } } Log.i("[Dialer] Pending call transfer mode = ${sharedViewModel.pendingCallTransfer}") diff --git a/app/src/main/java/org/linphone/activities/main/dialer/viewmodels/DialerViewModel.kt b/app/src/main/java/org/linphone/activities/main/dialer/viewmodels/DialerViewModel.kt index 746576d4d..aed019660 100644 --- a/app/src/main/java/org/linphone/activities/main/dialer/viewmodels/DialerViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/dialer/viewmodels/DialerViewModel.kt @@ -25,6 +25,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.activities.main.dialer.NumpadDigitListener import org.linphone.core.* +import org.linphone.core.tools.Log class DialerViewModel : ViewModel() { val enteredUri = MutableLiveData() @@ -37,6 +38,9 @@ class DialerViewModel : ViewModel() { val showSwitchCamera = MutableLiveData() + private var addressWaitingNetworkToBeCalled: String? = null + private var timeAtWitchWeTriedToCall: Long = 0 + val onKeyClick: NumpadDigitListener = object : NumpadDigitListener { override fun handleClick(key: Char) { enteredUri.value += key.toString() @@ -67,6 +71,22 @@ class DialerViewModel : ViewModel() { ) { atLeastOneCall.value = core.callsNb > 0 } + + override fun onNetworkReachable(core: Core, reachable: Boolean) { + if (reachable && addressWaitingNetworkToBeCalled.orEmpty().isNotEmpty()) { + val now = System.currentTimeMillis() + if (now - timeAtWitchWeTriedToCall > 1000) { + Log.e("[Dialer] More than 1 second has passed waiting for network, abort auto call to $addressWaitingNetworkToBeCalled") + enteredUri.value = addressWaitingNetworkToBeCalled + } else { + Log.i("[Dialer] Network is available, continue auto call to $addressWaitingNetworkToBeCalled") + coreContext.startCall(addressWaitingNetworkToBeCalled.orEmpty()) + } + + addressWaitingNetworkToBeCalled = null + timeAtWitchWeTriedToCall = 0 + } + } } init { @@ -100,6 +120,16 @@ class DialerViewModel : ViewModel() { return true } + fun directCall(to: String) { + if (coreContext.core.isNetworkReachable) { + coreContext.startCall(to) + } else { + Log.w("[Dialer] Network isnt't reachable at the time, wait for network to start call (happens mainly when app is cold started)") + timeAtWitchWeTriedToCall = System.currentTimeMillis() + addressWaitingNetworkToBeCalled = to + } + } + fun startCall() { val addressToCall = enteredUri.value.orEmpty() if (addressToCall.isNotEmpty()) { diff --git a/app/src/main/java/org/linphone/activities/main/settings/viewmodels/CallSettingsViewModel.kt b/app/src/main/java/org/linphone/activities/main/settings/viewmodels/CallSettingsViewModel.kt index da681179f..1ac583a66 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/viewmodels/CallSettingsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/viewmodels/CallSettingsViewModel.kt @@ -83,6 +83,13 @@ class CallSettingsViewModel : GenericSettingsViewModel() { } val rfc2833Dtmf = MutableLiveData() + val autoStartListener = object : SettingListenerStub() { + override fun onBoolValueChanged(newValue: Boolean) { + prefs.callRightAway = newValue + } + } + val autoStart = MutableLiveData() + val autoAnswerListener = object : SettingListenerStub() { override fun onBoolValueChanged(newValue: Boolean) { prefs.autoAnswerEnabled = newValue @@ -121,6 +128,7 @@ class CallSettingsViewModel : GenericSettingsViewModel() { overlay.value = prefs.showCallOverlay sipInfoDtmf.value = core.useInfoForDtmf rfc2833Dtmf.value = core.useRfc2833ForDtmf + autoStart.value = prefs.callRightAway autoAnswer.value = prefs.autoAnswerEnabled autoAnswerDelay.value = prefs.autoAnswerDelay incomingTimeout.value = core.incTimeout diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index aa0c29626..6100bf002 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -163,6 +163,12 @@ class CorePreferences constructor(private val context: Context) { config.setBool("app", "call_overlay", value) } + var callRightAway: Boolean + get() = config.getBool("app", "call_right_away", false) + set(value) { + config.setBool("app", "call_right_away", value) + } + /* Assistant */ var firstStart: Boolean diff --git a/app/src/main/res/layout/settings_call_fragment.xml b/app/src/main/res/layout/settings_call_fragment.xml index 6556f4df0..843b5d153 100644 --- a/app/src/main/res/layout/settings_call_fragment.xml +++ b/app/src/main/res/layout/settings_call_fragment.xml @@ -117,6 +117,13 @@ linphone:listener="@{viewModel.rfc2833DtmfListener}" linphone:checked="@={viewModel.rfc2833Dtmf}"/> + + Send in-band DTMFs (RFC 2833) + Start call immediately + The call will start automatically if started from another application Auto answer incoming calls Auto answer time