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.