diff --git a/app/src/main/cpp/baresip.c b/app/src/main/cpp/baresip.c index 571925de..cce869b6 100644 --- a/app/src/main/cpp/baresip.c +++ b/app/src/main/cpp/baresip.c @@ -1167,6 +1167,25 @@ Java_com_tutpro_baresip_Api_call_1audio_1codecs(JNIEnv *env, jobject thiz, jstri return (*env)->NewStringUTF(env, codec_buf); } +JNIEXPORT jstring JNICALL +Java_com_tutpro_baresip_Api_call_1status(JNIEnv *env, jobject thiz, jstring javaCall) { + const char *native_call = (*env)->GetStringUTFChars(env, javaCall, 0); + (*env)->ReleaseStringUTFChars(env, javaCall, native_call); + struct call *call = (struct call *) strtoul(native_call, NULL, 10); + char status_buf[256]; + int len = re_snprintf(&(status_buf[0]), 256, "%H", call_status, call); + if (len != -1) { + if (len < 256) + status_buf[len] = '\0'; + else + status_buf[255] = '\0'; + } else { + LOGE("failed to get call status\n"); + status_buf[0] = '\0'; + } + return (*env)->NewStringUTF(env, status_buf); +} + JNIEXPORT jint JNICALL Java_com_tutpro_baresip_Api_message_1send(JNIEnv *env, jobject thiz, jstring javaUA, jstring javaPeer, jstring javaMsg, jstring javaTime) { diff --git a/app/src/main/kotlin/com/tutpro/baresip/Api.kt b/app/src/main/kotlin/com/tutpro/baresip/Api.kt index 12dc931b..fcf335b6 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Api.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Api.kt @@ -24,6 +24,7 @@ object Api { external fun call_start_audio(callp: String) external fun call_stop_audio(callp: String) external fun call_audio_codecs(callp: String): String + external fun call_status(callp: String): String external fun message_send(uap: String, peer_uri: String, message: String, time: String): Int external fun reload_config(): Int external fun cmd_exec(cmd: String): Int diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index 80a92a48..018f8883 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -44,6 +44,7 @@ class MainActivity : AppCompatActivity() { internal lateinit var callsButton: ImageButton internal lateinit var dialpadButton: ImageButton internal lateinit var dtmf: EditText + internal lateinit var infoButton: ImageButton internal lateinit var uaAdapter: UaSpinnerAdapter internal lateinit var aorSpinner: Spinner internal lateinit var am: AudioManager @@ -77,6 +78,7 @@ class MainActivity : AppCompatActivity() { rejectButton = findViewById(R.id.rejectButton) as ImageButton holdButton = findViewById(R.id.holdButton) as ImageButton dtmf = findViewById(R.id.dtmf) as EditText + infoButton = findViewById(R.id.info) as ImageButton voicemailButton = findViewById(R.id.voicemailButton) as ImageButton contactsButton = findViewById(R.id.contactsButton) as ImageButton messagesButton = findViewById(R.id.messagesButton) as ImageButton @@ -304,6 +306,27 @@ class MainActivity : AppCompatActivity() { dtmf.tag = ArrayList() + infoButton.setOnClickListener { + val ua = UserAgent.uas()[aorSpinner.selectedItemPosition] + val calls = Call.uaCalls(ua,"") + if (calls.size > 0) { + val status = Api.call_status(calls[0].callp) + val codecs = Api.call_audio_codecs(calls[0].callp) + if (status.contains('[') && status.contains(']') && + status.contains('=') && codecs.contains(',')) { + val duration = status.split("[")[1].split("]")[0] + val rate = status.split('=')[1] + val txCodec = codecs.split(',')[0].split("/") + val rxCodec = codecs.split(',')[1].split("/") + Utils.alertView(this, "Call Info", + "Duration: $duration\n" + + "Codecs: ${txCodec[0]} ch ${txCodec[2]}/" + + "${rxCodec[0]} ch ${rxCodec[2]}\n" + + "Rate: $rate") + } + } + } + voicemailButton.setOnClickListener { if (aorSpinner.selectedItemPosition >= 0) { val ua = UserAgent.uas()[aorSpinner.selectedItemPosition] @@ -466,6 +489,7 @@ class MainActivity : AppCompatActivity() { rejectButton.isEnabled = true holdButton.visibility = View.INVISIBLE dtmf.visibility = View.INVISIBLE + infoButton.visibility = View.INVISIBLE } if (Utils.isVisible()) { Log.d("Baresip", "Baresip is visible") @@ -504,6 +528,7 @@ class MainActivity : AppCompatActivity() { dtmf.hint = "DTMF" dtmf.visibility = View.VISIBLE dtmf.requestFocus() + infoButton.visibility = View.VISIBLE } (dtmf.tag as ArrayList).add(call.dtmfWatcher!!) dtmf.addTextChangedListener(call.dtmfWatcher) @@ -965,6 +990,8 @@ class MainActivity : AppCompatActivity() { rejectButton.visibility = View.INVISIBLE holdButton.visibility = View.INVISIBLE dtmf.visibility = View.INVISIBLE + infoButton.visibility = View.INVISIBLE + } else { Log.w("Baresip", "ua_connect ${ua.uap}/$uri failed") callButton.visibility = View.VISIBLE @@ -1025,6 +1052,7 @@ class MainActivity : AppCompatActivity() { rejectButton.visibility = View.INVISIBLE holdButton.visibility = View.INVISIBLE dtmf.visibility = View.INVISIBLE + infoButton.visibility = View.INVISIBLE } else { val callsOut = Call.uaCalls(ua, "out") val callsIn = Call.uaCalls(ua, "in") @@ -1050,6 +1078,7 @@ class MainActivity : AppCompatActivity() { rejectButton.visibility = View.INVISIBLE holdButton.visibility = View.INVISIBLE dtmf.visibility = View.INVISIBLE + infoButton.visibility = View.INVISIBLE } "incoming" -> { securityButton.visibility = View.INVISIBLE @@ -1061,6 +1090,7 @@ class MainActivity : AppCompatActivity() { rejectButton.isEnabled = true holdButton.visibility = View.INVISIBLE dtmf.visibility = View.INVISIBLE + infoButton.visibility = View.INVISIBLE if (answerCall == call.callp) { answerCall = "" answerButton.performClick() @@ -1091,6 +1121,7 @@ class MainActivity : AppCompatActivity() { holdButton.visibility = View.VISIBLE dtmf.visibility = View.VISIBLE dtmf.requestFocus() + infoButton.visibility = View.VISIBLE } } } diff --git a/app/src/main/res/drawable/info.xml b/app/src/main/res/drawable/info.xml new file mode 100644 index 00000000..7a4d600d --- /dev/null +++ b/app/src/main/res/drawable/info.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ddd5e79d..20eed8ce 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -144,6 +144,19 @@ android:visibility="invisible" > + + +