diff --git a/app/src/main/cpp/baresip.c b/app/src/main/cpp/baresip.c index 92015557..fe48f492 100644 --- a/app/src/main/cpp/baresip.c +++ b/app/src/main/cpp/baresip.c @@ -923,41 +923,19 @@ Java_com_tutpro_baresip_AccountKt_account_1vm_1uri(JNIEnv *env, jobject thiz, js } 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); struct account *acc = (struct account *) strtoul(native_acc, NULL, 10); (*env)->ReleaseStringUTFChars(env, javaAcc, native_acc); if (acc) { - enum answermode am = account_answermode(acc); - if (am == ANSWERMODE_EARLY) - return (*env)->NewStringUTF(env, "early"); - if (am == ANSWERMODE_AUTO) - return (*env)->NewStringUTF(env, "auto"); - return (*env)->NewStringUTF(env, "manual"); + const char *extra = account_extra(acc); + if (extra) + return (*env)->NewStringUTF(env, extra); } 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 Java_com_tutpro_baresip_Api_ua_1alloc(JNIEnv *env, jobject thiz, jstring javaUri) { const char *uri = (*env)->GetStringUTFChars(env, javaUri, 0); diff --git a/app/src/main/kotlin/com/tutpro/baresip/Account.kt b/app/src/main/kotlin/com/tutpro/baresip/Account.kt index 51fa581f..60c93dcc 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Account.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Account.kt @@ -14,6 +14,7 @@ class Account(val accp: String) { var audioCodec = ArrayList() var regint = account_regint(accp) var mediaEnc = account_mediaenc(accp) + var answerMode = "" var vmUri = account_vm_uri(accp) var vmNew = 0 var vmOld = 0 @@ -49,6 +50,8 @@ class Account(val accp: String) { break } } + answerMode = Utils.paramValue(account_extra(accp),"answer_mode") + if (answerMode == "") answerMode = "manual" } fun print() : String { @@ -95,7 +98,8 @@ class Account(val accp: String) { else 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 } @@ -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_mwi(acc: String, value: String): Int external fun account_vm_uri(acc: String): String +external fun account_extra(acc: String): String diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt index 1bba6674..0617a065 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt @@ -26,6 +26,7 @@ class AccountActivity : AppCompatActivity() { internal lateinit var stunServer: EditText internal lateinit var regCheck: CheckBox internal lateinit var mediaEnc: String + internal lateinit var answerMode: String internal lateinit var vmUri: EditText 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(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.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() if (vmUri != acc.vmUri) { if (vmUri != "") { @@ -432,6 +461,10 @@ class AccountActivity : AppCompatActivity() { Utils.alertView(this, getString(R.string.media_encryption), 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 -> { Utils.alertView(this, getString(R.string.voicemail_uri), getString(R.string.voicemain_uri_help)) diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index cb580582..01ab1601 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -412,12 +412,22 @@ class BaresipService: Service() { Log.d(LOG_TAG, "Incoming call $uap/$callp/$peerUri") calls.add(Call(callp, ua, peerUri, "in", "incoming", Utils.dtmfWatcher(callp))) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - Log.d(LOG_TAG, "CurrentInterruptionFilter ${nm.currentInterruptionFilter}") - if (nm.currentInterruptionFilter <= NotificationManager.INTERRUPTION_FILTER_ALL) + if (ua.account.answerMode == "manual") { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Log.d(LOG_TAG, "CurrentInterruptionFilter ${nm.currentInterruptionFilter}") + if (nm.currentInterruptionFilter <= NotificationManager.INTERRUPTION_FILTER_ALL) + startRinging() + } else { startRinging() + } } 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()) { diff --git a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt index 27b4dc2d..58833e63 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt @@ -235,6 +235,17 @@ object Utils { 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 { val restParams = hpp.split(";", limit = 2) if (restParams.size == 1) diff --git a/app/src/main/res/layout/activity_account.xml b/app/src/main/res/layout/activity_account.xml index ab16a1fe..e5ed8d25 100644 --- a/app/src/main/res/layout/activity_account.xml +++ b/app/src/main/res/layout/activity_account.xml @@ -210,6 +210,24 @@ android:paddingTop="8dp" > + + + + + + + Vastaustapa + Valitsee tulevien puheluiden vastaustavan. + Manuaalinen + Automaattinen Puhepostin URI SIP URI, jota käytetään puhepostiviestien kuunteluun. Jos URI:a ei ole annettu, tietoa diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f61372bb..4e55fcf5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -75,6 +75,10 @@ \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. + Answer Mode + Selects how incoming calls are answered. + Manual + Automatic Voicemail URI SIP URI for checking of voicemail messages. If left empty, voicemail messages (Message Waiting Indications) are not subscribed to.