- 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, "");
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
@ -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"
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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 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_help">Valitsee tulevien puheluiden vastaustavan.</string>
|
||||
<string name="manual">Manuaalinen</string>
|
||||
|
||||
@ -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 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_help">Selects how incoming calls are answered.</string>
|
||||
<string name="manual">Manual</string>
|
||||
|
||||
Reference in New Issue
Block a user