diff --git a/app/build.gradle b/app/build.gradle
index 819eda03..467ee7e1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -8,8 +8,8 @@ android {
applicationId = 'com.tutpro.baresip'
minSdkVersion 21
targetSdkVersion 28
- versionCode = 59
- versionName = '7.2.0'
+ versionCode = 60
+ versionName = '7.3.0'
externalNativeBuild {
cmake {
cFlags '-DHAVE_INTTYPES_H'
diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt
index 6b451ddc..2b3df81c 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt
@@ -19,7 +19,7 @@ class AccountActivity : AppCompatActivity() {
internal lateinit var authPass: EditText
internal lateinit var outbound1: EditText
internal lateinit var outbound2: EditText
- internal lateinit var iceCheck: CheckBox
+ internal lateinit var mediaNat: String
internal lateinit var stunServer: EditText
internal lateinit var regCheck: CheckBox
internal lateinit var mediaEnc: String
@@ -57,15 +57,32 @@ class AccountActivity : AppCompatActivity() {
outbound2.setText(acc.outbound[1])
}
- iceCheck = findViewById(R.id.Ice) as CheckBox
- iceCheck.isChecked = acc.mediaNat == "ice"
- iceCheck.setOnClickListener {
- stunServer.isEnabled = iceCheck.isChecked
+ mediaNat = acc.mediaNat
+ val mediaNatSpinner = findViewById(R.id.mediaNatSpinner) as Spinner
+ val mediaNatKeys = arrayListOf("stun", "ice", "")
+ val mediaNatVals = arrayListOf("STUN", "ICE", "None")
+ var keyIx = mediaNatKeys.indexOf(acc.mediaNat)
+ var keyVal = mediaNatVals.elementAt(keyIx)
+ mediaNatKeys.removeAt(keyIx)
+ mediaNatVals.removeAt(keyIx)
+ mediaNatKeys.add(0, acc.mediaNat)
+ mediaNatVals.add(0, keyVal)
+ val mediaNatAdapter = ArrayAdapter(this,android.R.layout.simple_spinner_item,
+ mediaNatVals)
+ mediaNatAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
+ mediaNatSpinner.adapter = mediaNatAdapter
+ mediaNatSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
+ mediaNat = mediaNatKeys[mediaNatVals.indexOf(parent.selectedItem.toString())]
+ stunServer.isEnabled = mediaNat != ""
+ }
+ override fun onNothingSelected(parent: AdapterView<*>) {
+ }
}
stunServer = findViewById(R.id.StunServer) as EditText
stunServer.setText(acc.stunServer)
- stunServer.isEnabled = iceCheck.isChecked
+ stunServer.isEnabled = mediaNat != ""
regCheck = findViewById(R.id.Register) as CheckBox
regCheck.isChecked = acc.regint > 0
@@ -110,8 +127,8 @@ class AccountActivity : AppCompatActivity() {
val mediaEncSpinner = findViewById(R.id.mediaEncSpinner) as Spinner
val mediaEncKeys = arrayListOf("zrtp", "dtls_srtp", "srtp-mandf", "srtp-mand", "srtp", "")
val mediaEncVals = arrayListOf("ZRTP", "DTLS-SRTPF", "SRTP-MANDF", "SRTP-MAND", "SRTP", "None")
- val keyIx = mediaEncKeys.indexOf(acc.mediaEnc)
- val keyVal = mediaEncVals.elementAt(keyIx)
+ keyIx = mediaEncKeys.indexOf(acc.mediaEnc)
+ keyVal = mediaEncVals.elementAt(keyIx)
mediaEncKeys.removeAt(keyIx)
mediaEncVals.removeAt(keyIx)
mediaEncKeys.add(0, acc.mediaEnc)
@@ -240,7 +257,9 @@ class AccountActivity : AppCompatActivity() {
if (acc.regint != 3600) newRegint = 3600
} else {
if (acc.regint != 0) {
- Api.ua_unregister(UserAgent.uas()[uaIndex].uap)
+ val ua = UserAgent.uas()[uaIndex]
+ Api.ua_unregister(ua.uap)
+ UserAgent.updateStatus(ua, R.drawable.dot_yellow)
newRegint = 0
}
}
@@ -253,18 +272,17 @@ class AccountActivity : AppCompatActivity() {
Log.e("Baresip", "Setting of regint failed")
}
- var newMediaNat = ""
- if (iceCheck.isChecked) newMediaNat = "ice"
- if (acc.mediaNat != newMediaNat)
- if (account_set_medianat(acc.accp, newMediaNat) == 0) {
+ if (mediaNat != acc.mediaNat) {
+ if (account_set_medianat(acc.accp, mediaNat) == 0) {
acc.mediaNat = account_medianat(acc.accp)
Log.d("Baresip", "New medianat is ${acc.mediaNat}")
save = true
} else {
Log.e("Baresip", "Setting of medianat failed")
}
+ }
- if (iceCheck.isChecked) {
+ if (mediaNat != "") {
val newStunServer = stunServer.text.toString().trim()
if (acc.stunServer != newStunServer) {
if (!Utils.checkHostPort(newStunServer, false)) {
@@ -389,8 +407,8 @@ class AccountActivity : AppCompatActivity() {
findViewById(R.id.RegTitle) as TextView -> {
Utils.alertView(this, "Register", getString(R.string.register))
}
- findViewById(R.id.IceTitle) as TextView -> {
- Utils.alertView(this, "Use ICE", getString(R.string.ice))
+ findViewById(R.id.MediaNatTitle) as TextView -> {
+ Utils.alertView(this, "Media NAT Traversal", getString(R.string.mediaNat))
}
findViewById(R.id.StunServerTitle) as TextView -> {
Utils.alertView(this, "STUN Server", getString(R.string.stunServer))
diff --git a/app/src/main/kotlin/com/tutpro/baresip/UserAgent.kt b/app/src/main/kotlin/com/tutpro/baresip/UserAgent.kt
index 1e073697..343cc952 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/UserAgent.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/UserAgent.kt
@@ -27,6 +27,13 @@ class UserAgent (val uap: String) {
}
}
+ fun updateStatus(ua: UserAgent, status: Int) {
+ val index = BaresipService.uas.indexOf(ua)
+ if (index != -1) {
+ BaresipService.status[index] = status
+ }
+ }
+
fun uaAlloc(uri: String): UserAgent? {
val uap = Api.ua_alloc(uri)
if (uap != "") return UserAgent(uap)
diff --git a/app/src/main/res/layout/activity_account.xml b/app/src/main/res/layout/activity_account.xml
index ebb3d4c9..201cc407 100644
--- a/app/src/main/res/layout/activity_account.xml
+++ b/app/src/main/res/layout/activity_account.xml
@@ -89,7 +89,7 @@
android:hint="SIP URI of Proxy Server"
android:textSize="18sp"
android:inputType="textEmailAddress"
- android:layout_width="fill_parent">
+ android:layout_width="fill_parent" >
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
If checked, registration is enabled and REGISTER requests are sent at
12 minute intervals.
- If checked, ICE (Interactive Connectivity Establishment) is enabled for NAT
- traversal.
+ Selects media NAT traversal protocol (if any). Possible choices are STUN
+ (Session Traversal Utilities for NAT, RFC 5389) and ICE (Interactive Connectivity
+ Establishment, RFC 5245).
- A specific Stun Server used by ICE of form host[:port].
+ A STUN Server of form host[:port].
Factory default value is \'stun.l.google.com:19302\', pointing to public Google STUN server.
Username and password are currently not supported.