- Tried to align alerts with material design guidelines.

- Still more work on strings.
This commit is contained in:
Juha Heinanen
2019-05-11 15:27:35 +03:00
parent c061c5d2f9
commit e4fbb71d16
20 changed files with 284 additions and 216 deletions

View File

@ -74,7 +74,7 @@
</activity>
<activity
android:name=".CallsActivity"
android:label="@string/calls"
android:label="@string/call_history"
android:parentActivityName=".MainActivity" >
</activity>
<activity

View File

@ -1,5 +1,7 @@
package com.tutpro.baresip
import android.content.Context
class Account(val accp: String) {
var displayName = account_display_name(accp)
@ -98,28 +100,28 @@ class Account(val accp: String) {
return res
}
fun vmMessage() : String {
fun vmMessages(cxt: Context) : String {
var new = ""
var old = ""
if (vmNew > 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."
}

View File

@ -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<String>(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<String>(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)

View File

@ -41,10 +41,7 @@ class AccountListAdapter(private val cxt: Context, private val rows: ArrayList<A
val deleteDialog = AlertDialog.Builder(cxt)
deleteDialog.setMessage(String.format(cxt.getString(R.string.delete_account),
ua.account.aor))
deleteDialog.setPositiveButton(cxt.getText(R.string.cancel)) { dialog, _ ->
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<A
this.notifyDataSetChanged()
dialog.dismiss()
}
deleteDialog.setNegativeButton(cxt.getText(R.string.cancel)) { dialog, _ ->
dialog.dismiss()
}
deleteDialog.create().show()
}
return rowView

View File

@ -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()

View File

@ -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!!)

View File

@ -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
}

View File

@ -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

View File

@ -38,7 +38,7 @@ class ChatListAdapter(private val cxt: Context, private var rows: ArrayList<Mess
sender = peer
} else {
layout.setBackgroundResource(R.drawable.you_bg)
sender = "You"
sender = cxt.getString(R.string.you)
}
val peerView = chatView.findViewById(R.id.peer) as TextView
peerView.setText(peer)
@ -53,14 +53,14 @@ class ChatListAdapter(private val cxt: Context, private var rows: ArrayList<Mess
val fmt = SimpleDateFormat("dd/MM, HH:mm")
info = fmt.format(cal.time)
}
if (info.length < 6) info = "Today $info"
if (info.length < 6) info = "${cxt.getString(R.string.today)} $info"
infoView.text = "$info - $sender"
if (message.direction == R.drawable.arrow_up_red) {
if (message.responseCode != 0)
infoView.text = "${infoView.text} - Failed: ${message.responseCode} " +
"${message.responseReason}"
infoView.text = "${infoView.text} - ${cxt.getString(R.string.message_failed)}: " +
"${message.responseCode} ${message.responseReason}"
else
infoView.text = "${infoView.text} - Sending of message failed!"
infoView.text = "${infoView.text} - ${cxt.getString(R.string.sending_failed)}"
infoView.setTextColor(ContextCompat.getColor(cxt, R.color.colorAccent))
}
val textView = chatView.findViewById(R.id.text) as TextView

View File

@ -35,7 +35,7 @@ class ChatsActivity: AppCompatActivity() {
aor = intent.extras!!.getString("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
uaMessages = uaMessages(aor)
@ -55,7 +55,7 @@ class ChatsActivity: 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)
@ -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

View File

@ -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))

View File

@ -31,11 +31,11 @@ class ContactListAdapter(private val cxt: Context, private val rows: ArrayList<C
nameView.setOnClickListener { _ ->
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<C
(cxt as Activity).startActivity(i)
}
}
DialogInterface.BUTTON_POSITIVE -> {
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
}

View File

@ -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

View File

@ -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()
}
}

View File

@ -28,7 +28,7 @@ class MessageListAdapter(private val cxt: Context, private val rows: ArrayList<M
if (up) {
lp.setMargins(75, 10, 0, 10)
layout.setBackgroundResource(R.drawable.you_bg)
peer = "You"
peer = cxt.getString(R.string.you)
} else {
lp.setMargins(0, 10, 75, 10)
layout.setBackgroundResource(R.drawable.peer_bg)
@ -51,14 +51,14 @@ class MessageListAdapter(private val cxt: Context, private val rows: ArrayList<M
val fmt = SimpleDateFormat("dd/MM, HH:mm")
info = fmt.format(cal.time)
}
if (info.length < 6) info = "Today $info"
if (info.length < 6) info = "${cxt.getString(R.string.today)} $info"
infoView.text = "$info - $peer"
if (message.direction == R.drawable.arrow_up_red) {
if (message.responseCode != 0)
infoView.text = "${infoView.text} - Failed: ${message.responseCode} " +
"${message.responseReason}"
infoView.text = "${infoView.text} - ${cxt.getString(R.string.message_failed)}: " +
"${message.responseCode} ${message.responseReason}"
else
infoView.text = "${infoView.text} - Sending of message failed!"
infoView.text = "${infoView.text} - ${cxt.getString(R.string.sending_failed)}"
infoView.setTextColor(ContextCompat.getColor(cxt, R.color.colorAccent))
}
val textView = messageView.findViewById(R.id.text) as TextView

View File

@ -145,8 +145,18 @@ object Utils {
}
}
fun aorUser(aor: String): String {
val user = aor.substringBefore("@")
return if (user == aor) "" else user
}
fun aorDomain(aor: String): String {
return aor.substringAfter("@")
val domain = aor.substringAfter("@")
return if (domain == aor) "" else domain
}
fun checkAor(aor: String): Boolean {
return checkUriUser(aorUser(aor)) && checkDomain(aorDomain(aor))
}
fun checkTelNo(no: String): Boolean {
@ -244,14 +254,6 @@ object Utils {
return false
}
fun checkAorUri(uri: String): Boolean {
if (!uri.startsWith("sip:")) return false
val userDomain = uri.replace("sip:", "").split("@")
if (userDomain.size != 2) return false
if (!checkUriUser(userDomain[0])) return false
return checkDomain(userDomain[1]) || checkIp(userDomain[1])
}
fun checkPrintAscii(s: String): Boolean {
if (s == "") return true
return Regex("^[ -~]*\$").matches(s)

View File

@ -30,7 +30,7 @@
android:layout_toStartOf="@+id/addAccount"
android:inputType="textEmailAddress"
android:autofillHints="username"
android:hint="@string/sip_uri_user_domain" >
android:hint="@string/user_domain" >
</EditText>
<ImageButton

View File

@ -217,7 +217,7 @@
android:padding="0dp"
android:background="@null"
android:src="@drawable/calls"
android:contentDescription="@string/calls" >
android:contentDescription="@string/call_history" >
</ImageButton>
<ImageButton

View File

@ -3,91 +3,100 @@
<!-- About Activity -->
<string name="about_title">baresip Sovellus</string>
<string name="about_text"><b>Baresip-kirjastoon perustuva Android sovellus</b>\\n\\n Juha Heinanen jh@tutpro.com\\n\\n Versio %1$s\\n\\n <b>Käyttövihjeitä</b>\\n\\n &#8226; Tarkista, että konfiguraation oletusarvot vastaavat tarpeitasi. Kunkin otsikon painallus tarjoaa apua.\\n &#8226; 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 &#8226; Pitkillä painalluksilla voi myös poistaa puheluita, viestiketjuja, viestejä ja kontakteja.\\n &#8226; Voit soittaa edellisen puhelun uudelleen painamalla virheää luuria silloin, kun puhelun kohde on tyhjä.\\n &#8226; Jos et kuule, mitä toinen sanoo, yritä kasvattaa media-volyymia.\\n</string>
<string name="about_text"><b>Baresip-kirjastoon perustuva Android sovellus</b>\n\n
Juha Heinanen jh@tutpro.com\n\n
Versio %1$s\n\n
<b>Käyttövihjeitä</b>\n\n
&#8226; Tarkista, että konfiguraation oletusarvot vastaavat tarpeitasi.
Kunkin otsikon painallus tarjoaa apua.\n
&#8226; Sen jälkeen luo yksi tai useampi tili. Jälleen kunkin otsikon painallus tarjoaa apua.\n
&#8226; Voit lisätä puheluiden ja viestien kohteet kontakteihin pitkällä painalluksella.\n
&#8226; Pitkillä painalluksilla voi myös poistaa puheluita, viestiketjuja,
viestejä ja kontakteja.\n
&#8226; Voit soittaa edellisen puhelun uudelleen painamalla virheää luuria silloin,
kun puhelun kohde on tyhjä.\n
&#8226; Jos et puhelun aikana kuule, mitä toinen sanoo, yritä kasvattaa media-volyymia.\n
</string>
<!-- Account Activity -->
<string name="account">Tili</string>
<string name="display_name">Tilin käyttäjän nimi</string>
<string name="your_name">Tilin käyttäjän nimi</string>
<string name="display_name_help">Tilin käyttäjän nimi, joka esiintyy
SIP-sanomien From URI:ssa (vapaaehtoinen).</string>
SIP-sanomien From URI:ssa (vapaaehtoinen).</string>
<string name="authentication_username">Käyttäjätunnus</string>
<string name="authentication_username_help">Todentamiseen käytettävä
käyttäjätunnus, jos välityspalvelin vaatii sellaisen.</string>
<string name="authentication_password">Todentamiseen käytettävä salasana</string>
käyttäjätunnus, jos välityspalvelin vaatii sellaisen.</string>
<string name="authentication_password">Salasana</string>
<string name="authentication_password_help">Todentamiseen käytettävä
salasana, jos välityspalvelin vaatii sellaisen.</string>
salasana, jos välityspalvelin vaatii sellaisen.</string>
<string name="outbound_proxies">Välityspalvelimet</string>
<string name="outbound_proxies_help">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&#8226; sip:foo.com:5060;transport=tls\n&#8226;
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&#8226; sip:foo.com:5060;transport=tls\n&#8226;
sip:[2001:67c:223:777::10]:5060;transport=tcp\n
</string>
<string name="sip_uri_of_proxy_server">Välityspalvelimen SIP URI</string>
<string name="sip_uri_of_another_proxy_server">Toisen
välityspalvelimem SIP URI</string>
välityspalvelimen SIP URI</string>
<string name="register">Rekisteröi</string>
<string name="register_help">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.
</string>
<string name="audio_codecs">Äänen koodausmenetelmät</string>
<string name="audio_codecs_help">Luettelo käytössä olevista äänen
koodausmenetelmistä prioriteettijärjestyksessä,</string>
<string name="media_nat">Media NAT:n hallinta</string>
koodausmenetelmistä prioriteettijärjestyksessä.</string>
<string name="media_nat">Media NAT hallinta</string>
<string name="media_nat_help">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).
</string>
<string name="stun_server">STUN-palvelin</string>
<string name="stun_server_help">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.
</string>
<string name="stun_server_default">stun.l.google.com:19302</string>
<string name="media_encryption">Median salaus</string>
<string name="media_encryption_help">Valitsee median
salausprotokollan.\n
&#8226; ZRTP (suositeltu) tarkoittaa, että
ZRTP-salausta yritetään neuvotella sen jälkeen, kun puhelu on
alkanut.\n
&#8226; 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
&#8226; SRTP-MANDF tarkoittaa, että RTP/SAVPF-protokollaa tarjotaan
lähtevissä puheluissa ja että se vaaditaan tulevissa puheluissa.\n
&#8226; SRTP-MAND takoittaa, että RTP/SAVP-protokollaa tarjotaan
lähteviin puheluihin ja että se vaaditaan tulevissa puheluissa.\n
&#8226; 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
&#8226; Ei mitään tarkoittaa, että mediaa ei salata.
<string name="media_encryption_help">Valitsee median salausprotokollan (vapaaehtoinen).\n
&#8226; ZRTP (suositeltu) tarkoittaa, että
ZRTP-salausta yritetään neuvotella sen jälkeen, kun puhelu on
alkanut.\n
&#8226; 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
&#8226; SRTP-MANDF tarkoittaa, että RTP/SAVPF-protokollaa tarjotaan
lähtevissä puheluissa ja että se vaaditaan tulevissa puheluissa.\n
&#8226; SRTP-MAND takoittaa, että RTP/SAVP-protokollaa tarjotaan
lähteviin puheluihin ja että se vaaditaan tulevissa puheluissa.\n
&#8226; 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
</string>
<string name="voicemail_uri">Puheposti-URI</string>
<string name="voicemail_uri">Puhepostin URI</string>
<string name="voicemain_uri_help">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.
</string>
<string name="default_account">Oletustili</string>
<string name="default_account_help">Jos merkitty, niin tämä tili on
valittuna, kun baresip käynnistetään.
valittuna, kun baresip käynnistetään.
</string>
<!-- Accounts Activity -->
<string name="accounts">Tilit</string>
<string name="sip_uri_user_domain">SIP osoite käyttäjä@domain</string>
<string name="invalid_aor">Virheellinen SIP osoite \'%1$s\'.</string>
<string name="user_domain">käyttäjä@domain</string>
<string name="invalid_aor">Virheellinen käyttäjä@domain \'%1$s\'.</string>
<string name="account_exists">Tili \'%1$s\' on jo olemassa.</string>
<string name="account_allocation_failure">"Uuden tilin luonti
epäonnistui.
@ -118,28 +127,42 @@
<!-- Baresip Service -->
<string name="answer">Vastaa</string>
<string name="reject">Hylkää</string>
<string name="incoming_call_from">Tuleva puhelu soittajalta</string>
<string name="incoming_call_from">Puhelu soittajalta</string>
<string name="transfer_request">Puhelun siirtopyyntö kohteeseen</string>
<string name="message_from">Viesti lähettäjältä</string>
<!-- Calls Activity -->
<string name="calls">Call History</string>
<string name="call_history">Puheluhistoria</string>
<string name="call">Soita</string>
<string name="calls_calls">puhelut</string>
<string name="calls_call">puhelun</string>
<string name="calls_call_message_question">Haluatko soittaa tai lähettää viestin kohteeseen
\'%1$s\'?
</string>
<string name="calls_add_delete_question">Haluatko luoda uuden kontaktin \'%1$s\' tai poistaa
%2$s puheluhistoriasta?
</string>
<string name="calls_delete_question">Haluatko poistaa \'%1$s\' %2$s puheluhistoriasta?</string>
<!-- Chat Activity -->
<string name="chat">Viestiketju</string>
<string name="chat_with">%1$s viestit</string>
<string name="chat_with">Viestiketju %1$s</string>
<string name="new_message">Uusi viesti</string>
<string name="long_message_question">Haluatko poistaa viestin tai
lisätä kohteen \'%1$s\' kontakteihin?</string>
luoda uuden kontaktin \'%1$s\'?</string>
<string name="short_message_question">Haluatko poistaa viestin?</string>
<string name="add_contact">Lisää kontakti</string>
<string name="message_failed">Viestin lähetys epäonnistui</string>
<string name="sending_failed">Viestin lähetys epäonnistui</string>
<string name="message_failed">Epäonnistui</string>
<!-- Chats Activity -->
<string name="chats">Viestiketjut</string>
<string name="new_chat_peer">Uusi viestiketju</string>
<string name="today">Tänään</string>
<string name="you">Sinä</string>
<string name="new_chat_peer">Uusi viestin kohde</string>
<string name="invalid_chat_peer_uri">Virheellinen SIP URI</string>
<string name="long_chat_question">Haluatko poistaa viestiketjun tai
lisätä URI:n \'%1$s\' kontakteihin?</string>
luoda uuden kontaktin \'%1$s\'?</string>
<string name="short_chat_question">Haluatko poistaa viestiketjun
\'%1$s\'?
</string>
@ -151,8 +174,8 @@
käynnistyy automaattisesti, kun laite käynnistyy.</string>
<string name="listen_address">Kuunteluosoite</string>
<string name="listen_address_help">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 @@
</string>
<string name="prefer_ipv6">Suosi IPv6-protokollaa</string>
<string name="prefer_ipv6_help">Jos merkitty, baresip suosii
IPv6-protokollaa, jos sekä IPv4 että IPv6 ovat käytettävissä.</string>
IPv6-protokollaa, mikäli sekä IPv4 että IPv6 ovat käytettävissä.</string>
<string name="dns_servers">DNS-palvelimet</string>
<string name="dns_servers_help">Pilkuilla toisistaan erotettu
<string name="dns_servers_help">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.</string>
@ -178,23 +201,25 @@
käytössä.
</string>
<string name="default_call_volume">Oletus äänen voimakkuus</string>
<string name="default_call_volume_help">Jos valittu, puhelun oletus
äänen voimakkuus asteikolla 1&#8211;10.
<string name="default_call_volume_help">Jos valittu, puhelun äänen voimakkuus
asteikolla 1&#8211;10.
</string>
<string name="debug">Lokiviestit</string>
<string name="debug_help">Jos valittu, baresip tuottaa debug- ja
<string name="debug_help">Jos merkitty, baresip tuottaa debug- ja
info-tason logcat lokiviestejä.
</string>
<string name="reset_config">Palauta oletuskonfiguraatio</string>
<string name="reset_config_help">Jos valittu, palautetaan
oletuskonfiguraatio.
<string name="reset_config_help">Jos merkitty, oletuskonfiguraatio palautetaan, kun
baresip seuraavan kerran käynnistetään.
</string>
<!-- Contact Activity -->
<string name="contact">Kontakti</string>
<string name="contact_name">Kontaktin nimi</string>
<string name="export_contacts">Tallenna</string>
<string name="import_contacts">Palauta</string>
<string name="new_contact">Uusi kontakti</string>
<string name="contact_name">Nimi</string>
<string name="invalid_contact">Virheellinen kontaktin nimi \'%1$s\'</string>
<string name="contact_already_exists">Kontakti \'%1$s\' on jo olemassa</string>
<string name="invalid_contact_uri">Virheellinen SIP URI \'%1$s\'</string>
<!-- Contacts Activity -->
<string name="contacts">Kontaktit</string>
@ -207,6 +232,7 @@
<string name="contacts_exceeded">Kontaktiesi enimmäismäärä %1$d on
ylittynyt.
</string>
<string name="export_contacts">Tallenna</string>
<string name="exported_contacts">Kontaktit tallennettiin
Download-kansion tiedostoon \'contacts.bs\'.
</string>
@ -214,8 +240,8 @@
epäonnistui. Tarkista Sovellukset -> baresip -> Käyttöluvat ->
Tallennustila.
</string>
<string name="imported_contacts">Palautettiin kontaktit
Download-kansiosta.
<string name="import_contacts">Palauta</string>
<string name="imported_contacts">Kontaktit palautettiin Download-kansiosta.
</string>
<string name="import_error">Kontantien palauttaminen
Download-kansiosta epäonnistui. Tarkista Sovellukset -> baresip ->
@ -228,7 +254,6 @@
<string name="info">Tieto</string>
<string name="notice">Huomio</string>
<string name="cancel">Peruuta</string>
<string name="check">Tarkista</string>
<string name="ok">OK</string>
<string name="yes">Kyllä</string>
<string name="no">Ei</string>
@ -248,10 +273,9 @@
<string name="quit">Lopeta</string>
<string name="outgoing_call_to_dots">Lähtevä puhelu &#8230;</string>
<string name="incoming_call_from_dots">Tuleva puhelu &#8230;</string>
<string name="transferring_call_to_dots">Puhelun siirto &#8230;</string>
<string name="transferring_call_to_dots">Siirtopuhelu &#8230;</string>
<string name="invalid_sip_uri">Virheellinen SIP URI</string>
<string name="callee">Puhelun kohde</string>
<string name="call">Puhelu</string>
<string name="hangup">Lopeta</string>
<string name="hold">Aseta puhelu pitoon</string>
<string name="dtmf">DTMF</string>
@ -261,6 +285,14 @@
<string name="rate">Nopeus</string>
<string name="voicemail">Puheposti</string>
<string name="voicemail_messages">Puhepostiviestit</string>
<string name="you_have">Sinulla on</string>
<string name="one_new_message">yksi uusi viesti</string>
<string name="new_messages">uutta viestiä</string>
<string name="one_old_message">yksi vanha viesti</string>
<string name="old_messages">vanhaa viestiä</string>
<string name="and">ja</string>
<string name="no_messages">Sinulla ei ole viestejä</string>
<string name="listen">Kuuntele</string>
<string name="messages">Viestit</string>
<string name="dialpad">Numeronäppäimistö</string>
<string name="call_already_active">Sinulla on jo puhelu käynnissä

View File

@ -56,7 +56,7 @@
</string>
<string name="stun_server_default">stun.l.google.com:19302</string>
<string name="media_encryption">Media Encryption</string>
<string name="media_encryption_help">Selects media transport encryption protocol.\n
<string name="media_encryption_help">Selects media transport encryption protocol (if any).\n
&#8226; ZRTP (recommended) means that ZRTP end-to-end media encryption negotiation is tried after
the call has been established.\n
&#8226; DTLS-SRTPF means that UDP/TLS/RTP/SAVPF is offered in outgoing call and that RTP/SAVP,
@ -64,9 +64,7 @@
&#8226; SRTP-MANDF means that RTP/SAVPF is offered in outgoing call and required in incoming call.\n
&#8226; SRTP-MAND means that RTP/SAVP is offered in outgoing call and required in incoming call.\n
&#8226; 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
&#8226; None means that media encryption is not supported and that media transport protocol
thus is RTP/AVP.
if offered in incoming call.
</string>
<string name="voicemail_uri">Voicemail URI</string>
<string name="voicemain_uri_help">SIP URI for checking of voicemail messages. If left empty, voicemail
@ -78,8 +76,8 @@
<!-- Accounts Activity -->
<string name="accounts">Accounts</string>
<string name="sip_uri_user_domain">SIP Address user@domain</string>
<string name="invalid_aor">Invalid SIP Addess \'%1$s\'.</string>
<string name="user_domain">user@domain</string>
<string name="invalid_aor">Invalid user@domain \'%1$s\'</string>
<string name="account_exists">Account \'%1$s\' already exists.</string>
<string name="account_allocation_failure">"Failed to allocate new account.</string>
<string name="encrypt_password">Encrypt Password</string>
@ -101,12 +99,21 @@
<!-- Baresip Service -->
<string name="answer">Answer</string>
<string name="reject">Reject</string>
<string name="incoming_call_from">Incoming call from</string>
<string name="incoming_call_from">Call from</string>
<string name="transfer_request">Call transfer request to</string>
<string name="message_from">Message from</string>
<!-- Calls Activity -->
<string name="calls">Call History</string>
<string name="call_history">Call History</string>
<string name="call">Call</string>
<string name="calls_calls">calls</string>
<string name="calls_call">call</string>
<string name="calls_call_message_question">Do you want to call or send message to \'%1$s\'?</string>
<string name="calls_add_delete_question">Do you want to add \'%1$s\' to contacts or delete
%2$s from call history?
</string>
<string name="calls_delete_question">Do you want to delete \'%1$s\' %2$s from call history?
</string>
<!-- Chat Activity -->
<string name="chat">Chat Messages</string>
@ -115,11 +122,15 @@
<string name="long_message_question">Do you want to delete message or add peer \'%1$s\' to contacts?</string>
<string name="short_message_question">Do you want to delete message?</string>
<string name="add_contact">Add Contact</string>
<string name="message_failed">Sending of message failed</string>
<string name="sending_failed">Sending of message failed</string>
<string name="message_failed">Failed</string>
<!-- Chats Activity -->
<string name="chats">Chat History</string>
<string name="today">Today</string>
<string name="you">You</string>
<string name="new_chat_peer">New Chat Peer</string>
<string name="invalid_chat_peer_uri">Invalid SIP URI</string>
<string name="long_chat_question">Do you want to delete chat with peer \'%1$s\' or
add peer to contacts?</string>
<string name="short_chat_question">Do you want to delete chat with \'%1$s\'?</string>
@ -159,9 +170,13 @@
<!-- Contact Activity -->
<string name="contact">Contact</string>
<string name="contact_name">Contact Name</string>
<string name="new_contact">New Contact</string>
<string name="contact_name">Name</string>
<string name="export_contacts">Export</string>
<string name="import_contacts">Import</string>
<string name="invalid_contact">Invalid contact name \'%1$s\'</string>
<string name="contact_already_exists">Contact \'%1$s\' already exists</string>
<string name="invalid_contact_uri">Invalid SIP URI</string>
<!-- Contacts Activity -->
<string name="contacts">Contacts</string>
@ -183,7 +198,6 @@
<string name="info">Info</string>
<string name="notice">Notice</string>
<string name="cancel">Cancel</string>
<string name="check">Check</string>
<string name="ok">OK</string>
<string name="yes">Yes</string>
<string name="no">No</string>
@ -208,7 +222,6 @@
<string name="transferring_call_to_dots">Transferring call to &#8230;</string>
<string name="invalid_sip_uri">Invalid SIP URI</string>
<string name="callee">Callee</string>
<string name="call">Call</string>
<string name="hangup">Hangup</string>
<string name="hold">Hold</string>
<string name="dtmf">DTMF</string>
@ -218,6 +231,14 @@
<string name="rate">Rate</string>
<string name="voicemail">Voicemail</string>
<string name="voicemail_messages">Voicemail Messages</string>
<string name="you_have">You have</string>
<string name="one_new_message">one new message</string>
<string name="new_messages">new messages</string>
<string name="one_old_message">one old message</string>
<string name="old_messages">old messages</string>
<string name="and">and</string>
<string name="no_messages">You have no messages</string>
<string name="listen">Listen</string>
<string name="messages">Messages</string>
<string name="dialpad">Dialpad</string>
<string name="call_already_active">You already have an active call!</string>