- 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

View File

@ -1062,6 +1062,42 @@ Java_com_tutpro_baresip_Api_account_1vm_1uri(JNIEnv *env, jobject thiz, jstring
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
Java_com_tutpro_baresip_Api_account_1extra(JNIEnv *env, jobject thiz, jstring javaAcc)
{

View File

@ -21,7 +21,8 @@ class Account(val accp: String) {
var regint = Api.account_regint(accp)
var mediaEnc = Api.account_mediaenc(accp)
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 vmNew = 0
var vmOld = 0
@ -56,8 +57,6 @@ class Account(val accp: String) {
val extra = Api.account_extra(accp)
preferIPv6Media = Utils.paramValue(extra,"prefer_ipv6_media") == "yes"
answerMode = Utils.paramValue(extra,"answer_mode")
if (answerMode == "") answerMode = "manual"
callHistory = Utils.paramValue(extra,"call_history") == ""
}
@ -114,6 +113,9 @@ class Account(val accp: String) {
else
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"
var extra = ""
@ -121,9 +123,6 @@ class Account(val accp: String) {
if (!callHistory)
extra += ";call_history=no"
if (answerMode == "auto")
extra += ";answer_mode=auto"
if (preferIPv6Media)
extra += ";prefer_ipv6_media=yes"

View File

@ -39,7 +39,9 @@ class AccountActivity : AppCompatActivity() {
private lateinit var mediaEnc: String
private lateinit var mediaEncSpinner: Spinner
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 vmUri: EditText
private lateinit var defaultCheck: CheckBox
@ -74,6 +76,7 @@ class AccountActivity : AppCompatActivity() {
stunPass = binding.StunPass
mediaEncSpinner = binding.mediaEncSpinner
ipV6MediaCheck = binding.PreferIPv6Media
dtmfModeSpinner = binding.dtmfModeSpinner
answerModeSpinner = binding.answerModeSpinner
vmUri = binding.voicemailUri
defaultCheck = binding.Default
@ -181,8 +184,29 @@ class AccountActivity : AppCompatActivity() {
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
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))
keyIx = answerModeKeys.indexOf(acc.answerMode)
keyVal = answerModeVals.elementAt(keyIx)
@ -436,10 +460,24 @@ class AccountActivity : AppCompatActivity() {
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) {
acc.answerMode = answerMode
Log.d(TAG, "New answermode is ${acc.answerMode}")
save = true
if (Api.account_set_answermode(acc.accp, answerMode) == 0) {
acc.answerMode = Api.account_answermode(acc.accp)
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()
@ -562,6 +600,10 @@ class AccountActivity : AppCompatActivity() {
Utils.alertView(this, getString(R.string.prefer_ipv6_media),
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 -> {
Utils.alertView(this, getString(R.string.answer_mode),
getString(R.string.answer_mode_help))
@ -649,9 +691,20 @@ class AccountActivity : AppCompatActivity() {
acc.stunServer = text
"prefer-ipv6-media" ->
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" ->
if (text in arrayOf("manual", "auto"))
acc.answerMode = text
if (text in arrayOf("manual", "auto")) {
acc.answerMode = if (text == "manual")
Api.ANSWERMODE_MANUAL
else
Api.ANSWERMODE_AUTO
}
"voicemail-uri" ->
if (text.isNotEmpty())
acc.vmUri = text

View File

@ -7,6 +7,10 @@ object Api {
const val AF_INET6 = 10
const val VIDMODE_OFF = 0
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_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_mwi(acc: String, value: String): Int
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_debug(acc: String)

View File

@ -530,7 +530,7 @@ class BaresipService: Service() {
Log.d(LOG_TAG, "Incoming call $uap/$callp/$peerUri")
Call(callp, ua, peerUri, "in", "incoming",
Utils.dtmfWatcher(callp)).add()
if (ua.account.answerMode == "manual") {
if (ua.account.answerMode == Api.ANSWERMODE_MANUAL) {
if (Build.VERSION.SDK_INT >= 23) {
Log.d(LOG_TAG, "CurrentInterruptionFilter ${nm.currentInterruptionFilter}")
if (nm.currentInterruptionFilter <= NotificationManager.INTERRUPTION_FILTER_ALL)

View File

@ -277,6 +277,23 @@
</CheckBox>
</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
android:id="@+id/AnswerModeTitle"
android:layout_width="wrap_content"

View File

@ -178,6 +178,10 @@
se on käytettävissä), jos puhelun molempien osapuolten tukemaa mediaprotokollaa
ei saada automaattisesti selvitettyä.
</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_help">Valitsee tulevien puheluiden vastaustavan.</string>
<string name="manual">Manuaalinen</string>

View File

@ -166,6 +166,10 @@
</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="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_help">Selects how incoming calls are answered.</string>
<string name="manual">Manual</string>