diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4d98ad7a..a5ea1595 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -74,7 +74,7 @@
0)
if (vmNew == 1)
- new = "$vmNew new message"
+ new = cxt.getString(R.string.one_new_message)
else
- new = "$vmNew new messages"
+ new = "$vmNew ${cxt.getString(R.string.new_messages)}"
if (vmOld > 0)
if (vmOld == 1)
- old = "$vmOld old message"
+ old = cxt.getString(R.string.one_old_message)
else
- old = "$vmOld old messages"
- var msg = "You have"
+ old = "$vmOld ${cxt.getString(R.string.old_messages)}"
+ var msg = cxt.getString(R.string.you_have)
if (new != "") {
msg = "$msg $new"
- if (old != "") msg = "$msg and $old"
+ if (old != "") msg = "$msg ${cxt.getString(R.string.and)} $old"
} else {
if (old != "")
msg = "$msg $old"
else
- msg = "$msg no messages"
+ msg = cxt.getString(R.string.no_messages)
}
return "$msg."
}
diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt
index d81f2c22..98f016ca 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/AccountActivity.kt
@@ -57,33 +57,6 @@ class AccountActivity : AppCompatActivity() {
outbound2.setText(acc.outbound[1])
}
- mediaNat = acc.mediaNat
- val mediaNatSpinner = findViewById(R.id.mediaNatSpinner) as Spinner
- val mediaNatKeys = arrayListOf("stun", "ice", "")
- val mediaNatVals = arrayListOf("STUN", "ICE", "None")
- var keyIx = mediaNatKeys.indexOf(acc.mediaNat)
- var keyVal = mediaNatVals.elementAt(keyIx)
- mediaNatKeys.removeAt(keyIx)
- mediaNatVals.removeAt(keyIx)
- mediaNatKeys.add(0, acc.mediaNat)
- mediaNatVals.add(0, keyVal)
- val mediaNatAdapter = ArrayAdapter(this,android.R.layout.simple_spinner_item,
- mediaNatVals)
- mediaNatAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
- mediaNatSpinner.adapter = mediaNatAdapter
- mediaNatSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
- override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
- mediaNat = mediaNatKeys[mediaNatVals.indexOf(parent.selectedItem.toString())]
- stunServer.isEnabled = mediaNat != ""
- }
- override fun onNothingSelected(parent: AdapterView<*>) {
- }
- }
-
- stunServer = findViewById(R.id.StunServer) as EditText
- stunServer.setText(acc.stunServer)
- stunServer.isEnabled = mediaNat != ""
-
regCheck = findViewById(R.id.Register) as CheckBox
regCheck.isChecked = acc.regint > 0
@@ -123,10 +96,37 @@ class AccountActivity : AppCompatActivity() {
}
}
+ mediaNat = acc.mediaNat
+ val mediaNatSpinner = findViewById(R.id.mediaNatSpinner) as Spinner
+ val mediaNatKeys = arrayListOf("stun", "ice", "")
+ val mediaNatVals = arrayListOf("STUN", "ICE", "-")
+ var keyIx = mediaNatKeys.indexOf(acc.mediaNat)
+ var keyVal = mediaNatVals.elementAt(keyIx)
+ mediaNatKeys.removeAt(keyIx)
+ mediaNatVals.removeAt(keyIx)
+ mediaNatKeys.add(0, acc.mediaNat)
+ mediaNatVals.add(0, keyVal)
+ val mediaNatAdapter = ArrayAdapter(this,android.R.layout.simple_spinner_item,
+ mediaNatVals)
+ mediaNatAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
+ mediaNatSpinner.adapter = mediaNatAdapter
+ mediaNatSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
+ override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) {
+ mediaNat = mediaNatKeys[mediaNatVals.indexOf(parent.selectedItem.toString())]
+ stunServer.isEnabled = mediaNat != ""
+ }
+ override fun onNothingSelected(parent: AdapterView<*>) {
+ }
+ }
+
+ stunServer = findViewById(R.id.StunServer) as EditText
+ stunServer.setText(acc.stunServer)
+ stunServer.isEnabled = mediaNat != ""
+
mediaEnc = acc.mediaEnc
val mediaEncSpinner = findViewById(R.id.mediaEncSpinner) as Spinner
val mediaEncKeys = arrayListOf("zrtp", "dtls_srtp", "srtp-mandf", "srtp-mand", "srtp", "")
- val mediaEncVals = arrayListOf("ZRTP", "DTLS-SRTPF", "SRTP-MANDF", "SRTP-MAND", "SRTP", "None")
+ val mediaEncVals = arrayListOf("ZRTP", "DTLS-SRTPF", "SRTP-MANDF", "SRTP-MAND", "SRTP", "-")
keyIx = mediaEncKeys.indexOf(acc.mediaEnc)
keyVal = mediaEncVals.elementAt(keyIx)
mediaEncKeys.removeAt(keyIx)
diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountListAdapter.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountListAdapter.kt
index 4377d87c..d5904bbe 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/AccountListAdapter.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/AccountListAdapter.kt
@@ -41,10 +41,7 @@ class AccountListAdapter(private val cxt: Context, private val rows: ArrayList
- dialog.dismiss()
- }
- deleteDialog.setNegativeButton(cxt.getText(R.string.delete)) { dialog, _ ->
+ deleteDialog.setPositiveButton(cxt.getText(R.string.delete)) { dialog, _ ->
Api.ua_destroy(ua.uap)
UserAgent.remove(ua)
AccountsActivity.generateAccounts()
@@ -52,6 +49,9 @@ class AccountListAdapter(private val cxt: Context, private val rows: ArrayList
+ dialog.dismiss()
+ }
deleteDialog.create().show()
}
return rowView
diff --git a/app/src/main/kotlin/com/tutpro/baresip/AccountsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/AccountsActivity.kt
index f0751533..3f33b5bc 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/AccountsActivity.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/AccountsActivity.kt
@@ -36,10 +36,9 @@ class AccountsActivity : AppCompatActivity() {
val newAorView = findViewById(R.id.newAor) as EditText
addAccountButton.setOnClickListener{
var aor = newAorView.text.toString().trim()
- if (!aor.startsWith("sip:")) aor = "sip:$aor"
- if (!Utils.checkAorUri(aor)) {
- Log.d("Baresip", "Invalid SIP Address of Record $aor")
- Utils.alertView(this, getString(R.string.notice),
+ if (!Utils.checkAor(aor)) {
+ Log.d("Baresip", "Invalid Address of Record $aor")
+ Utils.alertView(this, getString(R.string.error),
String.format(getString(R.string.invalid_aor), aor))
} else if (Account.exists(aor)) {
Log.d("Baresip", "Account $aor already exists")
@@ -53,7 +52,7 @@ class AccountsActivity : AppCompatActivity() {
getString(R.string.account_allocation_failure))
} else {
newAorView.setText("")
- newAorView.hint = getString(R.string.sip_uri_user_domain)
+ newAorView.hint = getString(R.string.user_domain)
newAorView.clearFocus()
UserAgent.add(ua, R.drawable.dot_yellow)
generateAccounts()
diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt
index 8bed38bb..c2b8f828 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt
@@ -690,6 +690,7 @@ class BaresipService: Service() {
}
private fun abandonAudioFocus() {
+ Log.d(LOG_TAG, "Abandonin audio focus")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (audioFocusRequest != null) {
am.abandonAudioFocusRequest(audioFocusRequest!!)
diff --git a/app/src/main/kotlin/com/tutpro/baresip/CallsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/CallsActivity.kt
index e64bd93e..d4d2ba92 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/CallsActivity.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/CallsActivity.kt
@@ -29,7 +29,7 @@ class CallsActivity : AppCompatActivity() {
val ua = Account.findUa(aor)!!
val headerView = findViewById(R.id.account) as TextView
- val headerText = "Account ${aor.substringAfter(":")}"
+ val headerText = "${getString(R.string.account)} ${aor.substringAfter(":")}"
headerView.text = headerText
val listView = findViewById(R.id.calls) as ListView
@@ -45,10 +45,10 @@ class CallsActivity : AppCompatActivity() {
peerName = Utils.friendlyUri(peerName, Utils.aorDomain(aor))
val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) {
- DialogInterface.BUTTON_NEUTRAL, DialogInterface.BUTTON_NEGATIVE -> {
+ DialogInterface.BUTTON_POSITIVE, DialogInterface.BUTTON_NEGATIVE -> {
val i = Intent(this@CallsActivity, MainActivity::class.java)
i.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP
- if (which == DialogInterface.BUTTON_NEUTRAL)
+ if (which == DialogInterface.BUTTON_NEGATIVE)
i.putExtra("action", "call")
else
i.putExtra("action", "message")
@@ -56,15 +56,16 @@ class CallsActivity : AppCompatActivity() {
i.putExtra("peer", peerUri)
startActivity(i)
}
- DialogInterface.BUTTON_POSITIVE -> {
+ DialogInterface.BUTTON_NEUTRAL -> {
}
}
}
val builder = AlertDialog.Builder(this@CallsActivity, R.style.Theme_AppCompat)
- builder.setMessage("Do you want to call or send message to '$peerName'?")
- .setNeutralButton("Call", dialogClickListener)
- .setNegativeButton("Send Message", dialogClickListener)
- .setPositiveButton("Cancel", dialogClickListener)
+ builder.setMessage(String.format(getString(R.string.calls_call_message_question),
+ peerName))
+ .setNeutralButton(getString(R.string.cancel), dialogClickListener)
+ .setNegativeButton(getString(R.string.call), dialogClickListener)
+ .setPositiveButton(getString(R.string.send_message), dialogClickListener)
.show()
}
listView.onItemLongClickListener = AdapterView.OnItemLongClickListener { _, _, pos, _ ->
@@ -72,7 +73,7 @@ class CallsActivity : AppCompatActivity() {
val peerName = ContactsActivity.contactName(peerUri)
val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) {
- DialogInterface.BUTTON_NEUTRAL -> {
+ DialogInterface.BUTTON_NEGATIVE -> {
val i = Intent(this, ContactActivity::class.java)
val b = Bundle()
b.putBoolean("new", true)
@@ -80,7 +81,7 @@ class CallsActivity : AppCompatActivity() {
i.putExtras(b)
startActivityForResult(i, MainActivity.CONTACT_CODE)
}
- DialogInterface.BUTTON_NEGATIVE -> {
+ DialogInterface.BUTTON_POSITIVE -> {
removeUaHistoryAt(pos)
if (uaHistory.size == 0) {
val i = Intent()
@@ -89,25 +90,30 @@ class CallsActivity : AppCompatActivity() {
}
adapter.notifyDataSetChanged()
}
- DialogInterface.BUTTON_POSITIVE -> {
+ DialogInterface.BUTTON_NEUTRAL -> {
}
}
}
val callText: String
- if (uaHistory[pos].directions.size > 1) callText = "Calls" else callText = "Call"
+ if (uaHistory[pos].directions.size > 1)
+ callText = getString(R.string.calls_calls)
+ else
+ callText = getString(R.string.calls_call)
val builder = AlertDialog.Builder(this@CallsActivity, R.style.Theme_AppCompat)
if (peerName.startsWith("sip:"))
- builder.setMessage("Do you want to add '" +
- "${Utils.friendlyUri(peerName, Utils.aorDomain(aor))}' to contacts " +
- "or delete ${callText.toLowerCase()} from history?")
- .setPositiveButton("Cancel", dialogClickListener)
- .setNegativeButton("Delete $callText", dialogClickListener)
- .setNeutralButton("Add Contact", dialogClickListener)
+ builder.setMessage(String.format(getString(R.string.calls_add_delete_question),
+ Utils.friendlyUri(peerName, Utils.aorDomain(aor)), callText))
+ .setNeutralButton(getString(R.string.cancel), dialogClickListener)
+ .setNegativeButton(getString(R.string.add_contact), dialogClickListener)
+ .setPositiveButton(String.format(getString(R.string.delete), callText),
+ dialogClickListener)
.show()
else
- builder.setMessage("Do you want to delete ${callText.toLowerCase()} from history?")
- .setPositiveButton("Cancel", dialogClickListener)
- .setNegativeButton("Delete $callText", dialogClickListener)
+ builder.setMessage(String.format(getString(R.string.calls_delete_question),
+ Utils.friendlyUri(peerName, Utils.aorDomain(aor)), callText))
+ .setNeutralButton(getString(R.string.cancel), dialogClickListener)
+ .setPositiveButton(String.format(getString(R.string.delete), callText),
+ dialogClickListener)
.show()
true
}
diff --git a/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt
index 78a72fc5..f9bcab33 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/ChatActivity.kt
@@ -77,7 +77,7 @@ class ChatActivity : AppCompatActivity() {
listView.onItemLongClickListener = AdapterView.OnItemLongClickListener { _, _, pos, _ ->
val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) {
- DialogInterface.BUTTON_NEUTRAL -> {
+ DialogInterface.BUTTON_POSITIVE -> {
val i = Intent(this, ContactActivity::class.java)
val b = Bundle()
b.putBoolean("new", true)
@@ -94,7 +94,7 @@ class ChatActivity : AppCompatActivity() {
}
Message.saveMessages(applicationContext.filesDir.absolutePath)
}
- DialogInterface.BUTTON_POSITIVE -> {
+ DialogInterface.BUTTON_NEUTRAL -> {
}
}
}
@@ -102,13 +102,13 @@ class ChatActivity : AppCompatActivity() {
if (ContactsActivity.contactName(peerUri) == peerUri)
builder.setMessage(String.format(getString(R.string.long_message_question),
chatPeer))
- .setPositiveButton(getString(R.string.cancel), dialogClickListener)
+ .setNeutralButton(getString(R.string.cancel), dialogClickListener)
.setNegativeButton(getString(R.string.delete), dialogClickListener)
- .setNeutralButton(getString(R.string.add_contact), dialogClickListener)
+ .setPositiveButton(getString(R.string.add_contact), dialogClickListener)
.show()
else
builder.setMessage(getText(R.string.short_message_question))
- .setPositiveButton(getString(R.string.cancel), dialogClickListener)
+ .setNeutralButton(getString(R.string.cancel), dialogClickListener)
.setNegativeButton(getString(R.string.delete), dialogClickListener)
.show()
true
diff --git a/app/src/main/kotlin/com/tutpro/baresip/ChatListAdapter.kt b/app/src/main/kotlin/com/tutpro/baresip/ChatListAdapter.kt
index 75d043c8..29e07ac2 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/ChatListAdapter.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/ChatListAdapter.kt
@@ -38,7 +38,7 @@ class ChatListAdapter(private val cxt: Context, private var rows: ArrayList
val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) {
- DialogInterface.BUTTON_NEUTRAL -> {
+ DialogInterface.BUTTON_POSITIVE -> {
val i = Intent(this, ContactActivity::class.java)
val b = Bundle()
b.putBoolean("new", true)
@@ -76,7 +76,7 @@ class ChatsActivity: AppCompatActivity() {
Message.saveMessages(filesPath)
uaMessages = uaMessages(aor)
}
- DialogInterface.BUTTON_POSITIVE -> {
+ DialogInterface.BUTTON_NEUTRAL -> {
}
}
}
@@ -86,13 +86,13 @@ class ChatsActivity: AppCompatActivity() {
if (peer.startsWith("sip:"))
builder.setMessage(String.format(getString(R.string.long_chat_question),
Utils.friendlyUri(peer, Utils.aorDomain(aor))))
- .setPositiveButton(getText(R.string.cancel), dialogClickListener)
+ .setNeutralButton(getText(R.string.cancel), dialogClickListener)
.setNegativeButton(getText(R.string.delete), dialogClickListener)
- .setNeutralButton(getText(R.string.add_contact), dialogClickListener)
+ .setPositiveButton(getText(R.string.add_contact), dialogClickListener)
.show()
else
builder.setMessage(String.format(getString(R.string.short_chat_question), peer))
- .setPositiveButton(getText(R.string.cancel), dialogClickListener)
+ .setNeutralButton(getText(R.string.cancel), dialogClickListener)
.setNegativeButton(getText(R.string.delete), dialogClickListener)
.show()
true
@@ -115,7 +115,8 @@ class ChatsActivity: AppCompatActivity() {
}
}
if (!Utils.checkSipUri(uri)) {
- Utils.alertView(this, "Notice", "Invalid SIP URI '$uri'")
+ Utils.alertView(this, getString(R.string.error),
+ getString(R.string.invalid_chat_peer_uri))
} else {
peerUri.text.clear()
peerUri.isCursorVisible = false
diff --git a/app/src/main/kotlin/com/tutpro/baresip/ContactActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ContactActivity.kt
index 79773385..98dbf987 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/ContactActivity.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/ContactActivity.kt
@@ -24,13 +24,13 @@ class ContactActivity : AppCompatActivity() {
new = intent.getBooleanExtra("new", false)
if (new) {
- setTitle("New Contact")
+ setTitle(getString(R.string.new_contact))
nameView.setText("")
- nameView.hint = "Contact name"
+ nameView.hint = getString(R.string.contact_name)
nameView.setSelection(nameView.text.length)
if (uri == "") {
uriView.setText("")
- uriView.hint = "SIP URI"
+ uriView.hint = getString(R.string.sip_uri)
} else {
uriView.setText(uri)
}
@@ -58,30 +58,32 @@ class ContactActivity : AppCompatActivity() {
val newName = nameView.text.toString().trim()
if (!Utils.checkName(newName)) {
- Utils.alertView(this, "Notice",
- "Invalid contact name: $newName")
+ Utils.alertView(this, getString(R.string.error),
+ String.format(getString(R.string.invalid_contact), newName))
return false
}
if ((new || (Contact.contacts()[index].name != newName)) &&
ContactsActivity.nameExists(newName)) {
- Utils.alertView(this, "Notice",
- "Contact $newName already exists")
+ Utils.alertView(this, getString(R.string.error),
+ String.format(getString(R.string.contact_already_exists), newName))
return false
}
var newUri = uriView.text.toString().trim()
if (!newUri.startsWith("<")) {
if (!newUri.startsWith("sip:")) newUri = "sip:$newUri"
- if (!Utils.checkAorUri(newUri)) {
- Utils.alertView(this, "Notice","Invalid contact URI: $newUri")
+ if (!Utils.checkAor(newUri.substringAfter("sip:"))) {
+ Utils.alertView(this, getString(R.string.error),
+ String.format(getString(R.string.invalid_contact_uri), newUri))
return false
}
}
if (new) {
if (Contact.contacts().size >= Contact.CONTACTS_SIZE) {
- Utils.alertView(this,
- "Notice", "Maximum number of contacts exceeded")
+ Utils.alertView(this, getString(R.string.notice),
+ String.format(getString(R.string.contacts_exceeded),
+ Contact.CONTACTS_SIZE))
return true
} else {
Contact.contacts().add(Contact(newName, newUri))
diff --git a/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt b/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt
index 759ed3cd..bfd38fcd 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt
@@ -31,11 +31,11 @@ class ContactListAdapter(private val cxt: Context, private val rows: ArrayList
val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) {
- DialogInterface.BUTTON_NEUTRAL, DialogInterface.BUTTON_NEGATIVE -> {
+ DialogInterface.BUTTON_POSITIVE, DialogInterface.BUTTON_NEGATIVE -> {
val i = Intent(cxt, MainActivity::class.java)
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
- if (which == DialogInterface.BUTTON_NEUTRAL)
+ if (which == DialogInterface.BUTTON_NEGATIVE)
i.putExtra("action", "call")
else
i.putExtra("action", "message")
@@ -48,36 +48,36 @@ class ContactListAdapter(private val cxt: Context, private val rows: ArrayList {
+ DialogInterface.BUTTON_NEUTRAL -> {
}
}
}
val builder = AlertDialog.Builder(cxt, R.style.Theme_AppCompat)
builder.setMessage(String.format(cxt.getString(R.string.contact_action_question),
Contact.contacts()[pos].name))
- .setNeutralButton(cxt.getText(R.string.call), dialogClickListener)
- .setNegativeButton(cxt.getText(R.string.send_message), dialogClickListener)
- .setPositiveButton(cxt.getText(R.string.cancel), dialogClickListener)
+ .setNeutralButton(cxt.getText(R.string.cancel), dialogClickListener)
+ .setNegativeButton(cxt.getText(R.string.call), dialogClickListener)
+ .setPositiveButton(cxt.getText(R.string.send_message), dialogClickListener)
.show()
}
}
nameView.setOnLongClickListener { _ ->
val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) {
- DialogInterface.BUTTON_NEGATIVE -> {
+ DialogInterface.BUTTON_POSITIVE -> {
Contact.contacts().removeAt(pos)
ContactsActivity.saveContacts(cxt.applicationContext.filesDir)
this.notifyDataSetChanged()
}
- DialogInterface.BUTTON_POSITIVE -> {
+ DialogInterface.BUTTON_NEGATIVE -> {
}
}
}
val builder = AlertDialog.Builder(cxt, R.style.Theme_AppCompat)
builder.setMessage(String.format(cxt.getString(R.string.contact_delete_question),
Contact.contacts()[pos].name))
- .setNegativeButton(cxt.getText(R.string.delete), dialogClickListener)
- .setPositiveButton(cxt.getText(R.string.cancel), dialogClickListener)
+ .setNegativeButton(cxt.getText(R.string.cancel), dialogClickListener)
+ .setPositiveButton(cxt.getText(R.string.delete), dialogClickListener)
.show()
true
}
diff --git a/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt
index b568e51e..b56164ee 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt
@@ -31,7 +31,8 @@ class ContactsActivity : AppCompatActivity() {
plusButton.setOnClickListener {
if (Contact.contacts().size >= Contact.CONTACTS_SIZE) {
Utils.alertView(this, getString(R.string.notice),
- String.format(getString(R.string.contacts_exceeded), Contact.CONTACTS_SIZE))
+ String.format(getString(R.string.contacts_exceeded),
+ Contact.CONTACTS_SIZE))
} else {
val i = Intent(this, ContactActivity::class.java)
val b = Bundle()
@@ -57,7 +58,8 @@ class ContactsActivity : AppCompatActivity() {
when (item.itemId) {
R.id.export_contacts -> {
if (saveContacts(dir))
- Utils.alertView(this,"", getString(R.string.exported_contacts))
+ Utils.alertView(this, "",
+ getString(R.string.exported_contacts))
else
Utils.alertView(this,getString(R.string.error),
getString(R.string.export_error))
@@ -65,7 +67,7 @@ class ContactsActivity : AppCompatActivity() {
R.id.import_contacts -> {
if (restoreContacts(dir)) {
Utils.alertView(this, "",
- "Imported contacts from Download folder.")
+ getString(R.string.imported_contacts))
clAdapter.notifyDataSetChanged()
saveContacts(applicationContext.filesDir)
} else
diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt
index c42e46b5..d95f143d 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt
@@ -345,7 +345,7 @@ class MainActivity : AppCompatActivity() {
if (acc.vmUri != "") {
val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) {
- DialogInterface.BUTTON_NEGATIVE -> {
+ DialogInterface.BUTTON_POSITIVE -> {
val callIntent = Intent(this, MainActivity::class.java)
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
@@ -354,16 +354,16 @@ class MainActivity : AppCompatActivity() {
callIntent.putExtra("peer", acc.vmUri)
startActivity(callIntent)
}
- DialogInterface.BUTTON_POSITIVE -> {
+ DialogInterface.BUTTON_NEGATIVE -> {
}
}
}
val builder = AlertDialog.Builder(this@MainActivity,
R.style.Theme_AppCompat)
builder.setTitle(getString(R.string.voicemail_messages))
- builder.setMessage(acc.vmMessage())
- .setPositiveButton(getString(R.string.cancel), dialogClickListener)
- .setNegativeButton(getString(R.string.check), dialogClickListener)
+ builder.setMessage(acc.vmMessages(this))
+ .setPositiveButton(getString(R.string.listen), dialogClickListener)
+ .setNegativeButton(getString(R.string.cancel), dialogClickListener)
.show()
}
}
diff --git a/app/src/main/kotlin/com/tutpro/baresip/MessageListAdapter.kt b/app/src/main/kotlin/com/tutpro/baresip/MessageListAdapter.kt
index 856c5927..10281968 100644
--- a/app/src/main/kotlin/com/tutpro/baresip/MessageListAdapter.kt
+++ b/app/src/main/kotlin/com/tutpro/baresip/MessageListAdapter.kt
@@ -28,7 +28,7 @@ class MessageListAdapter(private val cxt: Context, private val rows: ArrayList
+ android:hint="@string/user_domain" >
+ android:contentDescription="@string/call_history" >
baresip Sovellus
- Baresip-kirjastoon perustuva Android sovellus\\n\\n Juha Heinanen jh@tutpro.com\\n\\n Versio %1$s\\n\\n Käyttövihjeitä\\n\\n • Tarkista, että konfiguraation oletusarvot vastaavat tarpeitasi. Kunkin otsikon painallus tarjoaa apua.\\n • Sen jälkeen luo yksi tai useampi tili. Jälleen kunkin otsikon painallus tarjoaa apua.\\n Voit lisätä puheluiden ja viestien kohteet kontakteihin pitkällä painalluksella.\\n • Pitkillä painalluksilla voi myös poistaa puheluita, viestiketjuja, viestejä ja kontakteja.\\n • Voit soittaa edellisen puhelun uudelleen painamalla virheää luuria silloin, kun puhelun kohde on tyhjä.\\n • Jos et kuule, mitä toinen sanoo, yritä kasvattaa media-volyymia.\\n
+ Baresip-kirjastoon perustuva Android sovellus\n\n
+ Juha Heinanen jh@tutpro.com\n\n
+ Versio %1$s\n\n
+ Käyttövihjeitä\n\n
+ • Tarkista, että konfiguraation oletusarvot vastaavat tarpeitasi.
+ Kunkin otsikon painallus tarjoaa apua.\n
+ • Sen jälkeen luo yksi tai useampi tili. Jälleen kunkin otsikon painallus tarjoaa apua.\n
+ • Voit lisätä puheluiden ja viestien kohteet kontakteihin pitkällä painalluksella.\n
+ • Pitkillä painalluksilla voi myös poistaa puheluita, viestiketjuja,
+ viestejä ja kontakteja.\n
+ • Voit soittaa edellisen puhelun uudelleen painamalla virheää luuria silloin,
+ kun puhelun kohde on tyhjä.\n
+ • Jos et puhelun aikana kuule, mitä toinen sanoo, yritä kasvattaa media-volyymia.\n
+
Tili
Tilin käyttäjän nimi
Tilin käyttäjän nimi
Tilin käyttäjän nimi, joka esiintyy
- SIP-sanomien From URI:ssa (vapaaehtoinen).
+ SIP-sanomien From URI:ssa (vapaaehtoinen).
Käyttäjätunnus
Todentamiseen käytettävä
- käyttäjätunnus, jos välityspalvelin vaatii sellaisen.
- Todentamiseen käytettävä salasana
+ käyttäjätunnus, jos välityspalvelin vaatii sellaisen.
+ Salasana
Todentamiseen käytettävä
- salasana, jos välityspalvelin vaatii sellaisen.
+ salasana, jos välityspalvelin vaatii sellaisen.
Välityspalvelimet
Yhden tai kahden
- välityspalvelimen SIP URI, joille SIP-sanomat lähetetään. Jos
- välityspalvelimia on annettu kaksi, REGISTER-sanomat yritetään
- lähettää molemmille välityspalvelimille ja muut sanomat yhdelle
- toiminnassa olevalle välityspalvelimelle, Jos välityspalvelimia ei
- ole annettu, SIP-sanomat lähetetään palvelimelle, mikä selviää
- kohde-URI:n domainille tehtävän NAPTR/SRV/A-tietueiden
- nimipalvelukyselyiden perusteella. Jos välityspalvelimen osoite SIP
- URI:ssa on IPv6-osoite, osoite pitää kirjoittaa sulkujen [] sisään.
- \nEsimerkkejä:\n• sip:foo.com:5060;transport=tls\n•
- sip:[2001:67c:223:777::10]:5060;transport=tcp\n
+ välityspalvelimen SIP URI, joille SIP-sanomat lähetetään. Jos
+ välityspalvelimia on annettu kaksi, REGISTER-sanomat yritetään
+ lähettää molemmille välityspalvelimille ja muut sanomat yhdelle
+ toiminnassa olevalle välityspalvelimelle. Jos välityspalvelimia ei
+ ole annettu, SIP-sanomat lähetetään palvelimelle, mikä selviää
+ kohteen domainille tehtävien NAPTR/SRV/Animipalvelukyselyiden perusteella.
+ Jos välityspalvelimen osoite SIP
+ URI:ssa on IPv6-osoite, osoite pitää kirjoittaa sulkujen [] sisään.
+ \nEsimerkkejä:\n• sip:foo.com:5060;transport=tls\n•
+ sip:[2001:67c:223:777::10]:5060;transport=tcp\n
Välityspalvelimen SIP URI
Toisen
- välityspalvelimem SIP URI
+ välityspalvelimen SIP URI
Rekisteröi
Jos merkitty, rekisteröinti on
- aktiivinen ja REGISTER-sanomat lähetetään noin 12 minuutin välein.
+ aktiivinen ja REGISTER-sanomat lähetetään noin 12 minuutin välein.
Äänen koodausmenetelmät
Luettelo käytössä olevista äänen
- koodausmenetelmistä prioriteettijärjestyksessä,
- Media NAT:n hallinta
+ koodausmenetelmistä prioriteettijärjestyksessä.
+ Media NAT hallinta
Valitsee media NAT hallintaprotokollan
- (vapaaehtoinen). Vaihtoehtoja ovat STUN (Session Traversal Utilities
- for NAT, RFC 5389) ja ICE (Interactive Connectivity Establishment,
- RFC 5245).
+ (vapaaehtoinen). Vaihtoehtoja ovat STUN (Session Traversal Utilities
+ for NAT, RFC 5389) ja ICE (Interactive Connectivity Establishment, RFC 5245).
STUN-palvelin
STUN-palvelimen muotoa palvelin[:portti]
- oleva osoite. Oletusarvo on \'stun.l.google.com:19302\', joka
- osoittaa Google:n julkiseen STUN-palvelimeen. Käyttäjätunnusta ja
- salasanaa ei voi tällä hetkellä antaa.
+ oleva osoite. Oletusarvo on \'stun.l.google.com:19302\', joka
+ osoittaa Google:n julkiseen STUN-palvelimeen. Käyttäjätunnusta ja
+ salasanaa ei voi tällä hetkellä antaa.
stun.l.google.com:19302
Median salaus
- Valitsee median
- salausprotokollan.\n
- • ZRTP (suositeltu) tarkoittaa, että
- ZRTP-salausta yritetään neuvotella sen jälkeen, kun puhelu on
- alkanut.\n
- • DTLS-SRTPF tarkoittaa, että
- UDP/TLS/RTP/SAVPF-protokollaa tarjotaan lähteviin puheluihin
- ja että RTP/SAVP-, RTP/SAVPF-, UDP/TLS/RTP/SAVP- tai
- UDP/TLS/RTP/SAVPF-protokollaa käytetään, jos sellaista tarjotaan
- tulevassa puhelussa.\n
- • SRTP-MANDF tarkoittaa, että RTP/SAVPF-protokollaa tarjotaan
- lähtevissä puheluissa ja että se vaaditaan tulevissa puheluissa.\n
- • SRTP-MAND takoittaa, että RTP/SAVP-protokollaa tarjotaan
- lähteviin puheluihin ja että se vaaditaan tulevissa puheluissa.\n
- • SRTP tarkoittaa, että RTP/AVP-protokollaa tarjotaan
- lähteviin puheluihin ja että RTP/SAVP- tai RTP/SAVPF-protokollaa
- käytetään, jos sellaista tarjotaan tulevissa puheluissa.\n
- • Ei mitään tarkoittaa, että mediaa ei salata.
+ Valitsee median salausprotokollan (vapaaehtoinen).\n
+ • ZRTP (suositeltu) tarkoittaa, että
+ ZRTP-salausta yritetään neuvotella sen jälkeen, kun puhelu on
+ alkanut.\n
+ • DTLS-SRTPF tarkoittaa, että
+ UDP/TLS/RTP/SAVPF-protokollaa tarjotaan lähteviin puheluihin
+ ja että RTP/SAVP-, RTP/SAVPF-, UDP/TLS/RTP/SAVP- tai
+ UDP/TLS/RTP/SAVPF-protokollaa käytetään, jos sellaista tarjotaan
+ tulevassa puhelussa.\n
+ • SRTP-MANDF tarkoittaa, että RTP/SAVPF-protokollaa tarjotaan
+ lähtevissä puheluissa ja että se vaaditaan tulevissa puheluissa.\n
+ • SRTP-MAND takoittaa, että RTP/SAVP-protokollaa tarjotaan
+ lähteviin puheluihin ja että se vaaditaan tulevissa puheluissa.\n
+ • SRTP tarkoittaa, että RTP/AVP-protokollaa tarjotaan
+ lähteviin puheluihin ja että RTP/SAVP- tai RTP/SAVPF-protokollaa
+ käytetään, jos sellaista tarjotaan tulevissa puheluissa.\n
- Puheposti-URI
+ Puhepostin URI
SIP URI, jota käytetään
- puhepostiviestien kuunteluun. Jos URI:a ei ole annettu, tietoa
- mahdollista puhepostiviesteistä (Message Waiting Indications) ei
- tilata.
+ puhepostiviestien kuunteluun. Jos URI:a ei ole annettu, tietoa
+ mahdollista puhepostiviesteistä (Message Waiting Indications) ei tilata.
Oletustili
Jos merkitty, niin tämä tili on
- valittuna, kun baresip käynnistetään.
+ valittuna, kun baresip käynnistetään.
Tilit
- SIP osoite käyttäjä@domain
- Virheellinen SIP osoite \'%1$s\'.
+ käyttäjä@domain
+ Virheellinen käyttäjä@domain \'%1$s\'.
Tili \'%1$s\' on jo olemassa.
"Uuden tilin luonti
epäonnistui.
@@ -118,28 +127,42 @@
Vastaa
Hylkää
- Tuleva puhelu soittajalta
+ Puhelu soittajalta
Puhelun siirtopyyntö kohteeseen
Viesti lähettäjältä
- Call History
+ Puheluhistoria
+ Soita
+ puhelut
+ puhelun
+ Haluatko soittaa tai lähettää viestin kohteeseen
+ \'%1$s\'?
+
+ Haluatko luoda uuden kontaktin \'%1$s\' tai poistaa
+ %2$s puheluhistoriasta?
+
+ Haluatko poistaa \'%1$s\' %2$s puheluhistoriasta?
Viestiketju
- %1$s viestit
+ Viestiketju %1$s
Uusi viesti
Haluatko poistaa viestin tai
- lisätä kohteen \'%1$s\' kontakteihin?
+ luoda uuden kontaktin \'%1$s\'?
Haluatko poistaa viestin?
Lisää kontakti
- Viestin lähetys epäonnistui
+ Viestin lähetys epäonnistui
+ Epäonnistui
Viestiketjut
- Uusi viestiketju
+ Tänään
+ Sinä
+ Uusi viestin kohde
+ Virheellinen SIP URI
Haluatko poistaa viestiketjun tai
- lisätä URI:n \'%1$s\' kontakteihin?
+ luoda uuden kontaktin \'%1$s\'?
Haluatko poistaa viestiketjun
\'%1$s\'?
@@ -151,8 +174,8 @@
käynnistyy automaattisesti, kun laite käynnistyy.
Kuunteluosoite
IP-osoite ja portti muotoa
- \'osoite:portti\', missä baresip ottaa vastaan sisään tulevat
- SIP-sanomat. Jos IP-osoite on IPv6-osoite, se täytyy kirjoittaa
+ \'osoite:portti\', missä baresip kuuntelee sisään tulevia
+ SIP-sanomia. Jos IP-osoite on IPv6-osoite, se täytyy kirjoittaa
sulkujen [] sisään. IPv4-osoite 0.0.0.0 tai IPv6-osoite [::]
tarkoittaa kaikkia käytössä olevia osoitteita. Oletusarvo on tyhjä,
jolloin baresip kuuntelee porttia 5060 kaikilla käytössä olevilla
@@ -160,11 +183,11 @@
Suosi IPv6-protokollaa
Jos merkitty, baresip suosii
- IPv6-protokollaa, jos sekä IPv4 että IPv6 ovat käytettävissä.
+ IPv6-protokollaa, mikäli sekä IPv4 että IPv6 ovat käytettävissä.
DNS-palvelimet
- Pilkuilla toisistaan erotettu
+ Pilkulla toisistaan erotettu
luettelo DNS-palvelijoita. Kukin DNS-palvelija on muotoa
- \'palvelin:portti\'. If palvelin on IPv6-osoite, osoite pitää
+ \'palvelin:portti\'. Jos palvelin on IPv6-osoite, osoite pitää
kirjoittaa sulkujen [] sisään. Oletusarvo on
\'8.8.8.8:53,[2001:4860:4860::8888]:53\', mikä osoittaa Googlen
julkisiin DNS-palvelijoihin.
@@ -178,23 +201,25 @@
käytössä.
Oletus äänen voimakkuus
- Jos valittu, puhelun oletus
- äänen voimakkuus asteikolla 1–10.
+ Jos valittu, puhelun äänen voimakkuus
+ asteikolla 1–10.
Lokiviestit
- Jos valittu, baresip tuottaa debug- ja
+ Jos merkitty, baresip tuottaa debug- ja
info-tason logcat lokiviestejä.
Palauta oletuskonfiguraatio
- Jos valittu, palautetaan
- oletuskonfiguraatio.
+ Jos merkitty, oletuskonfiguraatio palautetaan, kun
+ baresip seuraavan kerran käynnistetään.
Kontakti
- Kontaktin nimi
- Tallenna
- Palauta
+ Uusi kontakti
+ Nimi
+ Virheellinen kontaktin nimi \'%1$s\'
+ Kontakti \'%1$s\' on jo olemassa
+ Virheellinen SIP URI \'%1$s\'
Kontaktit
@@ -207,6 +232,7 @@
Kontaktiesi enimmäismäärä %1$d on
ylittynyt.
+ Tallenna
Kontaktit tallennettiin
Download-kansion tiedostoon \'contacts.bs\'.
@@ -214,8 +240,8 @@
epäonnistui. Tarkista Sovellukset -> baresip -> Käyttöluvat ->
Tallennustila.
- Palautettiin kontaktit
- Download-kansiosta.
+ Palauta
+ Kontaktit palautettiin Download-kansiosta.
Kontantien palauttaminen
Download-kansiosta epäonnistui. Tarkista Sovellukset -> baresip ->
@@ -228,7 +254,6 @@
Tieto
Huomio
Peruuta
- Tarkista
OK
Kyllä
Ei
@@ -248,10 +273,9 @@
Lopeta
Lähtevä puhelu …
Tuleva puhelu …
- Puhelun siirto …
+ Siirtopuhelu …
Virheellinen SIP URI
Puhelun kohde
- Puhelu
Lopeta
Aseta puhelu pitoon
DTMF
@@ -261,6 +285,14 @@
Nopeus
Puheposti
Puhepostiviestit
+ Sinulla on
+ yksi uusi viesti
+ uutta viestiä
+ yksi vanha viesti
+ vanhaa viestiä
+ ja
+ Sinulla ei ole viestejä
+ Kuuntele
Viestit
Numeronäppäimistö
Sinulla on jo puhelu käynnissä
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index aa829c87..874934da 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -56,7 +56,7 @@
stun.l.google.com:19302
Media Encryption
- Selects media transport encryption protocol.\n
+ Selects media transport encryption protocol (if any).\n
• ZRTP (recommended) means that ZRTP end-to-end media encryption negotiation is tried after
the call has been established.\n
• DTLS-SRTPF means that UDP/TLS/RTP/SAVPF is offered in outgoing call and that RTP/SAVP,
@@ -64,9 +64,7 @@
• SRTP-MANDF means that RTP/SAVPF is offered in outgoing call and required in incoming call.\n
• SRTP-MAND means that RTP/SAVP is offered in outgoing call and required in incoming call.\n
• SRTP means that RTP/AVP is offered in outgoing call and that RTP/SAVP or RTP/SAVPF is used
- if offered in incoming call.\n
- • None means that media encryption is not supported and that media transport protocol
- thus is RTP/AVP.
+ if offered in incoming call.
Voicemail URI
SIP URI for checking of voicemail messages. If left empty, voicemail
@@ -78,8 +76,8 @@
Accounts
- SIP Address user@domain
- Invalid SIP Addess \'%1$s\'.
+ user@domain
+ Invalid user@domain \'%1$s\'
Account \'%1$s\' already exists.
"Failed to allocate new account.
Encrypt Password
@@ -101,12 +99,21 @@
Answer
Reject
- Incoming call from
+ Call from
Call transfer request to
Message from
- Call History
+ Call History
+ Call
+ calls
+ call
+ Do you want to call or send message to \'%1$s\'?
+ Do you want to add \'%1$s\' to contacts or delete
+ %2$s from call history?
+
+ Do you want to delete \'%1$s\' %2$s from call history?
+
Chat Messages
@@ -115,11 +122,15 @@
Do you want to delete message or add peer \'%1$s\' to contacts?
Do you want to delete message?
Add Contact
- Sending of message failed
+ Sending of message failed
+ Failed
Chat History
+ Today
+ You
New Chat Peer
+ Invalid SIP URI
Do you want to delete chat with peer \'%1$s\' or
add peer to contacts?
Do you want to delete chat with \'%1$s\'?
@@ -159,9 +170,13 @@
Contact
- Contact Name
+ New Contact
+ Name
Export
Import
+ Invalid contact name \'%1$s\'
+ Contact \'%1$s\' already exists
+ Invalid SIP URI
Contacts
@@ -183,7 +198,6 @@
Info
Notice
Cancel
- Check
OK
Yes
No
@@ -208,7 +222,6 @@
Transferring call to …
Invalid SIP URI
Callee
- Call
Hangup
Hold
DTMF
@@ -218,6 +231,14 @@
Rate
Voicemail
Voicemail Messages
+ You have
+ one new message
+ new messages
+ one old message
+ old messages
+ and
+ You have no messages
+ Listen
Messages
Dialpad
You already have an active call!