Use coroutine instead of async task to fetch account config from network

This commit is contained in:
Juha Heinanen
2021-05-12 16:52:01 +03:00
parent 20b137e218
commit 358cf77a54
2 changed files with 100 additions and 105 deletions
+1
View File
@@ -54,6 +54,7 @@ dependencies {
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation "androidx.preference:preference-ktx:1.1.1" implementation "androidx.preference:preference-ktx:1.1.1"
implementation "androidx.exifinterface:exifinterface:1.3.2" implementation "androidx.exifinterface:exifinterface:1.3.2"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
} }
repositories { repositories {
@@ -2,18 +2,20 @@ package com.tutpro.baresip
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.AsyncTask
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.* import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import com.tutpro.baresip.databinding.ActivityAccountBinding import com.tutpro.baresip.databinding.ActivityAccountBinding
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import org.xmlpull.v1.XmlPullParser import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlPullParserFactory import org.xmlpull.v1.XmlPullParserFactory
import java.io.StringReader import java.io.StringReader
import java.lang.ref.WeakReference
import java.net.URL import java.net.URL
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
@@ -56,6 +58,8 @@ class AccountActivity : AppCompatActivity() {
private var save = false private var save = false
private var uaIndex= -1 private var uaIndex= -1
val scope = CoroutineScope(Job() + Dispatchers.Main)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -89,10 +93,8 @@ class AccountActivity : AppCompatActivity() {
Utils.addActivity("account,$aor") Utils.addActivity("account,$aor")
if (intent.getBooleanExtra("new", false)) { if (intent.getBooleanExtra("new", false))
val url = "https://${Utils.uriHostPart(aor)}/baresip/account_config.xml" initAccountFromConfig(this)
GetAccountConfigAsyncTask(this).execute(url)
}
title = aor.split(":")[1] title = aor.split(":")[1]
@@ -100,6 +102,96 @@ class AccountActivity : AppCompatActivity() {
} }
private fun initAccountFromConfig(ctx: AccountActivity) {
scope.launch(Dispatchers.IO) {
val url = "https://${Utils.uriHostPart(aor)}/baresip/account_config.xml"
val config = try {
URL(url).readText()
} catch (e: java.lang.Exception) {
Log.d("Baresip", "Network request failed")
null
}
if (config != null && !ctx.isFinishing) {
Log.d("Baresip", "Got account config $config")
val acc = Account(acc.accp)
val parserFactory: XmlPullParserFactory = XmlPullParserFactory.newInstance()
val parser: XmlPullParser = parserFactory.newPullParser()
parser.setInput(StringReader(config))
var tag: String?
var text = ""
var event = parser.eventType
val audioCodecs = ArrayList(Api.audio_codecs().split(","))
val videoCodecs = ArrayList(Api.video_codecs().split(","))
while (event != XmlPullParser.END_DOCUMENT) {
tag = parser.name
when (event) {
XmlPullParser.TEXT ->
text = parser.text
XmlPullParser.START_TAG -> {
if (tag == "audio-codecs")
acc.audioCodec.clear()
if (tag == "video-codecs")
acc.videoCodec.clear()
}
XmlPullParser.END_TAG ->
when (tag) {
"outbound-proxy-1" ->
if (text.isNotEmpty())
acc.outbound.add(text)
"outbound-proxy-2" ->
if (text.isNotEmpty())
acc.outbound.add(text)
"register" ->
acc.regint = if (text == "yes") 3600 else 0
"audio-codec" ->
if (text in audioCodecs)
acc.audioCodec.add(text)
"video-codec" ->
if (text in videoCodecs)
acc.videoCodec.add(text)
"media-encoding" -> {
val enc = text.toLowerCase(Locale.ROOT)
if (enc in mediaEncKeys && enc.isNotEmpty())
acc.mediaEnc = enc
}
"media-nat" -> {
val nat = text.toLowerCase(Locale.ROOT)
if (nat in mediaNatKeys && nat.isNotEmpty())
acc.mediaNat = nat
}
"stun-turn-server" ->
if (text.isNotEmpty())
acc.stunServer = text
"prefer-ipv6-media" ->
acc.preferIPv6Media = text == "yes"
"dtmf-mode" ->
if (text in arrayOf("rtp-event", "sip-info")) {
acc.dtmfMode = if (text == "rtp-event")
Api.DTMFMODE_RTP_EVENT
else
Api.DTMFMODE_SIP_INFO
}
"answer-mode" ->
if (text in arrayOf("manual", "auto")) {
acc.answerMode = if (text == "manual")
Api.ANSWERMODE_MANUAL
else
Api.ANSWERMODE_AUTO
}
"voicemail-uri" ->
if (text.isNotEmpty())
acc.vmUri = text
}
}
event = parser.next()
}
runOnUiThread {
initLayoutFromAccount(acc)
}
}
}
}
private fun initLayoutFromAccount(acc: Account) { private fun initLayoutFromAccount(acc: Account) {
uri.text = acc.luri uri.text = acc.luri
@@ -619,104 +711,6 @@ class AccountActivity : AppCompatActivity() {
} }
} }
private class GetAccountConfigAsyncTask(context: AccountActivity):
AsyncTask<String, String, String>() {
private val TAG = "Baresip"
private val activityReference: WeakReference<AccountActivity> = WeakReference(context)
override fun doInBackground(vararg url: String?): String? {
val result = try {
URL(url[0]).readText()
} catch (e: Exception) {
Log.e(TAG, "Could not get account config from ${url[0]}: $e")
null
}
Log.d(TAG, "Got account config $result")
return result
}
override fun onPostExecute(result: String?) {
val activity = activityReference.get()
if (activity == null || activity.isFinishing || result == null)
return
val acc = Account(activity.acc.accp)
val parserFactory: XmlPullParserFactory = XmlPullParserFactory.newInstance()
val parser: XmlPullParser = parserFactory.newPullParser()
parser.setInput(StringReader(result))
var tag: String?
var text = ""
var event = parser.eventType
val audioCodecs = ArrayList(Api.audio_codecs().split(","))
val videoCodecs = ArrayList(Api.video_codecs().split(","))
while (event != XmlPullParser.END_DOCUMENT) {
tag = parser.name
when (event) {
XmlPullParser.TEXT ->
text = parser.text
XmlPullParser.START_TAG -> {
if (tag == "audio-codecs")
acc.audioCodec.clear()
if (tag == "video-codecs")
acc.videoCodec.clear()
}
XmlPullParser.END_TAG ->
when (tag) {
"outbound-proxy-1" ->
if (text.isNotEmpty())
acc.outbound.add(text)
"outbound-proxy-2" ->
if (text.isNotEmpty())
acc.outbound.add(text)
"register" ->
acc.regint = if (text == "yes") 3600 else 0
"audio-codec" ->
if (text in audioCodecs)
acc.audioCodec.add(text)
"video-codec" ->
if (text in videoCodecs)
acc.videoCodec.add(text)
"media-encoding" -> {
val enc = text.toLowerCase(Locale.ROOT)
if (enc in activity.mediaEncKeys && enc.isNotEmpty())
acc.mediaEnc = enc
}
"media-nat" -> {
val nat = text.toLowerCase(Locale.ROOT)
if (nat in activity.mediaNatKeys && nat.isNotEmpty())
acc.mediaNat = nat
}
"stun-turn-server" ->
if (text.isNotEmpty())
acc.stunServer = text
"prefer-ipv6-media" ->
acc.preferIPv6Media = text == "yes"
"dtmf-mode" ->
if (text in arrayOf("rtp-event", "sip-info")) {
acc.dtmfMode = if (text == "rtp-event")
Api.DTMFMODE_RTP_EVENT
else
Api.DTMFMODE_SIP_INFO
}
"answer-mode" ->
if (text in arrayOf("manual", "auto")) {
acc.answerMode = if (text == "manual")
Api.ANSWERMODE_MANUAL
else
Api.ANSWERMODE_AUTO
}
"voicemail-uri" ->
if (text.isNotEmpty())
acc.vmUri = text
}
}
event = parser.next()
}
activity.initLayoutFromAccount(acc)
}
}
private fun returnResult(code: Int) { private fun returnResult(code: Int) {
val i = Intent() val i = Intent()
if (code == Activity.RESULT_OK) if (code == Activity.RESULT_OK)