- Added Answer Mode (Manual or Automatic) account configuration option.
This commit is contained in:
@@ -923,41 +923,19 @@ Java_com_tutpro_baresip_AccountKt_account_1vm_1uri(JNIEnv *env, jobject thiz, js
|
|||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jstring JNICALL
|
JNIEXPORT jstring JNICALL
|
||||||
Java_com_tutpro_baresip_AccountKt_account_1answermode(JNIEnv *env, jobject thiz, jstring javaAcc)
|
Java_com_tutpro_baresip_AccountKt_account_1extra(JNIEnv *env, jobject thiz, jstring javaAcc)
|
||||||
{
|
{
|
||||||
const char *native_acc = (*env)->GetStringUTFChars(env, javaAcc, 0);
|
const char *native_acc = (*env)->GetStringUTFChars(env, javaAcc, 0);
|
||||||
struct account *acc = (struct account *) strtoul(native_acc, NULL, 10);
|
struct account *acc = (struct account *) strtoul(native_acc, NULL, 10);
|
||||||
(*env)->ReleaseStringUTFChars(env, javaAcc, native_acc);
|
(*env)->ReleaseStringUTFChars(env, javaAcc, native_acc);
|
||||||
if (acc) {
|
if (acc) {
|
||||||
enum answermode am = account_answermode(acc);
|
const char *extra = account_extra(acc);
|
||||||
if (am == ANSWERMODE_EARLY)
|
if (extra)
|
||||||
return (*env)->NewStringUTF(env, "early");
|
return (*env)->NewStringUTF(env, extra);
|
||||||
if (am == ANSWERMODE_AUTO)
|
|
||||||
return (*env)->NewStringUTF(env, "auto");
|
|
||||||
return (*env)->NewStringUTF(env, "manual");
|
|
||||||
}
|
}
|
||||||
return (*env)->NewStringUTF(env, "");
|
return (*env)->NewStringUTF(env, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL
|
|
||||||
Java_com_tutpro_baresip_AccountKt_account_1set_1answermode(JNIEnv *env, jobject thiz,
|
|
||||||
jstring javaAcc, jstring javaAnswerMode) {
|
|
||||||
const char *native_acc = (*env)->GetStringUTFChars(env, javaAcc, 0);
|
|
||||||
struct account *acc = (struct account *)strtoul(native_acc, NULL, 10);
|
|
||||||
(*env)->ReleaseStringUTFChars(env, javaAcc, native_acc);
|
|
||||||
const char *mode = (*env)->GetStringUTFChars(env, javaAnswerMode, 0);
|
|
||||||
int res, am;
|
|
||||||
if (strcmp(mode, "early") == 0)
|
|
||||||
am = ANSWERMODE_EARLY;
|
|
||||||
else if (strcmp(mode, "auto") == 0)
|
|
||||||
am = ANSWERMODE_AUTO;
|
|
||||||
else
|
|
||||||
am = ANSWERMODE_MANUAL;
|
|
||||||
(*env)->ReleaseStringUTFChars(env, javaAnswerMode, mode);
|
|
||||||
res = account_set_answermode(acc, am);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT jstring JNICALL
|
JNIEXPORT jstring JNICALL
|
||||||
Java_com_tutpro_baresip_Api_ua_1alloc(JNIEnv *env, jobject thiz, jstring javaUri) {
|
Java_com_tutpro_baresip_Api_ua_1alloc(JNIEnv *env, jobject thiz, jstring javaUri) {
|
||||||
const char *uri = (*env)->GetStringUTFChars(env, javaUri, 0);
|
const char *uri = (*env)->GetStringUTFChars(env, javaUri, 0);
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class Account(val accp: String) {
|
|||||||
var audioCodec = ArrayList<String>()
|
var audioCodec = ArrayList<String>()
|
||||||
var regint = account_regint(accp)
|
var regint = account_regint(accp)
|
||||||
var mediaEnc = account_mediaenc(accp)
|
var mediaEnc = account_mediaenc(accp)
|
||||||
|
var answerMode = ""
|
||||||
var vmUri = account_vm_uri(accp)
|
var vmUri = account_vm_uri(accp)
|
||||||
var vmNew = 0
|
var vmNew = 0
|
||||||
var vmOld = 0
|
var vmOld = 0
|
||||||
@@ -49,6 +50,8 @@ class Account(val accp: String) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
answerMode = Utils.paramValue(account_extra(accp),"answer_mode")
|
||||||
|
if (answerMode == "") answerMode = "manual"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun print() : String {
|
fun print() : String {
|
||||||
@@ -95,7 +98,8 @@ class Account(val accp: String) {
|
|||||||
else
|
else
|
||||||
res = res + ";vm_uri=\"$vmUri\""
|
res = res + ";vm_uri=\"$vmUri\""
|
||||||
|
|
||||||
res = res + ";ptime=20;regint=${regint};regq=0.5;pubint=0;answermode=manual;call_transfer=yes"
|
res += ";ptime=20;regint=${regint};regq=0.5;pubint=0;call_transfer=yes"
|
||||||
|
if (answerMode == "auto") res += ";extra=\"answer_mode=auto\""
|
||||||
|
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
@@ -188,3 +192,4 @@ external fun account_set_medianat(acc: String, medianat: String): Int
|
|||||||
external fun account_set_audio_codecs(acc: String, codecs: String): Int
|
external fun account_set_audio_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_extra(acc: String): String
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
internal lateinit var stunServer: EditText
|
internal lateinit var stunServer: EditText
|
||||||
internal lateinit var regCheck: CheckBox
|
internal lateinit var regCheck: CheckBox
|
||||||
internal lateinit var mediaEnc: String
|
internal lateinit var mediaEnc: String
|
||||||
|
internal lateinit var answerMode: String
|
||||||
internal lateinit var vmUri: EditText
|
internal lateinit var vmUri: EditText
|
||||||
internal lateinit var defaultCheck: CheckBox
|
internal lateinit var defaultCheck: CheckBox
|
||||||
|
|
||||||
@@ -147,6 +148,28 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
answerMode = acc.answerMode
|
||||||
|
val answerModeSpinner = findViewById(R.id.answerModeSpinner) as Spinner
|
||||||
|
val answerModeKeys = arrayListOf("manual", "auto")
|
||||||
|
val answerModeVals = arrayListOf(getString(R.string.manual), getString(R.string.auto))
|
||||||
|
keyIx = answerModeKeys.indexOf(acc.answerMode)
|
||||||
|
keyVal = answerModeVals.elementAt(keyIx)
|
||||||
|
answerModeKeys.removeAt(keyIx)
|
||||||
|
answerModeVals.removeAt(keyIx)
|
||||||
|
answerModeKeys.add(0, acc.answerMode)
|
||||||
|
answerModeVals.add(0, keyVal)
|
||||||
|
val answerModeAdapter = ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,
|
||||||
|
answerModeVals)
|
||||||
|
answerModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
|
||||||
|
answerModeSpinner.adapter = answerModeAdapter
|
||||||
|
answerModeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||||
|
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
|
||||||
|
answerMode = answerModeKeys[answerModeVals.indexOf(parent.selectedItem.toString())]
|
||||||
|
}
|
||||||
|
override fun onNothingSelected(parent: AdapterView<*>) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
vmUri = findViewById(R.id.voicemailUri) as EditText
|
vmUri = findViewById(R.id.voicemailUri) as EditText
|
||||||
vmUri.setText(acc.vmUri)
|
vmUri.setText(acc.vmUri)
|
||||||
|
|
||||||
@@ -343,6 +366,12 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (answerMode != acc.answerMode) {
|
||||||
|
acc.answerMode = answerMode
|
||||||
|
Log.d("Baresip", "New answermode is ${acc.answerMode}")
|
||||||
|
save = true
|
||||||
|
}
|
||||||
|
|
||||||
var vmUri = voicemailUri.text.toString().trim()
|
var vmUri = voicemailUri.text.toString().trim()
|
||||||
if (vmUri != acc.vmUri) {
|
if (vmUri != acc.vmUri) {
|
||||||
if (vmUri != "") {
|
if (vmUri != "") {
|
||||||
@@ -432,6 +461,10 @@ class AccountActivity : AppCompatActivity() {
|
|||||||
Utils.alertView(this, getString(R.string.media_encryption),
|
Utils.alertView(this, getString(R.string.media_encryption),
|
||||||
getString(R.string.media_encryption_help))
|
getString(R.string.media_encryption_help))
|
||||||
}
|
}
|
||||||
|
findViewById(R.id.AnswerModeTitle) as TextView -> {
|
||||||
|
Utils.alertView(this, getString(R.string.answer_mode),
|
||||||
|
getString(R.string.answer_mode_help))
|
||||||
|
}
|
||||||
findViewById(R.id.VoicemailUriTitle) as TextView -> {
|
findViewById(R.id.VoicemailUriTitle) as TextView -> {
|
||||||
Utils.alertView(this, getString(R.string.voicemail_uri),
|
Utils.alertView(this, getString(R.string.voicemail_uri),
|
||||||
getString(R.string.voicemain_uri_help))
|
getString(R.string.voicemain_uri_help))
|
||||||
|
|||||||
@@ -412,12 +412,22 @@ class BaresipService: Service() {
|
|||||||
Log.d(LOG_TAG, "Incoming call $uap/$callp/$peerUri")
|
Log.d(LOG_TAG, "Incoming call $uap/$callp/$peerUri")
|
||||||
calls.add(Call(callp, ua, peerUri, "in", "incoming",
|
calls.add(Call(callp, ua, peerUri, "in", "incoming",
|
||||||
Utils.dtmfWatcher(callp)))
|
Utils.dtmfWatcher(callp)))
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (ua.account.answerMode == "manual") {
|
||||||
Log.d(LOG_TAG, "CurrentInterruptionFilter ${nm.currentInterruptionFilter}")
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
if (nm.currentInterruptionFilter <= NotificationManager.INTERRUPTION_FILTER_ALL)
|
Log.d(LOG_TAG, "CurrentInterruptionFilter ${nm.currentInterruptionFilter}")
|
||||||
|
if (nm.currentInterruptionFilter <= NotificationManager.INTERRUPTION_FILTER_ALL)
|
||||||
|
startRinging()
|
||||||
|
} else {
|
||||||
startRinging()
|
startRinging()
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
startRinging()
|
val newIntent = Intent(this, MainActivity::class.java)
|
||||||
|
newIntent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP or
|
||||||
|
Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
newIntent.putExtra("action", "call answer")
|
||||||
|
newIntent.putExtra("callp", callp)
|
||||||
|
startActivity(newIntent)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!Utils.isVisible()) {
|
if (!Utils.isVisible()) {
|
||||||
|
|||||||
@@ -235,6 +235,17 @@ object Utils {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun paramValue(params: String, name: String): String {
|
||||||
|
if (params == "") return ""
|
||||||
|
for (param in params.split(";")) {
|
||||||
|
val nameValue = param.split("=")
|
||||||
|
if (nameValue.size == 2) {
|
||||||
|
if (nameValue[0] == name) return nameValue[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
fun checkHostPortParams(hpp: String) : Boolean {
|
fun checkHostPortParams(hpp: String) : Boolean {
|
||||||
val restParams = hpp.split(";", limit = 2)
|
val restParams = hpp.split(";", limit = 2)
|
||||||
if (restParams.size == 1)
|
if (restParams.size == 1)
|
||||||
|
|||||||
@@ -210,6 +210,24 @@
|
|||||||
android:paddingTop="8dp" >
|
android:paddingTop="8dp" >
|
||||||
</Spinner>
|
</Spinner>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/AnswerModeTitle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="10dp"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:textColor="@android:color/black"
|
||||||
|
android:onClick="onClick"
|
||||||
|
android:text="@string/answer_mode" >
|
||||||
|
</TextView>
|
||||||
|
|
||||||
|
<Spinner
|
||||||
|
android:id="@+id/answerModeSpinner"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="8dp" >
|
||||||
|
</Spinner>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/VoicemailUriTitle"
|
android:id="@+id/VoicemailUriTitle"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
|||||||
@@ -84,6 +84,10 @@
|
|||||||
lähteviin puheluihin ja että RTP/SAVP- tai RTP/SAVPF-protokollaa
|
lähteviin puheluihin ja että RTP/SAVP- tai RTP/SAVPF-protokollaa
|
||||||
käytetään, jos sellaista tarjotaan tulevissa puheluissa.
|
käytetään, jos sellaista tarjotaan tulevissa puheluissa.
|
||||||
</string>
|
</string>
|
||||||
|
<string name="answer_mode">Vastaustapa</string>
|
||||||
|
<string name="answer_mode_help">Valitsee tulevien puheluiden vastaustavan.</string>
|
||||||
|
<string name="manual">Manuaalinen</string>
|
||||||
|
<string name="auto">Automaattinen</string>
|
||||||
<string name="voicemail_uri">Puhepostin URI</string>
|
<string name="voicemail_uri">Puhepostin URI</string>
|
||||||
<string name="voicemain_uri_help">SIP URI, jota käytetään
|
<string name="voicemain_uri_help">SIP URI, jota käytetään
|
||||||
puhepostiviestien kuunteluun. Jos URI:a ei ole annettu, tietoa
|
puhepostiviestien kuunteluun. Jos URI:a ei ole annettu, tietoa
|
||||||
|
|||||||
@@ -75,6 +75,10 @@
|
|||||||
\n • SRTP means that RTP/AVP is offered in outgoing call and that RTP/SAVP or RTP/SAVPF is used
|
\n • SRTP means that RTP/AVP is offered in outgoing call and that RTP/SAVP or RTP/SAVPF is used
|
||||||
if offered in incoming call.
|
if offered in incoming call.
|
||||||
</string>
|
</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>
|
||||||
|
<string name="auto">Automatic</string>
|
||||||
<string name="voicemail_uri">Voicemail URI</string>
|
<string name="voicemail_uri">Voicemail URI</string>
|
||||||
<string name="voicemain_uri_help">SIP URI for checking of voicemail messages. If left empty, voicemail
|
<string name="voicemain_uri_help">SIP URI for checking of voicemail messages. If left empty, voicemail
|
||||||
messages (Message Waiting Indications) are not subscribed to.
|
messages (Message Waiting Indications) are not subscribed to.
|
||||||
|
|||||||
Reference in New Issue
Block a user