diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index 0006c433..6cab74ae 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -194,12 +194,17 @@ class BaresipService: Service() { hotSpotAddresses = Utils.hotSpotAddresses() Log.d(TAG, "HotSpot addresses $hotSpotAddresses") if (hotSpotAddresses.isNotEmpty()) { + var reset = false for ((k, v) in hotSpotAddresses) - if (Api.net_add_address_ifname(k, v) != 0) - Log.e(TAG, "Failed to add $v address $k") - Timer().schedule(2000) { - Api.uag_reset_transp(register = true, reinvite = false) - } + if (afMatch(k)) + if (Api.net_add_address_ifname(k, v) != 0) + Log.e(TAG, "Failed to add $v address $k") + else + reset = true + if (reset) + Timer().schedule(2000) { + Api.uag_reset_transp(register = true, reinvite = false) + } } else { Log.w(TAG, "Could not get hotspot addresses") } @@ -1396,19 +1401,29 @@ class BaresipService: Service() { val props = cm.getLinkProperties(n) ?: continue for (la in props.linkAddresses) if (la.scope == android.system.OsConstants.RT_SCOPE_UNIVERSE && - props.interfaceName != null && la.address.hostAddress != null) - addresses[la.address.hostAddress!!] = props.interfaceName!! + props.interfaceName != null && la.address.hostAddress != null && + afMatch(la.address.hostAddress!!)) + addresses[la.address.hostAddress!!] = props.interfaceName!! } } if (hotSpotIsEnabled) { hotSpotAddresses = Utils.hotSpotAddresses() Log.d(TAG, "HotSpot addresses $hotSpotAddresses") for ((k, v) in hotSpotAddresses) - addresses[k] = v + if (afMatch(k)) + addresses[k] = v } return addresses } + private fun afMatch(address: String): Boolean { + return when (addressFamily) { + "" -> true + "ipv4" -> address.contains(".") + else -> address.contains(":") + } + } + private fun updateDnsServers() { if (isServiceRunning && !dynDns) return @@ -1534,6 +1549,7 @@ class BaresipService: Service() { var contactsMode = "baresip" val chatTexts: MutableMap = mutableMapOf() val activities = mutableListOf() + var addressFamily = "" var dnsServers = listOf() val serviceEvent = MutableLiveData>() val serviceEvents = mutableListOf() diff --git a/app/src/main/kotlin/com/tutpro/baresip/Config.kt b/app/src/main/kotlin/com/tutpro/baresip/Config.kt index 989dd63d..54909d29 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Config.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Config.kt @@ -73,6 +73,9 @@ object Config { BaresipService.callVolume = variable("call_volume")[0].toInt() } + if (config.contains("net_af")) + BaresipService.addressFamily = variable("net_af")[0] + if (!config.contains("dyn_dns")) { config = "${config}dyn_dns no\n" } else { diff --git a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt index 3c076b7d..37678db5 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt @@ -38,6 +38,9 @@ class ConfigActivity : AppCompatActivity() { private lateinit var autoStart: CheckBox private lateinit var batteryOptimizations: CheckBox private lateinit var listenAddr: EditText + private lateinit var netAfSpinner: Spinner + private lateinit var netAf: String + private lateinit var netAfKeys: ArrayList private lateinit var dnsServers: EditText private lateinit var certificateFile: CheckBox private lateinit var verifyServer: CheckBox @@ -61,6 +64,7 @@ class ConfigActivity : AppCompatActivity() { private var oldLogLevel = "" private var oldDisplayTheme = -1 private var oldContactsMode = "" + private var oldNetAf = "" private var save = false private var restart = false private var menu: Menu? = null @@ -114,6 +118,28 @@ class ConfigActivity : AppCompatActivity() { oldListenAddr = if (laCv.size == 0) "" else laCv[0] listenAddr.setText(oldListenAddr) + netAfSpinner = binding.NetAfSpinner + netAfKeys = arrayListOf("", "ipv4", "ipv6") + val netAfVals = arrayListOf("-", "IPv4", "IPv6") + val netAfCv = Config.variable("net_af") + oldNetAf = if (netAfCv.size == 0) "" else netAfCv[0].lowercase() + netAf = oldNetAf + val netAfIndex = netAfKeys.indexOf(oldNetAf) + val netAfValue = netAfVals.elementAt(netAfIndex) + netAfKeys.removeAt(netAfIndex) + netAfVals.removeAt(netAfIndex) + netAfKeys.add(0, oldNetAf) + netAfVals.add(0, netAfValue) + val netAfAdapter = ArrayAdapter(this,android.R.layout.simple_spinner_item, netAfVals) + netAfAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + netAfSpinner.adapter = netAfAdapter + netAfSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { + netAf = netAfKeys[position] + } + override fun onNothingSelected(parent: AdapterView<*>) {} + } + dnsServers = binding.DnsServers val ddCv = Config.variable("dyn_dns") if (ddCv[0] == "yes") { @@ -488,6 +514,15 @@ class ConfigActivity : AppCompatActivity() { restart = true } + if (oldNetAf != netAf) { + if (netAf == "") + Config.removeVariable("net_af") + else + Config.replaceVariable("net_af", netAf) + save = true + restart = true + } + val dnsServers = addMissingPorts( dnsServers.text.toString().trim().lowercase(Locale.ROOT)) if (dnsServers != oldDnsServers) { @@ -620,6 +655,10 @@ class ConfigActivity : AppCompatActivity() { Utils.alertView(this, getString(R.string.listen_address), getString(R.string.listen_address_help)) } + binding.NetAfTitle.setOnClickListener { + Utils.alertView(this, getString(R.string.address_family), + getString(R.string.address_family_help)) + } binding.DnsServersTitle .setOnClickListener { Utils.alertView(this, getString(R.string.dns_servers), getString(R.string.dns_servers_help)) diff --git a/app/src/main/res/layout/activity_config.xml b/app/src/main/res/layout/activity_config.xml index 63a119eb..cc08e9ee 100644 --- a/app/src/main/res/layout/activity_config.xml +++ b/app/src/main/res/layout/activity_config.xml @@ -89,6 +89,22 @@ android:importantForAutofill="no" > + + + + + + Virheellinen kuunteluosoite + Osoiteperhe + Valitsee, mitä IP-osoitteita baresip käyttää. Jos IPv4 tai IPv6 + on valittu, baresip käyttää ainoastaan IPv4- tai IPv6-osoitteita. Jos kumpaakaan ei ole + valittu, baresip käyttää sekä IPv4- että IPv6-osoitteita. + DNS-palvelimet Pilkulla toisistaan erotettu luettelo DNS-palvelijoiden osoitteita. Jos jätetään antamatta (oletus), osoitteet hankitaan dynaamisesti järjestelmästä. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 14cf1cd4..bd5d7e56 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -305,6 +305,11 @@ Invalid Listen Address 0.0.0.0:5060 + Address Family + Chooses which IP addresses baresip is + using. If IPv4 or IPv6 is chosen, baresip uses only IPv4 or IPv6 addresses. If neither is + chosen, baresip uses both IPv4 and IPv6 addresses. + DNS Servers Comma separated list of addresses of DNS servers. If not given, DNS server addresses are obtained dynamically from the system. Each DNS address is of form @@ -426,6 +431,7 @@ Invalid SIP or tel URI \'%1$s\' baresip Android + Backup Restore