Merge pull request #52 from juha-h/auto

- Added Answer Mode (Manual or Automatic) account configuration option.
This commit is contained in:
juha-h
2019-09-17 17:35:53 +03:00
committed by GitHub
8 changed files with 94 additions and 31 deletions
+4 -26
View File
@@ -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"
+4
View File
@@ -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
+4
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 \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.