- Replaced global setting "Prefer IPv6" with account specific
"Prefer IPv6 Media" setting. - Improved acting on changes in network connectivity.
This commit is contained in:
@@ -17,6 +17,7 @@ class Account(val accp: String) {
|
||||
var audioCodec = ArrayList<String>()
|
||||
var regint = account_regint(accp)
|
||||
var mediaEnc = account_mediaenc(accp)
|
||||
var preferIPv6Media = false
|
||||
var answerMode = ""
|
||||
var vmUri = account_vm_uri(accp)
|
||||
var vmNew = 0
|
||||
@@ -59,6 +60,7 @@ class Account(val accp: String) {
|
||||
}
|
||||
|
||||
val extra = account_extra(accp)
|
||||
preferIPv6Media = Utils.paramValue(extra,"prefer_ipv6_media") == "yes"
|
||||
answerMode = Utils.paramValue(extra,"answer_mode")
|
||||
if (answerMode == "") answerMode = "manual"
|
||||
callHistory = Utils.paramValue(extra,"call_history") == ""
|
||||
@@ -112,14 +114,18 @@ class Account(val accp: String) {
|
||||
res += ";ptime=20;regint=${regint};regq=0.5;pubint=0;call_transfer=yes"
|
||||
|
||||
var extra = ""
|
||||
if (!callHistory) extra = "call_history=no"
|
||||
if (answerMode == "auto") {
|
||||
if (extra == "")
|
||||
extra = "answer_mode=auto"
|
||||
else
|
||||
|
||||
if (!callHistory)
|
||||
extra += ";call_history=no"
|
||||
|
||||
if (answerMode == "auto")
|
||||
extra += ";answer_mode=auto"
|
||||
}
|
||||
res += ";extra=\"$extra\""
|
||||
|
||||
if (preferIPv6Media)
|
||||
extra += ";prefer_ipv6_media=yes"
|
||||
|
||||
if (extra != "")
|
||||
res += ";extra=\"" + extra.substringAfter(";") + "\""
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ class AccountActivity : AppCompatActivity() {
|
||||
internal lateinit var stunServer: EditText
|
||||
internal lateinit var regCheck: CheckBox
|
||||
internal lateinit var mediaEnc: String
|
||||
internal lateinit var ipV6MediaCheck: CheckBox
|
||||
internal lateinit var answerMode: String
|
||||
internal lateinit var vmUri: EditText
|
||||
internal lateinit var defaultCheck: CheckBox
|
||||
@@ -156,6 +157,9 @@ class AccountActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
ipV6MediaCheck = findViewById(R.id.PreferIPv6Media) as CheckBox
|
||||
ipV6MediaCheck.isChecked = acc.preferIPv6Media
|
||||
|
||||
answerMode = acc.answerMode
|
||||
val answerModeSpinner = findViewById(R.id.answerModeSpinner) as Spinner
|
||||
val answerModeKeys = arrayListOf("manual", "auto")
|
||||
@@ -377,6 +381,16 @@ class AccountActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
if (ipV6MediaCheck.isChecked != acc.preferIPv6Media) {
|
||||
acc.preferIPv6Media = ipV6MediaCheck.isChecked
|
||||
Log.d("Baresip", "New preferIPv6Media is ${acc.preferIPv6Media}")
|
||||
if (acc.preferIPv6Media)
|
||||
Api.ua_set_media_af(ua.uap, Api.AF_INET6)
|
||||
else
|
||||
Api.ua_set_media_af(ua.uap, Api.AF_UNSPEC)
|
||||
save = true
|
||||
}
|
||||
|
||||
if (answerMode != acc.answerMode) {
|
||||
acc.answerMode = answerMode
|
||||
Log.d("Baresip", "New answermode is ${acc.answerMode}")
|
||||
@@ -415,6 +429,8 @@ class AccountActivity : AppCompatActivity() {
|
||||
AccountsActivity.saveAccounts()
|
||||
if (Api.ua_update_account(ua.uap) != 0)
|
||||
Log.e("Baresip", "Failed to update UA ${ua.uap} with AoR $aor")
|
||||
//else
|
||||
//Api.ua_debug(ua.uap)
|
||||
}
|
||||
|
||||
if (regCheck.isChecked) Api.ua_register(ua.uap)
|
||||
@@ -485,6 +501,10 @@ class AccountActivity : AppCompatActivity() {
|
||||
Utils.alertView(this, getString(R.string.media_encryption),
|
||||
getString(R.string.media_encryption_help))
|
||||
}
|
||||
findViewById(R.id.PreferIPv6MediaTitle) as TextView -> {
|
||||
Utils.alertView(this, getString(R.string.prefer_ipv6_media),
|
||||
getString(R.string.prefer_ipv6_media_help))
|
||||
}
|
||||
findViewById(R.id.AnswerModeTitle) as TextView -> {
|
||||
Utils.alertView(this, getString(R.string.answer_mode),
|
||||
getString(R.string.answer_mode_help))
|
||||
|
||||
@@ -2,8 +2,13 @@ package com.tutpro.baresip
|
||||
|
||||
object Api {
|
||||
|
||||
val AF_UNSPEC = 0
|
||||
val AF_INET = 2
|
||||
val AF_INET6 = 10
|
||||
|
||||
external fun audio_codecs(): String
|
||||
external fun uag_current_set(uap: String)
|
||||
external fun uag_reset_transp(reg: Boolean, reinvite: Boolean)
|
||||
external fun ua_account(ua: String): String
|
||||
external fun ua_alloc(uri: String): String
|
||||
external fun ua_update_account(ua: String): Int
|
||||
@@ -15,6 +20,8 @@ object Api {
|
||||
external fun ua_hangup(uap: String, callp: String, code: Int, reason: String)
|
||||
external fun ua_call_alloc(uap: String, xcallp: String): String
|
||||
external fun ua_answer(uap: String, callp: String)
|
||||
external fun ua_set_media_af(uap: String, af: Int)
|
||||
external fun ua_debug(uap: String)
|
||||
external fun call_hold(callp: String): Int
|
||||
external fun call_unhold(callp: String): Int
|
||||
external fun call_connect(callp: String, peer_uri: String): Int
|
||||
@@ -33,9 +40,7 @@ object Api {
|
||||
external fun log_level_set(level: Int)
|
||||
external fun net_use_nameserver(servers: String): Int
|
||||
external fun net_set_address(ip_addr: String): Int
|
||||
external fun net_unset_address(ipv6: Boolean)
|
||||
external fun net_set_af(ipv6: Boolean): Boolean
|
||||
external fun net_force_change()
|
||||
external fun net_unset_address(af: Int)
|
||||
external fun net_debug()
|
||||
external fun net_dns_debug()
|
||||
external fun module_load(module: String): Int
|
||||
|
||||
@@ -87,9 +87,10 @@ class BaresipService: Service() {
|
||||
super.onAvailable(network)
|
||||
val linkProperties = cm.getLinkProperties(network)
|
||||
Log.i(LOG_TAG, "Network $network is available: '$linkProperties'")
|
||||
if (activeNetwork == null) {
|
||||
Log.i(LOG_TAG, "Updating dnsServers and linkAddresses")
|
||||
activeNetwork = network
|
||||
activeNetwork = network
|
||||
if (isServiceRunning) {
|
||||
Utils.updateLinkProperties(linkProperties)
|
||||
} else {
|
||||
dnsServers = linkProperties.dnsServers
|
||||
linkAddresses = linkProperties.linkAddresses
|
||||
}
|
||||
@@ -107,15 +108,7 @@ class BaresipService: Service() {
|
||||
break
|
||||
}
|
||||
if (activeNetwork != null) {
|
||||
val linkProperties = cm.getLinkProperties(activeNetwork)
|
||||
if (dynDns) {
|
||||
dnsServers = linkProperties.dnsServers
|
||||
if (Config.updateDnsServers(dnsServers) != 0)
|
||||
Log.w(LOG_TAG, "Failed to update DNS servers '$dnsServers'")
|
||||
}
|
||||
linkAddresses = linkProperties.linkAddresses
|
||||
Utils.updateLinkAddresses()
|
||||
UserAgent.register()
|
||||
Utils.updateLinkProperties(cm.getLinkProperties(activeNetwork))
|
||||
}
|
||||
} else {
|
||||
Log.d(LOG_TAG, "Network '$network' is lost")
|
||||
@@ -127,16 +120,14 @@ class BaresipService: Service() {
|
||||
if (!isServiceRunning)
|
||||
return
|
||||
if (network == activeNetwork) {
|
||||
Log.e(LOG_TAG, "Active network $network link properties changed: " +
|
||||
Log.d(LOG_TAG, "Active network $network link properties changed: " +
|
||||
"$linkProperties")
|
||||
if (dynDns) {
|
||||
if (isServiceRunning) {
|
||||
Utils.updateLinkProperties(linkProperties)
|
||||
} else {
|
||||
dnsServers = linkProperties.dnsServers
|
||||
if (Config.updateDnsServers(dnsServers) != 0)
|
||||
Log.w(LOG_TAG, "Failed to update DNS servers '$dnsServers'")
|
||||
linkAddresses = linkProperties.linkAddresses
|
||||
}
|
||||
linkAddresses = linkProperties.linkAddresses
|
||||
Utils.updateLinkAddresses()
|
||||
// UserAgent.register()
|
||||
} else {
|
||||
Log.e(LOG_TAG, "Network $network link properties changed: " +
|
||||
"$linkProperties")
|
||||
@@ -288,7 +279,8 @@ class BaresipService: Service() {
|
||||
Thread(Runnable { baresipStart(filesPath,
|
||||
Utils.findIpV4Address(linkAddresses),
|
||||
Utils.findIpV6Address(linkAddresses),
|
||||
preferIpV6) }).start()
|
||||
"", Api.AF_UNSPEC)
|
||||
}).start()
|
||||
|
||||
isServiceRunning = true
|
||||
|
||||
@@ -437,9 +429,11 @@ class BaresipService: Service() {
|
||||
|
||||
@Keep
|
||||
fun uaAdd(uap: String) {
|
||||
Log.d(LOG_TAG, "uaAdd at BaresipService")
|
||||
val ua = UserAgent(uap)
|
||||
Log.d(LOG_TAG, "uaAdd ${ua.account.aor} at BaresipService")
|
||||
uas.add(ua)
|
||||
if (ua.account.preferIPv6Media)
|
||||
Api.ua_set_media_af(ua.uap, Api.AF_INET6)
|
||||
if (Api.ua_isregistered(uap)) {
|
||||
Log.d(LOG_TAG, "Ua ${ua.account.aor} is registered")
|
||||
status.add(R.drawable.dot_green)
|
||||
@@ -456,13 +450,14 @@ class BaresipService: Service() {
|
||||
|
||||
@Keep
|
||||
fun uaEvent(event: String, uap: String, callp: String) {
|
||||
Log.d(LOG_TAG, "uaEvent got event $event/$uap/$callp")
|
||||
if (!isServiceRunning) return
|
||||
val ua = UserAgent.find(uap)
|
||||
if (ua == null) {
|
||||
Log.w(LOG_TAG, "uaEvent did not find ua $uap")
|
||||
return
|
||||
}
|
||||
Log.d(LOG_TAG, "got uaEvent $event/${ua.account.aor}/$callp")
|
||||
|
||||
val aor = ua.account.aor
|
||||
var newEvent: String? = null
|
||||
val ev = event.split(",")
|
||||
@@ -829,6 +824,7 @@ class BaresipService: Service() {
|
||||
isServiceRunning = false
|
||||
if (error == "ua_init") {
|
||||
Config.removeVariable("sip_listen")
|
||||
Config.removeVariable("net_interface")
|
||||
Config.removeVariable("sip_certificate")
|
||||
Config.removeVariable("sip_cafile")
|
||||
}
|
||||
@@ -1042,7 +1038,8 @@ class BaresipService: Service() {
|
||||
isServiceClean = true
|
||||
}
|
||||
|
||||
external fun baresipStart(path: String, ipV4Addr: String, ipV6Addr: String, preferIpV6: Boolean)
|
||||
external fun baresipStart(path: String, ipV4Addr: String, ipV6Addr: String, netInterface: String,
|
||||
netAf: Int)
|
||||
external fun baresipStop(force: Boolean)
|
||||
|
||||
companion object {
|
||||
@@ -1073,7 +1070,7 @@ class BaresipService: Service() {
|
||||
var speakerPhone = false
|
||||
var callVolume = 0
|
||||
var dynDns = false
|
||||
var preferIpV6 = false
|
||||
var netInterface = ""
|
||||
var filesPath = ""
|
||||
var downloadsPath = ""
|
||||
|
||||
@@ -1085,8 +1082,8 @@ class BaresipService: Service() {
|
||||
val contacts = ArrayList<Contact>()
|
||||
val chatTexts: MutableMap<String, String> = mutableMapOf<String, String>()
|
||||
val activities = mutableListOf<String>()
|
||||
var dnsServers = listOf<InetAddress>()
|
||||
var linkAddresses = listOf<LinkAddress>()
|
||||
var dnsServers = listOf<InetAddress>()
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -57,14 +57,8 @@ object Config {
|
||||
Log.logLevelSet(ll)
|
||||
}
|
||||
|
||||
removeVariable("net_interface")
|
||||
|
||||
removeVariable("net_prefer_ipv6")
|
||||
val preferIpV6 = variable("prefer_ipv6")
|
||||
if (preferIpV6.size == 0) {
|
||||
BaresipService.preferIpV6 = false
|
||||
} else {
|
||||
BaresipService.preferIpV6 = preferIpV6[0] == "yes"
|
||||
if (config.contains("net_interface")) {
|
||||
BaresipService.netInterface = variable("net_interface")[0]
|
||||
}
|
||||
|
||||
if (!config.contains("call_volume")) {
|
||||
|
||||
@@ -19,7 +19,6 @@ class ConfigActivity : AppCompatActivity() {
|
||||
|
||||
internal lateinit var autoStart: CheckBox
|
||||
internal lateinit var listenAddr: EditText
|
||||
internal lateinit var preferIPv6: CheckBox
|
||||
internal lateinit var dnsServers: EditText
|
||||
internal lateinit var certificateFile: CheckBox
|
||||
internal lateinit var caFile: CheckBox
|
||||
@@ -32,7 +31,6 @@ class ConfigActivity : AppCompatActivity() {
|
||||
|
||||
private var oldAutoStart = ""
|
||||
private var oldListenAddr = ""
|
||||
private var oldPreferIPv6 = ""
|
||||
private var oldDnsServers = ""
|
||||
private var oldCertificateFile = false
|
||||
private var oldCAFile = false
|
||||
@@ -68,11 +66,6 @@ class ConfigActivity : AppCompatActivity() {
|
||||
oldListenAddr = if (laCv.size == 0) "" else laCv[0]
|
||||
listenAddr.setText(oldListenAddr)
|
||||
|
||||
preferIPv6 = findViewById(R.id.PreferIPv6) as CheckBox
|
||||
val piCv = Config.variable("prefer_ipv6")
|
||||
oldPreferIPv6 = if (piCv.size == 0) "no" else piCv[0]
|
||||
preferIPv6.isChecked = oldPreferIPv6 == "yes"
|
||||
|
||||
dnsServers = findViewById(R.id.DnsServers) as EditText
|
||||
val ddCv = Config.variable("dyn_dns")
|
||||
if (ddCv[0] == "yes") {
|
||||
@@ -220,15 +213,6 @@ class ConfigActivity : AppCompatActivity() {
|
||||
restart = true
|
||||
}
|
||||
|
||||
var preferIPv6String = "no"
|
||||
if (preferIPv6.isChecked) preferIPv6String = "yes"
|
||||
if (oldPreferIPv6 != preferIPv6String) {
|
||||
Config.replaceVariable("prefer_ipv6", preferIPv6String)
|
||||
BaresipService.preferIpV6 = preferIPv6String == "yes"
|
||||
Utils.updateLinkAddresses()
|
||||
save = true
|
||||
}
|
||||
|
||||
val dnsServers = addMissingPorts(dnsServers.text.toString().trim().toLowerCase())
|
||||
if (dnsServers != oldDnsServers) {
|
||||
if (!checkDnsServers(dnsServers)) {
|
||||
@@ -461,10 +445,6 @@ class ConfigActivity : AppCompatActivity() {
|
||||
Utils.alertView(this, getString(R.string.listen_address),
|
||||
getString(R.string.listen_address_help))
|
||||
}
|
||||
findViewById(R.id.PreferIPv6Title) as TextView-> {
|
||||
Utils.alertView(this, getString(R.string.prefer_ipv6),
|
||||
getString(R.string.prefer_ipv6_help))
|
||||
}
|
||||
findViewById(R.id.DnsServersTitle) as TextView -> {
|
||||
Utils.alertView(this, getString(R.string.dns_servers),
|
||||
getString(R.string.dns_servers_help))
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.graphics.Bitmap
|
||||
import android.graphics.Bitmap.createScaledBitmap
|
||||
import android.graphics.Color
|
||||
import android.net.LinkAddress
|
||||
import android.net.LinkProperties
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.ActivityCompat
|
||||
import android.support.v4.content.ContextCompat
|
||||
@@ -254,34 +255,46 @@ object Utils {
|
||||
return ""
|
||||
}
|
||||
|
||||
fun updateLinkAddresses() {
|
||||
val ipV6Addr = findIpV6Address(BaresipService.linkAddresses)
|
||||
if (ipV6Addr != "") {
|
||||
Log.d("Baresip", "Found IPv6 address '$ipV6Addr'")
|
||||
if (Api.net_set_address(ipV6Addr) != 0) {
|
||||
Log.w("Baresip", "Failed to update net address '$ipV6Addr'")
|
||||
private fun updateLinkAddresses(linkAddresses: List<LinkAddress>) {
|
||||
var updated = false
|
||||
val ipV6Addr = findIpV6Address(linkAddresses)
|
||||
if (ipV6Addr != findIpV6Address(BaresipService.linkAddresses)) {
|
||||
Log.d("Baresip", "Updating IPv6 address to '$ipV6Addr'")
|
||||
if (ipV6Addr != "") {
|
||||
if (Api.net_set_address(ipV6Addr) != 0)
|
||||
Log.w("Baresip", "Failed to update net address '$ipV6Addr")
|
||||
} else {
|
||||
Api.net_set_af(BaresipService.preferIpV6)
|
||||
Api.net_unset_address(Api.AF_INET6)
|
||||
}
|
||||
} else {
|
||||
Api.net_unset_address(true)
|
||||
Api.net_set_af(false)
|
||||
updated = true
|
||||
}
|
||||
val ipV4Addr = findIpV4Address(BaresipService.linkAddresses)
|
||||
if (ipV4Addr != "") {
|
||||
Log.w("Baresip", "Found IPv4 address '$ipV4Addr'")
|
||||
if (Api.net_set_address(ipV4Addr) != 0) {
|
||||
Log.w("Baresip", "Failed to update net address '$ipV4Addr'")
|
||||
val ipV4Addr = findIpV4Address(linkAddresses)
|
||||
if (ipV4Addr != findIpV4Address(BaresipService.linkAddresses)) {
|
||||
Log.d("Baresip", "Updating IPv4 address to '$ipV4Addr'")
|
||||
if (ipV4Addr != "") {
|
||||
if (Api.net_set_address(ipV4Addr) != 0)
|
||||
Log.w("Baresip", "Failed to update net address '$ipV4Addr'")
|
||||
} else {
|
||||
if (!BaresipService.preferIpV6 || (ipV6Addr == ""))
|
||||
Api.net_set_af(false)
|
||||
Api.net_unset_address(Api.AF_INET)
|
||||
}
|
||||
} else {
|
||||
Api.net_unset_address(false)
|
||||
Api.net_set_af(false)
|
||||
updated = true
|
||||
}
|
||||
Api.net_force_change()
|
||||
Api.net_debug()
|
||||
if (updated) {
|
||||
BaresipService.linkAddresses = linkAddresses
|
||||
Api.uag_reset_transp(true,true)
|
||||
Api.net_debug()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
fun updateLinkProperties(linkProperties: LinkProperties) {
|
||||
if (BaresipService.dynDns && (BaresipService.dnsServers != linkProperties.dnsServers)) {
|
||||
if (Config.updateDnsServers(linkProperties.dnsServers) != 0)
|
||||
Log.w("Baresip", "Failed to update DNS servers '${BaresipService.dnsServers}'")
|
||||
else
|
||||
BaresipService.dnsServers = linkProperties.dnsServers
|
||||
}
|
||||
updateLinkAddresses(linkProperties.linkAddresses)
|
||||
}
|
||||
|
||||
fun implode(list: List<String>, sep: String): String {
|
||||
|
||||
Reference in New Issue
Block a user