- Moved configuration of account's audio codecs to a new activity.

This commit is contained in:
Juha Heinanen
2020-05-19 09:01:53 +03:00
parent 4fdc079e54
commit 45bfaab030
12 changed files with 281 additions and 61 deletions
+6
View File
@@ -58,6 +58,12 @@
android:configChanges="orientation|keyboardHidden|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/account" > android:label="@string/account" >
</activity> </activity>
<activity
android:name=".CodecsActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/codecs"
android:parentActivityName=".AccountActivity" >
</activity>
<activity <activity
android:name=".ContactsActivity" android:name=".ContactsActivity"
android:configChanges="orientation|keyboardHidden|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
+39
View File
@@ -824,6 +824,18 @@ Java_com_tutpro_baresip_AccountKt_account_1set_1audio_1codecs(JNIEnv *env, jobje
return res; return res;
} }
JNIEXPORT jint JNICALL
Java_com_tutpro_baresip_AccountKt_account_1set_1video_1codecs(JNIEnv *env, jobject thiz,
jstring jAcc, jstring jCodecs) {
const char *native_acc = (*env)->GetStringUTFChars(env, jAcc, 0);
struct account *acc = (struct account *) strtoul(native_acc, NULL, 10);
(*env)->ReleaseStringUTFChars(env, jAcc, native_acc);
const char *codecs = (*env)->GetStringUTFChars(env, jCodecs, 0);
int res = account_set_video_codecs(acc, codecs);
(*env)->ReleaseStringUTFChars(env, jCodecs, codecs);
return res;
}
JNIEXPORT jint JNICALL JNIEXPORT jint JNICALL
Java_com_tutpro_baresip_AccountKt_account_1regint(JNIEnv *env, jobject thiz, jstring javaAcc) { Java_com_tutpro_baresip_AccountKt_account_1regint(JNIEnv *env, jobject thiz, jstring javaAcc) {
const char *native_acc = (*env)->GetStringUTFChars(env, javaAcc, 0); const char *native_acc = (*env)->GetStringUTFChars(env, javaAcc, 0);
@@ -1460,6 +1472,33 @@ Java_com_tutpro_baresip_Api_audio_1codecs(JNIEnv *env, jobject thiz)
return (*env)->NewStringUTF(env, codec_buf); return (*env)->NewStringUTF(env, codec_buf);
} }
JNIEXPORT jstring JNICALL
Java_com_tutpro_baresip_Api_video_1codecs(JNIEnv *env, jobject thiz)
{
struct list *vidcodecl = baresip_vidcodecl();
struct le *le;
char codec_buf[256];
char *start = &(codec_buf[0]);
unsigned int left = sizeof codec_buf;
int len;
for (le = list_head(vidcodecl); le != NULL; le = le->next) {
const struct vidcodec *vc = le->data;
if (start == &(codec_buf[0]))
len = re_snprintf(start, left, "%s", vc->name);
else
len = re_snprintf(start, left, ",%s", vc->name);
if (len == -1) {
LOGE("failed to print codec to buffer\n");
codec_buf[0] = '\0';
return (*env)->NewStringUTF(env, codec_buf);
}
start = start + len;
left = left - len;
}
*start = '\0';
return (*env)->NewStringUTF(env, codec_buf);
}
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_tutpro_baresip_Api_contact_1add(JNIEnv *env, jobject thiz, jstring javaContact) { Java_com_tutpro_baresip_Api_contact_1add(JNIEnv *env, jobject thiz, jstring javaContact) {
struct pl pl_addr; struct pl pl_addr;
@@ -15,6 +15,7 @@ class Account(val accp: String) {
var mediaNat = account_medianat(accp) var mediaNat = account_medianat(accp)
var stunServer = "" var stunServer = ""
var audioCodec = ArrayList<String>() var audioCodec = ArrayList<String>()
var videoCodec = ArrayList<String>()
var regint = account_regint(accp) var regint = account_regint(accp)
var mediaEnc = account_mediaenc(accp) var mediaEnc = account_mediaenc(accp)
var preferIPv6Media = false var preferIPv6Media = false
@@ -247,6 +248,7 @@ external fun account_set_mediaenc(acc: String, mediaenc: String): Int
external fun account_medianat(acc: String): String external fun account_medianat(acc: String): String
external fun account_set_medianat(acc: String, medianat: String): Int external fun account_set_medianat(acc: String, medianat: String): Int
external fun account_set_audio_codecs(acc: String, codecs: String): Int external fun account_set_audio_codecs(acc: String, codecs: String): Int
external fun account_set_video_codecs(acc: String, codecs: String): Int
external fun account_set_mwi(acc: String, value: String): Int external fun account_set_mwi(acc: String, value: String): Int
external fun account_vm_uri(acc: String): String external fun account_vm_uri(acc: String): String
external fun account_extra(acc: String): String external fun account_extra(acc: String): String
@@ -37,7 +37,6 @@ class AccountActivity : AppCompatActivity() {
internal lateinit var vmUri: EditText internal lateinit var vmUri: EditText
internal lateinit var defaultCheck: CheckBox internal lateinit var defaultCheck: CheckBox
private var newCodecs = ArrayList<String>()
private var save = false private var save = false
private var uaIndex= -1 private var uaIndex= -1
@@ -83,39 +82,6 @@ class AccountActivity : AppCompatActivity() {
regCheck = findViewById(R.id.Register) as CheckBox regCheck = findViewById(R.id.Register) as CheckBox
regCheck.isChecked = acc.regint > 0 regCheck.isChecked = acc.regint > 0
val audioCodecs = ArrayList(Api.audio_codecs().split(","))
newCodecs.addAll(acc.audioCodec)
while (newCodecs.size < audioCodecs.size) newCodecs.add("-")
val layout = findViewById(R.id.CodecSpinners) as LinearLayout
val spinnerList = Array(audioCodecs.size, {_ -> ArrayList<String>()})
for (i in audioCodecs.indices) {
val spinner = Spinner(applicationContext)
spinner.id = i + 100
spinner.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
layout.addView(spinner)
if (acc.audioCodec.size > i) {
val codec = acc.audioCodec[i]
spinnerList[i].add(codec)
spinnerList[i].add("-")
for (c in audioCodecs) if (c != codec) spinnerList[i].add(c)
} else {
spinnerList[i].addAll(audioCodecs)
spinnerList[i].add(0, "-")
}
val codecSpinner = findViewById(spinner.id) as Spinner
val adapter = ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,
spinnerList[i])
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
codecSpinner.adapter = adapter
codecSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
newCodecs.set(parent.id - 100, parent.selectedItem.toString())
}
override fun onNothingSelected(parent: AdapterView<*>) {
}
}
}
mediaNat = acc.mediaNat mediaNat = acc.mediaNat
val mediaNatSpinner = findViewById(R.id.mediaNatSpinner) as Spinner val mediaNatSpinner = findViewById(R.id.mediaNatSpinner) as Spinner
val mediaNatKeys = arrayListOf("stun", "ice", "") val mediaNatKeys = arrayListOf("stun", "ice", "")
@@ -379,18 +345,6 @@ class AccountActivity : AppCompatActivity() {
} }
} }
val ac = ArrayList(LinkedHashSet<String>(newCodecs.filter { it != "-" } as ArrayList<String>))
if (ac != acc.audioCodec) {
val acList = Utils.implode(ac, ",")
if (account_set_audio_codecs(acc.accp, acList) == 0) {
Log.d("Baresip", "New audio codecs '$acList'")
acc.audioCodec = ac
save = true
} else {
Log.e("Baresip", "Setting of audio codecs '$acList' failed")
}
}
if (mediaEnc != acc.mediaEnc) { if (mediaEnc != acc.mediaEnc) {
if (account_set_mediaenc(acc.accp, mediaEnc) == 0) { if (account_set_mediaenc(acc.accp, mediaEnc) == 0) {
acc.mediaEnc = account_mediaenc(acc.accp) acc.mediaEnc = account_mediaenc(acc.accp)
@@ -506,8 +460,12 @@ class AccountActivity : AppCompatActivity() {
getString(R.string.register_help)) getString(R.string.register_help))
} }
findViewById(R.id.AudioCodecsTitle) as TextView -> { findViewById(R.id.AudioCodecsTitle) as TextView -> {
Utils.alertView(this, getString(R.string.audio_codecs), val i = Intent(this, CodecsActivity::class.java)
getString(R.string.audio_codecs_help)) val b = Bundle()
b.putString("aor", aor)
b.putString("media", "audio")
i.putExtras(b)
startActivity(i)
} }
findViewById(R.id.MediaNatTitle) as TextView -> { findViewById(R.id.MediaNatTitle) as TextView -> {
Utils.alertView(this, getString(R.string.media_nat), Utils.alertView(this, getString(R.string.media_nat),
@@ -186,7 +186,6 @@ class AccountsActivity : AppCompatActivity() {
count++ count++
} }
Utils.putFileContents(BaresipService.filesPath + "/accounts", accounts.toByteArray()) Utils.putFileContents(BaresipService.filesPath + "/accounts", accounts.toByteArray())
Log.d("Baresip", "Saved $count account(s) to '${BaresipService.filesPath}/accounts'")
// Log.d("Baresip", "Saved accounts '${accounts}' to '${BaresipService.filesPath}/accounts'") // Log.d("Baresip", "Saved accounts '${accounts}' to '${BaresipService.filesPath}/accounts'")
} }
@@ -9,6 +9,7 @@ object Api {
val VIDMODE_ON = 1 val VIDMODE_ON = 1
external fun audio_codecs(): String external fun audio_codecs(): String
external fun video_codecs(): String
external fun uag_current_set(uap: String) external fun uag_current_set(uap: String)
external fun uag_reset_transp(reg: Boolean, reinvite: Boolean) external fun uag_reset_transp(reg: Boolean, reinvite: Boolean)
external fun ua_account(ua: String): String external fun ua_account(ua: String): String
@@ -0,0 +1,180 @@
package com.tutpro.baresip
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.*
import android.widget.LinearLayout.LayoutParams
class CodecsActivity : AppCompatActivity() {
private lateinit var acc: Account
private lateinit var ua: UserAgent
private var aor = ""
private var newCodecs = ArrayList<String>()
private var media = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_codecs)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
aor = intent.getStringExtra("aor")!!
media = intent.getStringExtra("media")!!
Utils.addActivity("codecs,$aor,$media")
ua = UserAgent.ofAor(aor)!!
acc = ua.account
val codecs: ArrayList<String>
val title = findViewById(R.id.CodecsTitle) as TextView
if (media == "audio") {
title.text = getString(R.string.audio_codecs)
codecs = ArrayList(Api.audio_codecs().split(","))
newCodecs.addAll(acc.audioCodec)
} else {
title.text = getString(R.string.video_codecs)
codecs = ArrayList(Api.video_codecs().split(","))
newCodecs.addAll(acc.videoCodec)
}
while (newCodecs.size < codecs.size) newCodecs.add("-")
val layout = findViewById(R.id.SpinnerTable) as TableLayout
val spinnerList = Array(codecs.size, {_ -> ArrayList<String>()})
for (i in codecs.indices) {
val spinner = Spinner(applicationContext)
spinner.id = i + 100
spinner.layoutParams = TableRow.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT)
spinner.layoutParams.height = 75
layout.addView(spinner)
if (acc.audioCodec.size > i) {
val codec = acc.audioCodec[i]
spinnerList[i].add(codec)
spinnerList[i].add("-")
for (c in codecs) if (c != codec) spinnerList[i].add(c)
} else {
spinnerList[i].addAll(codecs)
spinnerList[i].add(0, "-")
}
val codecSpinner = findViewById(spinner.id) as Spinner
val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item,
spinnerList[i])
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
codecSpinner.adapter = adapter
codecSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
newCodecs.set(parent.id - 100, parent.selectedItem.toString())
}
override fun onNothingSelected(parent: AdapterView<*>) {
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
super.onCreateOptionsMenu(menu)
val inflater = menuInflater
inflater.inflate(R.menu.check_icon, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (BaresipService.activities.indexOf("codecs,$aor,$media") == -1)
return true
when (item.itemId) {
R.id.checkIcon -> {
var save = false
val mc = ArrayList(LinkedHashSet<String>(newCodecs.filter { it != "-" } as ArrayList<String>))
val mcList = Utils.implode(mc, ",")
if (media == "audio")
if (mc != acc.audioCodec) {
if (account_set_audio_codecs(acc.accp, mcList) == 0) {
Log.d("Baresip", "New audio codecs '$mcList'")
acc.audioCodec = mc
save = true
} else {
Log.e("Baresip", "Setting of audio codecs '$mcList' failed")
}
}
if (media == "video")
if (mc != acc.videoCodec) {
if (account_set_video_codecs(acc.accp, mcList) == 0) {
Log.d("Baresip", "New video codecs '$mcList'")
acc.audioCodec = mc
save = true
} else {
Log.e("Baresip", "Setting of video codecs '$mcList' failed")
}
}
if (save) {
AccountsActivity.saveAccounts()
if (Api.ua_update_account(ua.uap) != 0)
Log.e("Baresip", "Failed to update UA ${ua.uap} with AoR $aor")
}
if ((acc.regint > 0) && !((acc.authUser != "") && (acc.authPass == "")))
Api.ua_register(ua.uap)
BaresipService.activities.remove("codecs,$aor,$media")
finish()
return true
}
android.R.id.home -> {
onBackPressed()
return true
}
}
return super.onOptionsItemSelected(item)
}
override fun onBackPressed() {
BaresipService.activities.remove("codecs,$aor,$media")
finish()
super.onBackPressed()
}
override fun onPause() {
MainActivity.activityAor = aor
super.onPause()
}
fun onClick(v: View) {
when (v) {
findViewById(R.id.CodecsTitle) as TextView -> {
if (media == "audio")
Utils.alertView(this, getString(R.string.audio_codecs),
getString(R.string.audio_codecs_help))
else
Utils.alertView(this, getString(R.string.video_codecs),
getString(R.string.video_codecs_help))
}
}
}
}
@@ -1391,6 +1391,14 @@ class MainActivity : AppCompatActivity() {
i.putExtras(b) i.putExtras(b)
startActivityForResult(i, ACCOUNT_CODE) startActivityForResult(i, ACCOUNT_CODE)
} }
"codecs" -> {
val i = Intent(this, CodecsActivity::class.java)
val b = Bundle()
b.putString("aor", activity[1])
b.putString("media", activity[2])
i.putExtras(b)
startActivity(i)
}
"about" -> { "about" -> {
val i = Intent(this, AboutActivity::class.java) val i = Intent(this, AboutActivity::class.java)
startActivityForResult(i, ABOUT_CODE) startActivityForResult(i, ABOUT_CODE)
@@ -1482,7 +1490,6 @@ class MainActivity : AppCompatActivity() {
const val BACKUP_PERMISSION_REQUEST_CODE = 1 const val BACKUP_PERMISSION_REQUEST_CODE = 1
const val RESTORE_PERMISSION_REQUEST_CODE = 2 const val RESTORE_PERMISSION_REQUEST_CODE = 2
const val RECORD_PERMISSION_REQUEST_CODE = 3 const val RECORD_PERMISSION_REQUEST_CODE = 3
const val RESTART_REQUEST_CODE = 4
} }
+3 -9
View File
@@ -146,25 +146,19 @@
android:id="@+id/AudioCodecsTitle" android:id="@+id/AudioCodecsTitle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="10dp"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold"
android:textColor="@android:color/black" android:textColor="@android:color/black"
android:onClick="onClick" android:onClick="onClick"
android:text="@string/audio_codecs" > android:text="@string/audio_codecs" >
</TextView> </TextView>
<LinearLayout
android:id="@+id/CodecSpinners"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:orientation="vertical" >
</LinearLayout>
<TextView <TextView
android:id="@+id/MediaNatTitle" android:id="@+id/MediaNatTitle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="10dp" android:paddingTop="16dp"
android:textSize="18sp" android:textSize="18sp"
android:textColor="@android:color/black" android:textColor="@android:color/black"
android:onClick="onClick" android:onClick="onClick"
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".CodecsActivity" >
<TextView
android:id="@+id/CodecsTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@android:color/black"
android:onClick="onClick"
android:text="@string/audio_codecs" >
</TextView>
<TableLayout
android:id="@+id/SpinnerTable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="36dp" >
</TableLayout>
</RelativeLayout>
+4 -1
View File
@@ -75,7 +75,10 @@
</string> </string>
<string name="audio_codecs">Äänen koodausmenetelmät</string> <string name="audio_codecs">Äänen koodausmenetelmät</string>
<string name="audio_codecs_help">Luettelo käytössä olevista äänen <string name="audio_codecs_help">Luettelo käytössä olevista äänen
koodausmenetelmistä prioriteettijärjestyksessä.</string> koodausmenetelmistä prioriteettijärjestyksessä</string>
<string name="video_codecs">Videon koodausmenetelmät</string>
<string name="video_codecs_help">Luettelo käytössä olevista videon
koodausmenetelmistä prioriteettijärjestyksessä</string>
<string name="media_nat">Media NAT hallinta</string> <string name="media_nat">Media NAT hallinta</string>
<string name="media_nat_help">Valitsee media NAT hallintaprotokollan <string name="media_nat_help">Valitsee media NAT hallintaprotokollan
(vapaaehtoinen). Vaihtoehtoja ovat STUN (Session Traversal Utilities (vapaaehtoinen). Vaihtoehtoja ovat STUN (Session Traversal Utilities
+2
View File
@@ -71,6 +71,8 @@
</string> </string>
<string name="audio_codecs">Audio Codecs</string> <string name="audio_codecs">Audio Codecs</string>
<string name="audio_codecs_help">List of supported audio codecs in priority order.</string> <string name="audio_codecs_help">List of supported audio codecs in priority order.</string>
<string name="video_codecs">Video Codecs</string>
<string name="video_codecs_help">List of supported video codecs in priority order.</string>
<string name="media_nat">Media NAT Traversal</string> <string name="media_nat">Media NAT Traversal</string>
<string name="media_nat_help">Selects media NAT traversal protocol (if any). Possible choices are STUN <string name="media_nat_help">Selects media NAT traversal protocol (if any). Possible choices are STUN
(Session Traversal Utilities for NAT, RFC 5389) and ICE (Interactive Connectivity (Session Traversal Utilities for NAT, RFC 5389) and ICE (Interactive Connectivity