- Added DTMF Mode account setting
- Better implementation of Answer Mode account setting
This commit is contained in:
@@ -1062,6 +1062,42 @@ Java_com_tutpro_baresip_Api_account_1vm_1uri(JNIEnv *env, jobject thiz, jstring
|
|||||||
return (*env)->NewStringUTF(env, "");
|
return (*env)->NewStringUTF(env, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_com_tutpro_baresip_Api_account_1answermode(JNIEnv *env, jobject thiz, jstring jAcc) {
|
||||||
|
const char *native_acc = (*env)->GetStringUTFChars(env, jAcc, 0);
|
||||||
|
struct account *acc = (struct account *)strtoul(native_acc, NULL, 10);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jAcc, native_acc);
|
||||||
|
return account_answermode(acc);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_com_tutpro_baresip_Api_account_1set_1answermode(JNIEnv *env, jobject thiz,
|
||||||
|
jstring jAcc, jint jMode) {
|
||||||
|
const char *native_acc = (*env)->GetStringUTFChars(env, jAcc, 0);
|
||||||
|
struct account *acc = (struct account *)strtoul(native_acc, NULL, 10);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jAcc, native_acc);
|
||||||
|
const uint32_t mode = (uint32_t)jMode;
|
||||||
|
return account_set_answermode(acc, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_com_tutpro_baresip_Api_account_1dtmfmode(JNIEnv *env, jobject thiz, jstring jAcc) {
|
||||||
|
const char *native_acc = (*env)->GetStringUTFChars(env, jAcc, 0);
|
||||||
|
struct account *acc = (struct account *)strtoul(native_acc, NULL, 10);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jAcc, native_acc);
|
||||||
|
return account_dtmfmode(acc);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL
|
||||||
|
Java_com_tutpro_baresip_Api_account_1set_1dtmfmode(JNIEnv *env, jobject thiz,
|
||||||
|
jstring jAcc, jint jMode) {
|
||||||
|
const char *native_acc = (*env)->GetStringUTFChars(env, jAcc, 0);
|
||||||
|
struct account *acc = (struct account *)strtoul(native_acc, NULL, 10);
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jAcc, native_acc);
|
||||||
|
const uint32_t mode = (uint32_t)jMode;
|
||||||
|
return account_set_dtmfmode(acc, mode);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jstring JNICALL
|
JNIEXPORT jstring JNICALL
|
||||||
Java_com_tutpro_baresip_Api_account_1extra(JNIEnv *env, jobject thiz, jstring javaAcc)
|
Java_com_tutpro_baresip_Api_account_1extra(JNIEnv *env, jobject thiz, jstring javaAcc)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,7 +21,8 @@ class Account(val accp: String) {
|
|||||||
var regint = Api.account_regint(accp)
|
var regint = Api.account_regint(accp)
|
||||||
var mediaEnc = Api.account_mediaenc(accp)
|
var mediaEnc = Api.account_mediaenc(accp)
|
||||||
var preferIPv6Media = false
|
var preferIPv6Media = false
|
||||||
var answerMode = ""
|
var dtmfMode = Api.account_dtmfmode(accp)
|
||||||
|
var answerMode = Api.account_answermode(accp)
|
||||||
var vmUri = Api.account_vm_uri(accp)
|
var vmUri = Api.account_vm_uri(accp)
|
||||||
var vmNew = 0
|
var vmNew = 0
|
||||||
var vmOld = 0
|
var vmOld = 0
|
||||||
@@ -56,8 +57,6 @@ class Account(val accp: String) {
|
|||||||
|
|
||||||
val extra = Api.account_extra(accp)
|
val extra = Api.account_extra(accp)
|
||||||
preferIPv6Media = Utils.paramValue(extra,"prefer_ipv6_media") == "yes"
|
preferIPv6Media = Utils.paramValue(extra,"prefer_ipv6_media") == "yes"
|
||||||
answerMode = Utils.paramValue(extra,"answer_mode")
|
|
||||||
if (answerMode == "") answerMode = "manual"
|
|
||||||
callHistory = Utils.paramValue(extra,"call_history") == ""
|
callHistory = Utils.paramValue(extra,"call_history") == ""
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -114,6 +113,9 @@ class Account(val accp: String) {
|
|||||||
else
|
else
|
||||||
res = res + ";mwi=yes;vm_uri=\"$vmUri\""
|
res = res + ";mwi=yes;vm_uri=\"$vmUri\""
|
||||||
|
|
||||||
|
if (answerMode == Api.ANSWERMODE_AUTO)
|
||||||
|
res += ";answermode=auto"
|
||||||
|
|
||||||
res += ";ptime=20;regint=${regint};regq=0.5;pubint=0;call_transfer=yes"
|
res += ";ptime=20;regint=${regint};regq=0.5;pubint=0;call_transfer=yes"
|
||||||
|
|
||||||
var extra = ""
|
var extra = ""
|
||||||
@@ -121,9 +123,6 @@ class Account(val accp: String) {
|
|||||||
if (!callHistory)
|
if (!callHistory)
|
||||||
extra += ";call_history=no"
|
extra += ";call_history=no"
|
||||||
|
|
||||||
if (answerMode == "auto")
|
|
||||||
extra += ";answer_mode=auto"
|
|
||||||
|
|
||||||
if (preferIPv6Media)
|
if (preferIPv6Media)
|
||||||
extra += ";prefer_ipv6_media=yes"
|
extra += ";prefer_ipv6_media=yes"
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
private lateinit var mediaEnc: String
|
private lateinit var mediaEnc: String
|
||||||
private lateinit var mediaEncSpinner: Spinner
|
private lateinit var mediaEncSpinner: Spinner
|
||||||
private lateinit var ipV6MediaCheck: CheckBox
|
private lateinit var ipV6MediaCheck: CheckBox
|
||||||
private lateinit var answerMode: String
|
private var dtmfMode = Api.DTMFMODE_RTP_EVENT
|
||||||
|
private lateinit var dtmfModeSpinner: Spinner
|
||||||
|
private var answerMode = Api.ANSWERMODE_MANUAL
|
||||||
private lateinit var answerModeSpinner: Spinner
|
private lateinit var answerModeSpinner: Spinner
|
||||||
private lateinit var vmUri: EditText
|
private lateinit var vmUri: EditText
|
||||||
private lateinit var defaultCheck: CheckBox
|
private lateinit var defaultCheck: CheckBox
|
||||||
@@ -74,6 +76,7 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
stunPass = binding.StunPass
|
stunPass = binding.StunPass
|
||||||
mediaEncSpinner = binding.mediaEncSpinner
|
mediaEncSpinner = binding.mediaEncSpinner
|
||||||
ipV6MediaCheck = binding.PreferIPv6Media
|
ipV6MediaCheck = binding.PreferIPv6Media
|
||||||
|
dtmfModeSpinner = binding.dtmfModeSpinner
|
||||||
answerModeSpinner = binding.answerModeSpinner
|
answerModeSpinner = binding.answerModeSpinner
|
||||||
vmUri = binding.voicemailUri
|
vmUri = binding.voicemailUri
|
||||||
defaultCheck = binding.Default
|
defaultCheck = binding.Default
|
||||||
@@ -181,8 +184,29 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
ipV6MediaCheck.isChecked = acc.preferIPv6Media
|
ipV6MediaCheck.isChecked = acc.preferIPv6Media
|
||||||
|
|
||||||
|
dtmfMode = acc.dtmfMode
|
||||||
|
val dtmfModeKeys = arrayListOf(Api.DTMFMODE_RTP_EVENT, Api.DTMFMODE_SIP_INFO)
|
||||||
|
val dtmfModeVals = arrayListOf(getString(R.string.dtmf_inband), getString(R.string.dtmf_info))
|
||||||
|
keyIx = dtmfModeKeys.indexOf(acc.dtmfMode)
|
||||||
|
keyVal = dtmfModeVals.elementAt(keyIx)
|
||||||
|
dtmfModeKeys.removeAt(keyIx)
|
||||||
|
dtmfModeVals.removeAt(keyIx)
|
||||||
|
dtmfModeKeys.add(0, acc.dtmfMode)
|
||||||
|
dtmfModeVals.add(0, keyVal)
|
||||||
|
val dtmfModeAdapter = ArrayAdapter(this,android.R.layout.simple_spinner_item,
|
||||||
|
dtmfModeVals)
|
||||||
|
dtmfModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
|
||||||
|
dtmfModeSpinner.adapter = dtmfModeAdapter
|
||||||
|
dtmfModeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||||
|
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
|
||||||
|
dtmfMode = dtmfModeKeys[dtmfModeVals.indexOf(parent.selectedItem.toString())]
|
||||||
|
}
|
||||||
|
override fun onNothingSelected(parent: AdapterView<*>) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
answerMode = acc.answerMode
|
answerMode = acc.answerMode
|
||||||
val answerModeKeys = arrayListOf("manual", "auto")
|
val answerModeKeys = arrayListOf(Api.ANSWERMODE_MANUAL, Api.ANSWERMODE_AUTO)
|
||||||
val answerModeVals = arrayListOf(getString(R.string.manual), getString(R.string.auto))
|
val answerModeVals = arrayListOf(getString(R.string.manual), getString(R.string.auto))
|
||||||
keyIx = answerModeKeys.indexOf(acc.answerMode)
|
keyIx = answerModeKeys.indexOf(acc.answerMode)
|
||||||
keyVal = answerModeVals.elementAt(keyIx)
|
keyVal = answerModeVals.elementAt(keyIx)
|
||||||
@@ -436,10 +460,24 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
save = true
|
save = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dtmfMode != acc.dtmfMode) {
|
||||||
|
if (Api.account_set_dtmfmode(acc.accp, dtmfMode) == 0) {
|
||||||
|
acc.dtmfMode = Api.account_dtmfmode(acc.accp)
|
||||||
|
Log.d(TAG, "New dtmfmode is ${acc.dtmfMode}")
|
||||||
|
save = true
|
||||||
|
} else {
|
||||||
|
Log.e(TAG, "Setting of dtmfmode $dtmfMode failed")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (answerMode != acc.answerMode) {
|
if (answerMode != acc.answerMode) {
|
||||||
acc.answerMode = answerMode
|
if (Api.account_set_answermode(acc.accp, answerMode) == 0) {
|
||||||
|
acc.answerMode = Api.account_answermode(acc.accp)
|
||||||
Log.d(TAG, "New answermode is ${acc.answerMode}")
|
Log.d(TAG, "New answermode is ${acc.answerMode}")
|
||||||
save = true
|
save = true
|
||||||
|
} else {
|
||||||
|
Log.e(TAG, "Setting of answermode $answerMode failed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var tVmUri = vmUri.text.toString().trim()
|
var tVmUri = vmUri.text.toString().trim()
|
||||||
@@ -562,6 +600,10 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
Utils.alertView(this, getString(R.string.prefer_ipv6_media),
|
Utils.alertView(this, getString(R.string.prefer_ipv6_media),
|
||||||
getString(R.string.prefer_ipv6_media_help))
|
getString(R.string.prefer_ipv6_media_help))
|
||||||
}
|
}
|
||||||
|
binding.DtmfModeTitle -> {
|
||||||
|
Utils.alertView(this, getString(R.string.dtmf_mode),
|
||||||
|
getString(R.string.dtmf_mode_help))
|
||||||
|
}
|
||||||
binding.AnswerModeTitle -> {
|
binding.AnswerModeTitle -> {
|
||||||
Utils.alertView(this, getString(R.string.answer_mode),
|
Utils.alertView(this, getString(R.string.answer_mode),
|
||||||
getString(R.string.answer_mode_help))
|
getString(R.string.answer_mode_help))
|
||||||
@@ -649,9 +691,20 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
acc.stunServer = text
|
acc.stunServer = text
|
||||||
"prefer-ipv6-media" ->
|
"prefer-ipv6-media" ->
|
||||||
acc.preferIPv6Media = text == "yes"
|
acc.preferIPv6Media = text == "yes"
|
||||||
|
"dtmf-mode" ->
|
||||||
|
if (text in arrayOf("rtp-event", "sip-info")) {
|
||||||
|
acc.dtmfMode = if (text == "rtp-event")
|
||||||
|
Api.DTMFMODE_RTP_EVENT
|
||||||
|
else
|
||||||
|
Api.DTMFMODE_SIP_INFO
|
||||||
|
}
|
||||||
"answer-mode" ->
|
"answer-mode" ->
|
||||||
if (text in arrayOf("manual", "auto"))
|
if (text in arrayOf("manual", "auto")) {
|
||||||
acc.answerMode = text
|
acc.answerMode = if (text == "manual")
|
||||||
|
Api.ANSWERMODE_MANUAL
|
||||||
|
else
|
||||||
|
Api.ANSWERMODE_AUTO
|
||||||
|
}
|
||||||
"voicemail-uri" ->
|
"voicemail-uri" ->
|
||||||
if (text.isNotEmpty())
|
if (text.isNotEmpty())
|
||||||
acc.vmUri = text
|
acc.vmUri = text
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ object Api {
|
|||||||
const val AF_INET6 = 10
|
const val AF_INET6 = 10
|
||||||
const val VIDMODE_OFF = 0
|
const val VIDMODE_OFF = 0
|
||||||
const val VIDMODE_ON = 1
|
const val VIDMODE_ON = 1
|
||||||
|
const val ANSWERMODE_MANUAL = 0
|
||||||
|
const val ANSWERMODE_AUTO = 2
|
||||||
|
const val DTMFMODE_RTP_EVENT = 0
|
||||||
|
const val DTMFMODE_SIP_INFO = 1
|
||||||
|
|
||||||
external fun account_set_display_name(acc: String, dn: String): Int
|
external fun account_set_display_name(acc: String, dn: String): Int
|
||||||
external fun account_display_name(acc: String): String
|
external fun account_display_name(acc: String): String
|
||||||
@@ -36,6 +40,10 @@ object Api {
|
|||||||
external fun account_set_video_codecs(acc: String, codecs: String): Int
|
external fun account_set_video_codecs(acc: String, codecs: String): Int
|
||||||
external fun account_set_mwi(acc: String, value: String): Int
|
external fun account_set_mwi(acc: String, value: String): Int
|
||||||
external fun account_vm_uri(acc: String): String
|
external fun account_vm_uri(acc: String): String
|
||||||
|
external fun account_answermode(acc: String): Int
|
||||||
|
external fun account_set_answermode(acc: String, mode: Int): Int
|
||||||
|
external fun account_dtmfmode(acc: String): Int
|
||||||
|
external fun account_set_dtmfmode(acc: String, mode: Int): Int
|
||||||
external fun account_extra(acc: String): String
|
external fun account_extra(acc: String): String
|
||||||
external fun account_debug(acc: String)
|
external fun account_debug(acc: String)
|
||||||
|
|
||||||
|
|||||||
@@ -530,7 +530,7 @@ class BaresipService: Service() {
|
|||||||
Log.d(LOG_TAG, "Incoming call $uap/$callp/$peerUri")
|
Log.d(LOG_TAG, "Incoming call $uap/$callp/$peerUri")
|
||||||
Call(callp, ua, peerUri, "in", "incoming",
|
Call(callp, ua, peerUri, "in", "incoming",
|
||||||
Utils.dtmfWatcher(callp)).add()
|
Utils.dtmfWatcher(callp)).add()
|
||||||
if (ua.account.answerMode == "manual") {
|
if (ua.account.answerMode == Api.ANSWERMODE_MANUAL) {
|
||||||
if (Build.VERSION.SDK_INT >= 23) {
|
if (Build.VERSION.SDK_INT >= 23) {
|
||||||
Log.d(LOG_TAG, "CurrentInterruptionFilter ${nm.currentInterruptionFilter}")
|
Log.d(LOG_TAG, "CurrentInterruptionFilter ${nm.currentInterruptionFilter}")
|
||||||
if (nm.currentInterruptionFilter <= NotificationManager.INTERRUPTION_FILTER_ALL)
|
if (nm.currentInterruptionFilter <= NotificationManager.INTERRUPTION_FILTER_ALL)
|
||||||
|
|||||||
@@ -277,6 +277,23 @@
|
|||||||
</CheckBox>
|
</CheckBox>
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/DtmfModeTitle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="10dp"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:onClick="onClick"
|
||||||
|
android:text="@string/dtmf_mode" >
|
||||||
|
</TextView>
|
||||||
|
|
||||||
|
<Spinner
|
||||||
|
android:id="@+id/dtmfModeSpinner"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="8dp" >
|
||||||
|
</Spinner>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/AnswerModeTitle"
|
android:id="@+id/AnswerModeTitle"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
|||||||
@@ -178,6 +178,10 @@
|
|||||||
se on käytettävissä), jos puhelun molempien osapuolten tukemaa mediaprotokollaa
|
se on käytettävissä), jos puhelun molempien osapuolten tukemaa mediaprotokollaa
|
||||||
ei saada automaattisesti selvitettyä.
|
ei saada automaattisesti selvitettyä.
|
||||||
</string>
|
</string>
|
||||||
|
<string name="dtmf_mode">DTMF-moodi</string>
|
||||||
|
<string name="dtmf_mode_help">Valitsee miten DTMF-merkit 0–9, #, * ja A-D lähetetään.</string>
|
||||||
|
<string name="dtmf_inband">RTP-tapahtumina</string>
|
||||||
|
<string name="dtmf_info">SIP INFO-pyyntöinä</string>
|
||||||
<string name="answer_mode">Vastaustapa</string>
|
<string name="answer_mode">Vastaustapa</string>
|
||||||
<string name="answer_mode_help">Valitsee tulevien puheluiden vastaustavan.</string>
|
<string name="answer_mode_help">Valitsee tulevien puheluiden vastaustavan.</string>
|
||||||
<string name="manual">Manuaalinen</string>
|
<string name="manual">Manuaalinen</string>
|
||||||
|
|||||||
@@ -166,6 +166,10 @@
|
|||||||
</string>
|
</string>
|
||||||
<string name="prefer_ipv6_media">Prefer IPv6 Media</string>
|
<string name="prefer_ipv6_media">Prefer IPv6 Media</string>
|
||||||
<string name="prefer_ipv6_media_help">If checked, offer to use IPv6 media protocol (if available) when media protocol of peer cannot be automatically determined.</string>
|
<string name="prefer_ipv6_media_help">If checked, offer to use IPv6 media protocol (if available) when media protocol of peer cannot be automatically determined.</string>
|
||||||
|
<string name="dtmf_mode">DTMF Mode</string>
|
||||||
|
<string name="dtmf_mode_help">Selects how DTMF tones 0–9, #, *, and A-D are sent.</string>
|
||||||
|
<string name="dtmf_inband">In-band RTP Events</string>
|
||||||
|
<string name="dtmf_info">SIP INFO Requests</string>
|
||||||
<string name="answer_mode">Answer Mode</string>
|
<string name="answer_mode">Answer Mode</string>
|
||||||
<string name="answer_mode_help">Selects how incoming calls are answered.</string>
|
<string name="answer_mode_help">Selects how incoming calls are answered.</string>
|
||||||
<string name="manual">Manual</string>
|
<string name="manual">Manual</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user