added account_[set_]sipnat API functions
added ua_update_account API function go directly to settings of new account fixed some main activity layout bugs keep main activity interactive when screen is locked removed aor from UserAgent class added register method to UserAgent class added foregrounded and isDeviceLocked util functions updated libbaresip distribution
This commit is contained in:
@ -274,8 +274,8 @@ Java_com_tutpro_baresip_MainActivity_baresipStart(JNIEnv *env, jobject instance,
|
||||
ua = le->data;
|
||||
sprintf(ua_buf, "%lu", (unsigned long)ua);
|
||||
jstring javaUA = (*env)->NewStringUTF(env, ua_buf);
|
||||
LOGD("adding account %s/%s\n", ua_aor(ua), ua_buf);
|
||||
jmethodID accountId = (*env)->GetMethodID(env, pctx->mainActivityClz, "addAccount",
|
||||
LOGD("adding UA for AoR %s/%s\n", ua_aor(ua), ua_buf);
|
||||
jmethodID accountId = (*env)->GetMethodID(env, pctx->mainActivityClz, "addUA",
|
||||
"(Ljava/lang/String;)V");
|
||||
(*env)->CallVoidMethod(env, pctx->mainActivityObj, accountId, javaUA);
|
||||
(*env)->DeleteLocalRef(env, javaUA);
|
||||
@ -569,29 +569,49 @@ Java_com_tutpro_baresip_AccountKt_account_1set_1mediaenc(JNIEnv *env, jobject th
|
||||
(*env)->ReleaseStringUTFChars(env, javaMencid, mencid);
|
||||
return res;
|
||||
}
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_com_tutpro_baresip_AccountKt_account_1sipnat(JNIEnv *env, jobject thiz, jstring javaAcc)
|
||||
{
|
||||
const char *native_acc = (*env)->GetStringUTFChars(env, javaAcc, 0);
|
||||
struct account *acc = (struct account *) strtoul(native_acc, NULL, 10);
|
||||
(*env)->ReleaseStringUTFChars(env, javaAcc, native_acc);
|
||||
if (acc) {
|
||||
const char *sipnat = account_sipnat(acc);
|
||||
if (sipnat) return (*env)->NewStringUTF(env, sipnat);
|
||||
}
|
||||
return (*env)->NewStringUTF(env, "");
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_com_tutpro_baresip_UserAgent_00024Companion_ua_1alloc(JNIEnv *env, jobject thiz,
|
||||
jstring javaSipUri) {
|
||||
const char *sip_uri = (*env)->GetStringUTFChars(env, javaSipUri, 0);
|
||||
struct ua *ua;
|
||||
LOGD("allocating UA '%s'\n", sip_uri);
|
||||
int res = ua_alloc(&ua, sip_uri);
|
||||
(*env)->ReleaseStringUTFChars(env, javaSipUri, sip_uri);
|
||||
if (res == 0) {
|
||||
char ua_buf[64];
|
||||
UpdateContext *pctx = (UpdateContext*)(&g_ctx);
|
||||
sprintf(ua_buf, "%lu", (unsigned long)ua);
|
||||
jstring javaUA = (*env)->NewStringUTF(env, ua_buf);
|
||||
LOGD("adding account %s/%s\n", ua_aor(ua), ua_buf);
|
||||
jmethodID accountId = (*env)->GetMethodID(env, pctx->mainActivityClz, "addAccount",
|
||||
"(Ljava/lang/String;)V");
|
||||
(*env)->CallVoidMethod(env, pctx->mainActivityObj, accountId, javaUA);
|
||||
(*env)->DeleteLocalRef(env, javaUA);
|
||||
}
|
||||
Java_com_tutpro_baresip_AccountKt_account_1set_1sipnat(JNIEnv *env, jobject thiz,
|
||||
jstring javaAcc, jstring javaSipNat) {
|
||||
const char *native_acc = (*env)->GetStringUTFChars(env, javaAcc, 0);
|
||||
struct account *acc = (struct account *)strtoul(native_acc, NULL, 10);
|
||||
(*env)->ReleaseStringUTFChars(env, javaAcc, native_acc);
|
||||
const char *sipnat = (*env)->GetStringUTFChars(env, javaSipNat, 0);
|
||||
int res;
|
||||
if (strlen(sipnat) > 0)
|
||||
res = account_set_sipnat(acc, sipnat);
|
||||
else
|
||||
res = account_set_sipnat(acc, NULL);
|
||||
(*env)->ReleaseStringUTFChars(env, javaSipNat, sipnat);
|
||||
return res;
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_com_tutpro_baresip_UserAgent_00024Companion_ua_1alloc(JNIEnv *env, jobject thiz,
|
||||
jstring javaUri) {
|
||||
const char *uri = (*env)->GetStringUTFChars(env, javaUri, 0);
|
||||
struct ua *ua;
|
||||
LOGD("allocating UA '%s'\n", uri);
|
||||
int res = ua_alloc(&ua, uri);
|
||||
(*env)->ReleaseStringUTFChars(env, javaUri, uri);
|
||||
char ua_buf[64];
|
||||
ua_buf[0] = '\0';
|
||||
if (res == 0) sprintf(ua_buf, "%lu", (unsigned long)ua);
|
||||
return (*env)->NewStringUTF(env, ua_buf);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_com_tutpro_baresip_UserAgent_00024Companion_ua_1register(JNIEnv *env, jobject thiz,
|
||||
jstring javaUA)
|
||||
@ -622,6 +642,16 @@ Java_com_tutpro_baresip_UserAgent_00024Companion_ua_1isregistered(JNIEnv *env, j
|
||||
return ua_isregistered(ua);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_com_tutpro_baresip_UserAgent_00024Companion_ua_1update_1account(JNIEnv *env, jobject thiz,
|
||||
jstring javaUA)
|
||||
{
|
||||
const char *native_ua = (*env)->GetStringUTFChars(env, javaUA, 0);
|
||||
struct ua *ua = (struct ua *)strtoul(native_ua, NULL, 10);
|
||||
(*env)->ReleaseStringUTFChars(env, javaUA, native_ua);
|
||||
return ua_update_account(ua);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_tutpro_baresip_UserAgent_00024Companion_ua_1destroy(JNIEnv *env, jobject thiz,
|
||||
jstring javaUA)
|
||||
|
||||
@ -93,7 +93,7 @@ class Account(val accp: String) {
|
||||
|
||||
fun findUA(aor: String): UserAgent? {
|
||||
for (ua in MainActivity.uas) {
|
||||
if (ua.aor == aor) return ua
|
||||
if (ua.account.aor == aor) return ua
|
||||
}
|
||||
return null
|
||||
}
|
||||
@ -117,6 +117,8 @@ external fun account_auth_pass(acc: String): String
|
||||
external fun account_set_auth_pass(acc: String, pass: String): Int
|
||||
external fun account_outbound(acc: String, ix: Int): String
|
||||
external fun account_set_outbound(acc: String, ob: String, ix: Int): Int
|
||||
external fun account_sipnat(acc: String): String
|
||||
external fun account_set_sipnat(acc: String, sipnat: String): Int
|
||||
external fun account_audio_codec(acc: String, ix: Int): String
|
||||
external fun account_regint(acc: String): Int
|
||||
external fun account_set_regint(acc: String, regint: Int): Int
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package com.tutpro.baresip
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
@ -58,7 +59,7 @@ class AccountActivity : AppCompatActivity() {
|
||||
while (newCodecs.size < audioCodecs.size) newCodecs.add("")
|
||||
|
||||
val layout = findViewById(R.id.CodecSpinners) as LinearLayout
|
||||
var spinnerList = Array(audioCodecs.size, {i -> ArrayList<String>()})
|
||||
val spinnerList = Array(audioCodecs.size, {_ -> ArrayList<String>()})
|
||||
for (i in audioCodecs.indices) {
|
||||
val spinner = Spinner(applicationContext)
|
||||
spinner.id = i + 100
|
||||
@ -121,7 +122,7 @@ class AccountActivity : AppCompatActivity() {
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
|
||||
val i = Intent(this, MainActivity::class.java)
|
||||
val intent = Intent(this, MainActivity::class.java)
|
||||
|
||||
if (item.itemId == R.id.checkIcon) {
|
||||
|
||||
@ -163,7 +164,7 @@ class AccountActivity : AppCompatActivity() {
|
||||
if (Utils.checkPrintASCII(ap)) {
|
||||
if (account_set_auth_pass(acc.accp, ap) == 0) {
|
||||
acc.authPass = account_auth_pass(acc.accp)
|
||||
Log.d("Baresip", "New auth password is ${acc.authPass}")
|
||||
// Log.d("Baresip", "New auth password is ${acc.authPass}")
|
||||
save = true
|
||||
} else {
|
||||
Log.e("Baresip", "Setting of auth pass failed")
|
||||
@ -199,6 +200,10 @@ class AccountActivity : AppCompatActivity() {
|
||||
}
|
||||
Log.d("Baresip", "New outbound proxies are ${outbound}")
|
||||
acc.outbound = outbound
|
||||
if (outbound.isEmpty())
|
||||
account_set_sipnat(acc.accp, "")
|
||||
else
|
||||
account_set_sipnat(acc.accp, "outbound")
|
||||
save = true
|
||||
}
|
||||
|
||||
@ -253,24 +258,25 @@ class AccountActivity : AppCompatActivity() {
|
||||
|
||||
if (save) {
|
||||
AccountsActivity.saveAccounts()
|
||||
if (acc.regint > 0) {
|
||||
Log.d("Baresip", "Registering ${acc.aor}")
|
||||
UserAgent.ua_register(Account.findUA(acc.aor)!!.uap)
|
||||
val uaIndex = UserAgent.findAorIndex(MainActivity.uas, aor)
|
||||
if (uaIndex != null) {
|
||||
if (UserAgent.ua_update_account(MainActivity.uas[uaIndex].uap) != 0)
|
||||
Log.e("Baresip", "Failed to update UA with AoR $aor")
|
||||
else if (acc.regint > 0)
|
||||
UserAgent.ua_register(MainActivity.uas[uaIndex].uap)
|
||||
} else {
|
||||
Log.e("Baresip", "Did not find UA matching AoR $aor")
|
||||
}
|
||||
}
|
||||
setResult(RESULT_OK, i)
|
||||
|
||||
setResult(RESULT_OK, intent)
|
||||
finish()
|
||||
return true
|
||||
|
||||
} else if (item.itemId == android.R.id.home) {
|
||||
|
||||
Log.d("Baresip", "Back array was pressed at Account")
|
||||
i.putExtra("action", "cancel")
|
||||
if (acc.regint > 0) {
|
||||
Log.d("Baresip", "Registering ${acc.aor}")
|
||||
UserAgent.ua_register(Account.findUA(acc.aor)!!.uap)
|
||||
}
|
||||
setResult(RESULT_OK, i)
|
||||
setResult(RESULT_CANCELED, intent)
|
||||
finish()
|
||||
return true
|
||||
|
||||
|
||||
@ -37,12 +37,9 @@ class AccountListAdapter(private val cxt: Context, private val rows: ArrayList<A
|
||||
actionView.setOnClickListener { _ ->
|
||||
Log.d("Baresip", "Delete button clicked")
|
||||
val deleteDialog = AlertDialog.Builder(cxt)
|
||||
deleteDialog.setMessage("Do you want to delete account ${MainActivity.uas[position].aor}?")
|
||||
deleteDialog.setMessage("Do you want to delete account ${MainActivity.uas[position].account.aor}?")
|
||||
deleteDialog.setPositiveButton("Delete") { dialog, _ ->
|
||||
if (UserAgent.ua_isregistered(MainActivity.uas[position].uap)) {
|
||||
UserAgent.ua_unregister(MainActivity.uas[position].uap)
|
||||
}
|
||||
UserAgent.ua_destroy(MainActivity.uas[position].uap)
|
||||
MainActivity.uas[position].destroy()
|
||||
MainActivity.uas.remove(MainActivity.uas[position])
|
||||
MainActivity.images.removeAt(position)
|
||||
AccountsActivity.saveAccounts()
|
||||
|
||||
@ -15,6 +15,7 @@ import java.util.ArrayList
|
||||
class AccountsActivity : AppCompatActivity() {
|
||||
|
||||
internal var aor: String = ""
|
||||
internal lateinit var alAdapter: AccountListAdapter
|
||||
|
||||
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
@ -22,7 +23,7 @@ class AccountsActivity : AppCompatActivity() {
|
||||
|
||||
val listview = findViewById(R.id.accounts) as ListView
|
||||
generateAccounts()
|
||||
val alAdapter = AccountListAdapter(this, accounts)
|
||||
alAdapter = AccountListAdapter(this, accounts)
|
||||
listview.adapter = alAdapter
|
||||
|
||||
val addAccountButton = findViewById(R.id.addAccount) as ImageButton
|
||||
@ -37,17 +38,26 @@ class AccountsActivity : AppCompatActivity() {
|
||||
} else if (Account.exists(MainActivity.uas, aor)) {
|
||||
Log.e("Baresip", "Account $aor already exists")
|
||||
} else {
|
||||
if (UserAgent.ua_alloc("<$aor>;regq=0.5;pubint=0;regint=600") != 0) {
|
||||
Log.e("Baresip", "Failed to allocate UA $aor")
|
||||
val ua = UserAgent.uaAlloc("<$aor>;regq=0.5;pubint=0;regint=0")
|
||||
if (ua == null) {
|
||||
Log.e("Baresip", "Failed to allocate UA for $aor")
|
||||
Utils.alertView(this, "Notice",
|
||||
"Failed to allocate new account. Check your network connection.")
|
||||
"Failed to allocate new account.")
|
||||
} else {
|
||||
SystemClock.sleep(200);
|
||||
newAorView.setText("")
|
||||
newAorView.setHint("SIP URI user@domain")
|
||||
newAorView.hint = "SIP URI user@domain"
|
||||
newAorView.clearFocus()
|
||||
MainActivity.uas.add(ua)
|
||||
MainActivity.images.add(R.drawable.dot_yellow)
|
||||
generateAccounts()
|
||||
alAdapter.notifyDataSetChanged()
|
||||
saveAccounts()
|
||||
recreate()
|
||||
val i = Intent(this, AccountActivity::class.java)
|
||||
val b = Bundle()
|
||||
b.putString("accp", ua.account.accp)
|
||||
i.putExtras(b)
|
||||
startActivity(i)
|
||||
// recreate()
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -84,7 +94,8 @@ class AccountsActivity : AppCompatActivity() {
|
||||
posAtAccounts.clear()
|
||||
var i = 0;
|
||||
for (ua in MainActivity.uas) {
|
||||
accounts.add(AccountRow(ua.aor.replace("sip:", ""), R.drawable.action_remove))
|
||||
accounts.add(AccountRow(ua.account.aor.replace("sip:", ""),
|
||||
R.drawable.action_remove))
|
||||
posAtAccounts.add(i)
|
||||
i++
|
||||
}
|
||||
@ -95,7 +106,7 @@ class AccountsActivity : AppCompatActivity() {
|
||||
for (a in Account.accounts()) accounts = accounts + a.print() + "\n"
|
||||
val path = MainActivity.filesPath + "/accounts"
|
||||
Utils.putFileContents(File(path), accounts)
|
||||
// Log.d("Baresip", "Saved accounts '${accounts}' to '$path")
|
||||
// Log.d("Baresip", "Saved accounts '${accounts}' to '$path")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -36,13 +36,8 @@ class Call(val callp: String, val ua: UserAgent, val peerURI: String, val dir: S
|
||||
return null
|
||||
}
|
||||
|
||||
fun index(calls: ArrayList<Call>, call: Call, dir: String): Int {
|
||||
var res = 0
|
||||
for (c in calls) {
|
||||
if (c == call) return res
|
||||
if ((dir == "") || (call.dir == dir)) res++
|
||||
}
|
||||
return res
|
||||
fun uaCallIndex(calls: ArrayList<Call>, ua: UserAgent, call: Call, dir: String): Int {
|
||||
return uaCalls(calls, ua, dir).indexOf(call)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -56,6 +56,11 @@ class MainActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
|
||||
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
|
||||
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
|
||||
|
||||
setContentView(R.layout.activity_main)
|
||||
|
||||
appContext = applicationContext
|
||||
@ -75,22 +80,17 @@ class MainActivity : AppCompatActivity() {
|
||||
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK or
|
||||
PowerManager.ACQUIRE_CAUSES_WAKEUP, "")
|
||||
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
|
||||
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
|
||||
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
|
||||
|
||||
nb = NotificationCompat.Builder(this)
|
||||
nb.setVisibility(VISIBILITY_PUBLIC).setOngoing(true).setSmallIcon(R.drawable.ic_stat)
|
||||
.setContentIntent(
|
||||
PendingIntent.getActivity(this, NOTIFICATION_ID,
|
||||
Intent(this, MainActivity::class.java)
|
||||
.setAction(Intent.ACTION_MAIN)
|
||||
.addCategory(Intent.CATEGORY_LAUNCHER)
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK),
|
||||
.addCategory(Intent.CATEGORY_LAUNCHER),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT))
|
||||
.setContent(RemoteViews(getPackageName(), R.layout.notification))
|
||||
|
||||
val intentFilter = IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")
|
||||
val netFilter = IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")
|
||||
receiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
val intentExtras = intent.extras
|
||||
@ -99,7 +99,7 @@ class MainActivity : AppCompatActivity() {
|
||||
if (running) UserAgent.register(uas)
|
||||
}
|
||||
}
|
||||
registerReceiver(receiver, intentFilter)
|
||||
registerReceiver(receiver, netFilter)
|
||||
|
||||
aorSpinner = findViewById(R.id.AoRList) as Spinner
|
||||
uaAdapter = UaSpinnerAdapter(applicationContext, uas, images)
|
||||
@ -150,15 +150,11 @@ class MainActivity : AppCompatActivity() {
|
||||
val `in` = Call.uaCalls(calls, ua, "in")
|
||||
val view_count = layout.childCount
|
||||
Log.d("Baresip", "View count is $view_count")
|
||||
if (view_count > 7) {
|
||||
// remove all incoming call views
|
||||
if (view_count > 7)
|
||||
layout.removeViews(7, view_count - 7)
|
||||
}
|
||||
for (c in `in`) {
|
||||
for (call_index in Call.calls(calls, "in").indices) {
|
||||
for (c in `in`)
|
||||
for (call_index in Call.uaCalls(calls, ua,"in").indices)
|
||||
addCallViews(ua, c, (call_index + 1) * 10)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onNothingSelected(parent: AdapterView<*>) {
|
||||
@ -278,7 +274,7 @@ class MainActivity : AppCompatActivity() {
|
||||
callButton.tag = "Call"
|
||||
callButton.setOnClickListener {
|
||||
val ua = uas[aorSpinner.selectedItemPosition]
|
||||
val aor = ua.aor
|
||||
val aor = ua.account.aor
|
||||
when (callButton.tag) {
|
||||
"Call" -> {
|
||||
val calleeText = (findViewById(R.id.callee) as EditText).text.toString()
|
||||
@ -341,7 +337,7 @@ class MainActivity : AppCompatActivity() {
|
||||
historyButton.setOnClickListener {
|
||||
val i = Intent(this@MainActivity, HistoryActivity::class.java)
|
||||
val b = Bundle()
|
||||
b.putString("aor", uas[aorSpinner.selectedItemPosition].aor)
|
||||
b.putString("aor", uas[aorSpinner.selectedItemPosition].account.aor)
|
||||
i.putExtras(b)
|
||||
startActivityForResult(i, HISTORY_CODE)
|
||||
}
|
||||
@ -362,6 +358,17 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
Log.d("Baresip", "Paused")
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
Log.d("Baresip", "Resumed")
|
||||
nm.cancel(INCOMING_ID)
|
||||
}
|
||||
|
||||
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||
super.onConfigurationChanged(newConfig)
|
||||
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
||||
@ -405,11 +412,10 @@ class MainActivity : AppCompatActivity() {
|
||||
am.isSpeakerphoneOn = !am.isSpeakerphoneOn
|
||||
val speakerIcon = findViewById(R.id.speakerIcon) as ActionMenuItemView
|
||||
if (am.isSpeakerphoneOn)
|
||||
// speakerIcon.setIcon(ContextCompat.getDrawable(this, R.drawable.speaker_on))
|
||||
speakerIcon.setBackgroundColor(Color.rgb(0x04, 0xb4, 0x04))
|
||||
else
|
||||
// speakerIcon.setBackgroundColor(resources.getColor(R.color.colorPrimary, applicationContext.theme))
|
||||
speakerIcon.setBackgroundColor(resources.getColor(R.color.colorPrimary))
|
||||
speakerIcon.setBackgroundColor(ContextCompat.getColor(applicationContext,
|
||||
R.color.colorPrimary))
|
||||
return true
|
||||
}
|
||||
R.id.accounts -> {
|
||||
@ -489,7 +495,7 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
if (resultCode == RESULT_CANCELED) {
|
||||
Log.d("Baresip", "History canceled")
|
||||
if (History.aorHistory(history, uas[aorSpinner.selectedItemPosition].aor) == 0) {
|
||||
if (History.aorHistory(history, uas[aorSpinner.selectedItemPosition].account.aor) == 0) {
|
||||
holdButton.visibility = View.INVISIBLE
|
||||
}
|
||||
}
|
||||
@ -727,16 +733,16 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
@Keep
|
||||
fun addAccount(ua: String) {
|
||||
val userAgent = UserAgent(ua)
|
||||
uas.add(userAgent)
|
||||
if (UserAgent.ua_isregistered(ua)) {
|
||||
fun addUA(uap: String) {
|
||||
val ua = UserAgent(uap)
|
||||
uas.add(ua)
|
||||
if (UserAgent.ua_isregistered(uap)) {
|
||||
Log.d("Baresip", "Ua $ua is registered")
|
||||
images.add(R.drawable.dot_green)
|
||||
} else {
|
||||
Log.d("Baresip", "Ua $ua is NOT registered")
|
||||
images.add(R.drawable.dot_yellow)
|
||||
UserAgent.ua_register(ua)
|
||||
ua.register()
|
||||
}
|
||||
this@MainActivity.runOnUiThread {
|
||||
uaAdapter.notifyDataSetChanged()
|
||||
@ -753,14 +759,14 @@ class MainActivity : AppCompatActivity() {
|
||||
Log.e("Baresip", "Update status did not find ua $uap")
|
||||
return
|
||||
}
|
||||
val aor = ua.aor
|
||||
val aor = ua.account.aor
|
||||
val acc = ua.account
|
||||
val ev = event.split(",")
|
||||
|
||||
Log.d("Baresip", "Handling event ${ev[0]} for $uap/$callp/$aor")
|
||||
|
||||
for (account_index in uas.indices) {
|
||||
if (uas[account_index].aor == aor) {
|
||||
if (uas[account_index].account.aor == aor) {
|
||||
Log.d("Baresip", "Found AoR at index $account_index")
|
||||
when (ev[0]) {
|
||||
"registering", "unregistering" -> {
|
||||
@ -796,13 +802,16 @@ class MainActivity : AppCompatActivity() {
|
||||
this@MainActivity.runOnUiThread {
|
||||
calls.add(new_call)
|
||||
if (ua != uas[aorSpinner.selectedItemPosition])
|
||||
aorSpinner.setSelection(UserAgent.findAorIndex(uas, aor)!!)
|
||||
addCallViews(ua, new_call, Call.calls(calls, "in").size * 10)
|
||||
aorSpinner.setSelection(account_index)
|
||||
else
|
||||
addCallViews(ua, new_call, Call.uaCalls(calls, ua,"in").size * 10)
|
||||
am.mode = AudioManager.MODE_RINGTONE
|
||||
}
|
||||
val i = Intent(this, MainActivity::class.java)
|
||||
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
|
||||
startActivity(i)
|
||||
if (Utils.foregrounded()) {
|
||||
val i = Intent(this, MainActivity::class.java)
|
||||
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
|
||||
startActivity(i)
|
||||
}
|
||||
}
|
||||
"call established" -> {
|
||||
val call = Call.find(calls, callp)
|
||||
@ -845,7 +854,7 @@ class MainActivity : AppCompatActivity() {
|
||||
this@MainActivity.runOnUiThread {
|
||||
if (ua == uas[aorSpinner.selectedItemPosition]) {
|
||||
if (acc.mediaenc != "") {
|
||||
val inIndex = Call.index(calls, call, "in")
|
||||
val inIndex = Call.uaCallIndex(calls, ua, call, "in")
|
||||
val view_id = (inIndex + 1) * 10 + 3
|
||||
val securityButton = findViewById(view_id) as ImageButton
|
||||
securityButton.setImageResource(R.drawable.box_red)
|
||||
@ -895,7 +904,7 @@ class MainActivity : AppCompatActivity() {
|
||||
securityButton.visibility = View.VISIBLE
|
||||
} else {
|
||||
if (ua == uas[aorSpinner.selectedItemPosition]) {
|
||||
val view_id = (Call.index(calls, call, "in") + 1) * 10 + 3
|
||||
val view_id = (Call.uaCallIndex(calls, ua, call,"in") + 1) * 10 + 3
|
||||
val securityButton = layout.findViewById(view_id) as ImageButton
|
||||
securityButton.setImageResource(security)
|
||||
setSecurityButtonTag(securityButton, security)
|
||||
@ -913,7 +922,7 @@ class MainActivity : AppCompatActivity() {
|
||||
securityButton.visibility = View.VISIBLE
|
||||
} else {
|
||||
if (ua == uas[aorSpinner.selectedItemPosition]) {
|
||||
val view_id = (Call.index(calls, call, "in") + 1) * 10 + 3
|
||||
val view_id = (Call.uaCallIndex(calls, ua, call,"in") + 1) * 10 + 3
|
||||
val securityButton = layout.findViewById(view_id) as ImageButton
|
||||
securityButton.setImageResource(R.drawable.box_yellow)
|
||||
securityButton.tag = "yellow"
|
||||
@ -944,7 +953,7 @@ class MainActivity : AppCompatActivity() {
|
||||
} else {
|
||||
this@MainActivity.runOnUiThread {
|
||||
if (ua == uas[aorSpinner.selectedItemPosition]) {
|
||||
val view_id = (Call.index(calls, call, "in") + 1) * 10 + 3
|
||||
val view_id = (Call.uaCallIndex(calls, ua, call, "in") + 1) * 10 + 3
|
||||
val securityButton = layout.findViewById(view_id) as ImageButton
|
||||
securityButton.setImageResource(R.drawable.box_green)
|
||||
securityButton.tag = "green"
|
||||
@ -962,10 +971,10 @@ class MainActivity : AppCompatActivity() {
|
||||
if (call.dir == "in") {
|
||||
Log.d("Baresip", "Removing inbound call ${uap}/${callp}/" +
|
||||
call.peerURI)
|
||||
val inIndex = Call.index(calls, call, "in")
|
||||
val inIndex = Call.uaCallIndex(calls, ua, call, "in")
|
||||
val view_id = (inIndex + 1) * 10
|
||||
val remove_count = Call.calls(calls, "in").size - inIndex
|
||||
calls.removeAt(Call.index(calls, call, ""))
|
||||
val remove_count = Call.uaCalls(calls, ua,"in").size - inIndex
|
||||
calls.remove(call)
|
||||
this@MainActivity.runOnUiThread {
|
||||
if (ua == uas[aorSpinner.selectedItemPosition]) {
|
||||
if (callButton.tag == "Call") {
|
||||
@ -974,7 +983,7 @@ class MainActivity : AppCompatActivity() {
|
||||
val caller_heading = layout.findViewById(view_id)
|
||||
val view_index = layout.indexOfChild(caller_heading)
|
||||
layout.removeViews(view_index, 3 * remove_count)
|
||||
val callsIn = Call.calls(calls, "in")
|
||||
val callsIn = Call.uaCalls(calls, ua,"in")
|
||||
for (i in inIndex until callsIn.size) {
|
||||
this@MainActivity.addCallViews(ua, callsIn[i], (i + 1) * 10)
|
||||
}
|
||||
@ -1005,7 +1014,7 @@ class MainActivity : AppCompatActivity() {
|
||||
dtmf.visibility = View.INVISIBLE
|
||||
historyButton.visibility = View.VISIBLE
|
||||
}
|
||||
calls.removeAt(Call.index(calls, call, ""))
|
||||
calls.remove(call)
|
||||
}
|
||||
if (!call.hasHistory) {
|
||||
if (History.aorHistory(history, aor) > HISTORY_SIZE)
|
||||
@ -1079,6 +1088,7 @@ class MainActivity : AppCompatActivity() {
|
||||
const val RECORD_AUDIO_PERMISSION = 1
|
||||
const val HISTORY_SIZE = 100
|
||||
const val NOTIFICATION_ID = 10
|
||||
const val INCOMING_ID = 11
|
||||
|
||||
external fun contacts_remove()
|
||||
external fun contact_add(contact: String)
|
||||
|
||||
@ -27,7 +27,7 @@ class UaSpinnerAdapter(private val cxt: Context, private val uas: ArrayList<User
|
||||
val inflater = cxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
|
||||
val row = inflater.inflate(R.layout.account_spinner, parent, false)
|
||||
val textView = row.findViewById(R.id.spinnerText) as TextView
|
||||
textView.text = uas[position].aor.replace("sip:", "")
|
||||
textView.text = uas[position].account.aor.replace("sip:", "")
|
||||
textView.textSize = 17f
|
||||
val imageView = row.findViewById(R.id.spinnerImage) as ImageView
|
||||
imageView.setImageResource(images[position])
|
||||
|
||||
@ -5,16 +5,37 @@ import android.util.Log
|
||||
class UserAgent (val uap: String) {
|
||||
|
||||
val account = Account(ua_account(uap))
|
||||
val aor = ua_aor(uap)
|
||||
|
||||
fun register() {
|
||||
if (account.regint > 0) {
|
||||
Log.d("Baresip", "Registering ${account.aor} UA ${uap}")
|
||||
val accp = ua_account(uap)
|
||||
val reg_int = account_regint(accp)
|
||||
Log.d("Baresip", "reg_int is $reg_int")
|
||||
if (ua_register(uap) != 0)
|
||||
Log.e("Baresip", "Registering failed")
|
||||
}
|
||||
}
|
||||
|
||||
fun destroy() {
|
||||
ua_destroy(uap)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
external fun ua_alloc(uri: String): Int
|
||||
external fun ua_alloc(uri: String): String
|
||||
external fun ua_update_account(ua: String): Int
|
||||
external fun ua_destroy(ua: String)
|
||||
external fun ua_register(ua: String): Int
|
||||
external fun ua_isregistered(ua: String): Boolean
|
||||
external fun ua_unregister(ua: String)
|
||||
|
||||
fun uaAlloc(uri: String): UserAgent? {
|
||||
val uap = ua_alloc(uri)
|
||||
if (uap != "") return UserAgent(uap)
|
||||
return null
|
||||
}
|
||||
|
||||
fun find(uas: ArrayList<UserAgent>, uap: String): UserAgent? {
|
||||
for (ua in uas) {
|
||||
if (ua.uap == uap) return ua
|
||||
@ -24,7 +45,7 @@ class UserAgent (val uap: String) {
|
||||
|
||||
fun findAorIndex(uas: ArrayList<UserAgent>, aor: String): Int? {
|
||||
for (i in uas.indices) {
|
||||
if (uas[i].aor == aor) return i
|
||||
if (uas[i].account.aor == aor) return i
|
||||
}
|
||||
return null
|
||||
}
|
||||
@ -32,7 +53,7 @@ class UserAgent (val uap: String) {
|
||||
fun register(uas: ArrayList<UserAgent>) {
|
||||
for (ua in uas) {
|
||||
if (ua_register(ua.uap) != 0)
|
||||
Log.e("Baresip", "Failed to register ${ua.aor}")
|
||||
Log.e("Baresip", "Failed to register ${ua.account.aor}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1,17 @@
|
||||
package com.tutpro.baresip
|
||||
|
||||
import android.app.ActivityManager
|
||||
import android.content.Context
|
||||
import android.support.v7.app.AlertDialog
|
||||
import android.util.Log
|
||||
import android.net.ConnectivityManager
|
||||
|
||||
import java.io.*
|
||||
import android.os.Build
|
||||
import android.os.PowerManager
|
||||
import android.app.KeyguardManager
|
||||
|
||||
|
||||
|
||||
object Utils {
|
||||
|
||||
@ -127,6 +133,30 @@ object Utils {
|
||||
}
|
||||
}
|
||||
|
||||
fun foregrounded(): Boolean {
|
||||
val appProcessInfo = ActivityManager.RunningAppProcessInfo()
|
||||
ActivityManager.getMyMemoryState(appProcessInfo);
|
||||
return ((appProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) or
|
||||
(appProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE))
|
||||
}
|
||||
|
||||
fun isDeviceLocked(context: Context): Boolean {
|
||||
val isLocked: Boolean
|
||||
|
||||
val keyguardManager = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
|
||||
val inKeyguardRestrictedInputMode = keyguardManager.inKeyguardRestrictedInputMode()
|
||||
|
||||
if (inKeyguardRestrictedInputMode) {
|
||||
isLocked = true
|
||||
} else {
|
||||
val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
|
||||
isLocked = !powerManager.isInteractive
|
||||
}
|
||||
|
||||
Log.d("Baresip", "Now device is ${if (isLocked) "locked" else "unlocked"}")
|
||||
return isLocked
|
||||
}
|
||||
|
||||
external fun cmd_exec(cmd: String): Int
|
||||
external fun uri_decode(uri: String): Boolean
|
||||
external fun audio_codecs(): String
|
||||
|
||||
Reference in New Issue
Block a user