- Added Answer Mode (Manual or Automatic) account configuration option.

This commit is contained in:
Juha Heinanen
2019-09-17 17:31:53 +03:00
parent 12204d56b7
commit 84bc1252db
8 changed files with 94 additions and 31 deletions

View File

@ -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);

View File

@ -14,6 +14,7 @@ class Account(val accp: String) {
var audioCodec = ArrayList<String>()
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

View File

@ -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<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.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))

View File

@ -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()) {

View File

@ -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)

View File

@ -210,6 +210,24 @@
android:paddingTop="8dp" >
</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
android:id="@+id/VoicemailUriTitle"
android:layout_width="wrap_content"

View File

@ -84,6 +84,10 @@
lähteviin puheluihin ja että RTP/SAVP- tai RTP/SAVPF-protokollaa
käytetään, jos sellaista tarjotaan tulevissa puheluissa.
</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="voicemain_uri_help">SIP URI, jota käytetään
puhepostiviestien kuunteluun. Jos URI:a ei ole annettu, tietoa

View File

@ -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.
</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="voicemain_uri_help">SIP URI for checking of voicemail messages. If left empty, voicemail
messages (Message Waiting Indications) are not subscribed to.