- Added DTMF Mode account setting

- Better implementation of Answer Mode account setting
This commit is contained in:
Juha Heinanen
2021-03-11 18:01:57 +02:00
parent 6ce4064696
commit 73498c4f7c
8 changed files with 135 additions and 14 deletions
+36
View File
@@ -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) {
Log.d(TAG, "New answermode is ${acc.answerMode}") acc.answerMode = Api.account_answermode(acc.accp)
save = true Log.d(TAG, "New answermode is ${acc.answerMode}")
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"
+4
View File
@@ -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 09, #, * 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>
+4
View File
@@ -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 09, #, *, 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>