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