- 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>
<activity <activity
android:name=".CallsActivity" android:name=".CallsActivity"
android:label="@string/calls" android:label="@string/call_history"
android:parentActivityName=".MainActivity" > android:parentActivityName=".MainActivity" >
</activity> </activity>
<activity <activity

View File

@ -1,5 +1,7 @@
package com.tutpro.baresip package com.tutpro.baresip
import android.content.Context
class Account(val accp: String) { class Account(val accp: String) {
var displayName = account_display_name(accp) var displayName = account_display_name(accp)
@ -98,28 +100,28 @@ class Account(val accp: String) {
return res return res
} }
fun vmMessage() : String { fun vmMessages(cxt: Context) : String {
var new = "" var new = ""
var old = "" var old = ""
if (vmNew > 0) if (vmNew > 0)
if (vmNew == 1) if (vmNew == 1)
new = "$vmNew new message" new = cxt.getString(R.string.one_new_message)
else else
new = "$vmNew new messages" new = "$vmNew ${cxt.getString(R.string.new_messages)}"
if (vmOld > 0) if (vmOld > 0)
if (vmOld == 1) if (vmOld == 1)
old = "$vmOld old message" old = cxt.getString(R.string.one_old_message)
else else
old = "$vmOld old messages" old = "$vmOld ${cxt.getString(R.string.old_messages)}"
var msg = "You have" var msg = cxt.getString(R.string.you_have)
if (new != "") { if (new != "") {
msg = "$msg $new" msg = "$msg $new"
if (old != "") msg = "$msg and $old" if (old != "") msg = "$msg ${cxt.getString(R.string.and)} $old"
} else { } else {
if (old != "") if (old != "")
msg = "$msg $old" msg = "$msg $old"
else else
msg = "$msg no messages" msg = cxt.getString(R.string.no_messages)
} }
return "$msg." return "$msg."
} }

View File

@ -57,33 +57,6 @@ class AccountActivity : AppCompatActivity() {
outbound2.setText(acc.outbound[1]) 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 = findViewById(R.id.Register) as CheckBox
regCheck.isChecked = acc.regint > 0 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 mediaEnc = acc.mediaEnc
val mediaEncSpinner = findViewById(R.id.mediaEncSpinner) as Spinner val mediaEncSpinner = findViewById(R.id.mediaEncSpinner) as Spinner
val mediaEncKeys = arrayListOf("zrtp", "dtls_srtp", "srtp-mandf", "srtp-mand", "srtp", "") 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) keyIx = mediaEncKeys.indexOf(acc.mediaEnc)
keyVal = mediaEncVals.elementAt(keyIx) keyVal = mediaEncVals.elementAt(keyIx)
mediaEncKeys.removeAt(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) val deleteDialog = AlertDialog.Builder(cxt)
deleteDialog.setMessage(String.format(cxt.getString(R.string.delete_account), deleteDialog.setMessage(String.format(cxt.getString(R.string.delete_account),
ua.account.aor)) ua.account.aor))
deleteDialog.setPositiveButton(cxt.getText(R.string.cancel)) { dialog, _ -> deleteDialog.setPositiveButton(cxt.getText(R.string.delete)) { dialog, _ ->
dialog.dismiss()
}
deleteDialog.setNegativeButton(cxt.getText(R.string.delete)) { dialog, _ ->
Api.ua_destroy(ua.uap) Api.ua_destroy(ua.uap)
UserAgent.remove(ua) UserAgent.remove(ua)
AccountsActivity.generateAccounts() AccountsActivity.generateAccounts()
@ -52,6 +49,9 @@ class AccountListAdapter(private val cxt: Context, private val rows: ArrayList<A
this.notifyDataSetChanged() this.notifyDataSetChanged()
dialog.dismiss() dialog.dismiss()
} }
deleteDialog.setNegativeButton(cxt.getText(R.string.cancel)) { dialog, _ ->
dialog.dismiss()
}
deleteDialog.create().show() deleteDialog.create().show()
} }
return rowView return rowView

View File

@ -36,10 +36,9 @@ class AccountsActivity : AppCompatActivity() {
val newAorView = findViewById(R.id.newAor) as EditText val newAorView = findViewById(R.id.newAor) as EditText
addAccountButton.setOnClickListener{ addAccountButton.setOnClickListener{
var aor = newAorView.text.toString().trim() var aor = newAorView.text.toString().trim()
if (!aor.startsWith("sip:")) aor = "sip:$aor" if (!Utils.checkAor(aor)) {
if (!Utils.checkAorUri(aor)) { Log.d("Baresip", "Invalid Address of Record $aor")
Log.d("Baresip", "Invalid SIP Address of Record $aor") Utils.alertView(this, getString(R.string.error),
Utils.alertView(this, getString(R.string.notice),
String.format(getString(R.string.invalid_aor), aor)) String.format(getString(R.string.invalid_aor), aor))
} else if (Account.exists(aor)) { } else if (Account.exists(aor)) {
Log.d("Baresip", "Account $aor already exists") Log.d("Baresip", "Account $aor already exists")
@ -53,7 +52,7 @@ class AccountsActivity : AppCompatActivity() {
getString(R.string.account_allocation_failure)) getString(R.string.account_allocation_failure))
} else { } else {
newAorView.setText("") newAorView.setText("")
newAorView.hint = getString(R.string.sip_uri_user_domain) newAorView.hint = getString(R.string.user_domain)
newAorView.clearFocus() newAorView.clearFocus()
UserAgent.add(ua, R.drawable.dot_yellow) UserAgent.add(ua, R.drawable.dot_yellow)
generateAccounts() generateAccounts()

View File

@ -690,6 +690,7 @@ class BaresipService: Service() {
} }
private fun abandonAudioFocus() { private fun abandonAudioFocus() {
Log.d(LOG_TAG, "Abandonin audio focus")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (audioFocusRequest != null) { if (audioFocusRequest != null) {
am.abandonAudioFocusRequest(audioFocusRequest!!) am.abandonAudioFocusRequest(audioFocusRequest!!)

View File

@ -29,7 +29,7 @@ class CallsActivity : AppCompatActivity() {
val ua = Account.findUa(aor)!! val ua = Account.findUa(aor)!!
val headerView = findViewById(R.id.account) as TextView val headerView = findViewById(R.id.account) as TextView
val headerText = "Account ${aor.substringAfter(":")}" val headerText = "${getString(R.string.account)} ${aor.substringAfter(":")}"
headerView.text = headerText headerView.text = headerText
val listView = findViewById(R.id.calls) as ListView val listView = findViewById(R.id.calls) as ListView
@ -45,10 +45,10 @@ class CallsActivity : AppCompatActivity() {
peerName = Utils.friendlyUri(peerName, Utils.aorDomain(aor)) peerName = Utils.friendlyUri(peerName, Utils.aorDomain(aor))
val dialogClickListener = DialogInterface.OnClickListener { _, which -> val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) { when (which) {
DialogInterface.BUTTON_NEUTRAL, DialogInterface.BUTTON_NEGATIVE -> { DialogInterface.BUTTON_POSITIVE, DialogInterface.BUTTON_NEGATIVE -> {
val i = Intent(this@CallsActivity, MainActivity::class.java) val i = Intent(this@CallsActivity, MainActivity::class.java)
i.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP 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") i.putExtra("action", "call")
else else
i.putExtra("action", "message") i.putExtra("action", "message")
@ -56,15 +56,16 @@ class CallsActivity : AppCompatActivity() {
i.putExtra("peer", peerUri) i.putExtra("peer", peerUri)
startActivity(i) startActivity(i)
} }
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_NEUTRAL -> {
} }
} }
} }
val builder = AlertDialog.Builder(this@CallsActivity, R.style.Theme_AppCompat) val builder = AlertDialog.Builder(this@CallsActivity, R.style.Theme_AppCompat)
builder.setMessage("Do you want to call or send message to '$peerName'?") builder.setMessage(String.format(getString(R.string.calls_call_message_question),
.setNeutralButton("Call", dialogClickListener) peerName))
.setNegativeButton("Send Message", dialogClickListener) .setNeutralButton(getString(R.string.cancel), dialogClickListener)
.setPositiveButton("Cancel", dialogClickListener) .setNegativeButton(getString(R.string.call), dialogClickListener)
.setPositiveButton(getString(R.string.send_message), dialogClickListener)
.show() .show()
} }
listView.onItemLongClickListener = AdapterView.OnItemLongClickListener { _, _, pos, _ -> listView.onItemLongClickListener = AdapterView.OnItemLongClickListener { _, _, pos, _ ->
@ -72,7 +73,7 @@ class CallsActivity : AppCompatActivity() {
val peerName = ContactsActivity.contactName(peerUri) val peerName = ContactsActivity.contactName(peerUri)
val dialogClickListener = DialogInterface.OnClickListener { _, which -> val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) { when (which) {
DialogInterface.BUTTON_NEUTRAL -> { DialogInterface.BUTTON_NEGATIVE -> {
val i = Intent(this, ContactActivity::class.java) val i = Intent(this, ContactActivity::class.java)
val b = Bundle() val b = Bundle()
b.putBoolean("new", true) b.putBoolean("new", true)
@ -80,7 +81,7 @@ class CallsActivity : AppCompatActivity() {
i.putExtras(b) i.putExtras(b)
startActivityForResult(i, MainActivity.CONTACT_CODE) startActivityForResult(i, MainActivity.CONTACT_CODE)
} }
DialogInterface.BUTTON_NEGATIVE -> { DialogInterface.BUTTON_POSITIVE -> {
removeUaHistoryAt(pos) removeUaHistoryAt(pos)
if (uaHistory.size == 0) { if (uaHistory.size == 0) {
val i = Intent() val i = Intent()
@ -89,25 +90,30 @@ class CallsActivity : AppCompatActivity() {
} }
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
} }
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_NEUTRAL -> {
} }
} }
} }
val callText: String 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) val builder = AlertDialog.Builder(this@CallsActivity, R.style.Theme_AppCompat)
if (peerName.startsWith("sip:")) if (peerName.startsWith("sip:"))
builder.setMessage("Do you want to add '" + builder.setMessage(String.format(getString(R.string.calls_add_delete_question),
"${Utils.friendlyUri(peerName, Utils.aorDomain(aor))}' to contacts " + Utils.friendlyUri(peerName, Utils.aorDomain(aor)), callText))
"or delete ${callText.toLowerCase()} from history?") .setNeutralButton(getString(R.string.cancel), dialogClickListener)
.setPositiveButton("Cancel", dialogClickListener) .setNegativeButton(getString(R.string.add_contact), dialogClickListener)
.setNegativeButton("Delete $callText", dialogClickListener) .setPositiveButton(String.format(getString(R.string.delete), callText),
.setNeutralButton("Add Contact", dialogClickListener) dialogClickListener)
.show() .show()
else else
builder.setMessage("Do you want to delete ${callText.toLowerCase()} from history?") builder.setMessage(String.format(getString(R.string.calls_delete_question),
.setPositiveButton("Cancel", dialogClickListener) Utils.friendlyUri(peerName, Utils.aorDomain(aor)), callText))
.setNegativeButton("Delete $callText", dialogClickListener) .setNeutralButton(getString(R.string.cancel), dialogClickListener)
.setPositiveButton(String.format(getString(R.string.delete), callText),
dialogClickListener)
.show() .show()
true true
} }

View File

@ -77,7 +77,7 @@ class ChatActivity : AppCompatActivity() {
listView.onItemLongClickListener = AdapterView.OnItemLongClickListener { _, _, pos, _ -> listView.onItemLongClickListener = AdapterView.OnItemLongClickListener { _, _, pos, _ ->
val dialogClickListener = DialogInterface.OnClickListener { _, which -> val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) { when (which) {
DialogInterface.BUTTON_NEUTRAL -> { DialogInterface.BUTTON_POSITIVE -> {
val i = Intent(this, ContactActivity::class.java) val i = Intent(this, ContactActivity::class.java)
val b = Bundle() val b = Bundle()
b.putBoolean("new", true) b.putBoolean("new", true)
@ -94,7 +94,7 @@ class ChatActivity : AppCompatActivity() {
} }
Message.saveMessages(applicationContext.filesDir.absolutePath) Message.saveMessages(applicationContext.filesDir.absolutePath)
} }
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_NEUTRAL -> {
} }
} }
} }
@ -102,13 +102,13 @@ class ChatActivity : AppCompatActivity() {
if (ContactsActivity.contactName(peerUri) == peerUri) if (ContactsActivity.contactName(peerUri) == peerUri)
builder.setMessage(String.format(getString(R.string.long_message_question), builder.setMessage(String.format(getString(R.string.long_message_question),
chatPeer)) chatPeer))
.setPositiveButton(getString(R.string.cancel), dialogClickListener) .setNeutralButton(getString(R.string.cancel), dialogClickListener)
.setNegativeButton(getString(R.string.delete), dialogClickListener) .setNegativeButton(getString(R.string.delete), dialogClickListener)
.setNeutralButton(getString(R.string.add_contact), dialogClickListener) .setPositiveButton(getString(R.string.add_contact), dialogClickListener)
.show() .show()
else else
builder.setMessage(getText(R.string.short_message_question)) 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) .setNegativeButton(getString(R.string.delete), dialogClickListener)
.show() .show()
true true

View File

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

View File

@ -35,7 +35,7 @@ class ChatsActivity: AppCompatActivity() {
aor = intent.extras!!.getString("aor")!! aor = intent.extras!!.getString("aor")!!
val headerView = findViewById(R.id.account) as TextView val headerView = findViewById(R.id.account) as TextView
val headerText = "Account ${aor.substringAfter(":")}" val headerText = "${getString(R.string.account)} ${aor.substringAfter(":")}"
headerView.text = headerText headerView.text = headerText
uaMessages = uaMessages(aor) uaMessages = uaMessages(aor)
@ -55,7 +55,7 @@ class ChatsActivity: AppCompatActivity() {
listView.onItemLongClickListener = AdapterView.OnItemLongClickListener { _, _, pos, _ -> listView.onItemLongClickListener = AdapterView.OnItemLongClickListener { _, _, pos, _ ->
val dialogClickListener = DialogInterface.OnClickListener { _, which -> val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) { when (which) {
DialogInterface.BUTTON_NEUTRAL -> { DialogInterface.BUTTON_POSITIVE -> {
val i = Intent(this, ContactActivity::class.java) val i = Intent(this, ContactActivity::class.java)
val b = Bundle() val b = Bundle()
b.putBoolean("new", true) b.putBoolean("new", true)
@ -76,7 +76,7 @@ class ChatsActivity: AppCompatActivity() {
Message.saveMessages(filesPath) Message.saveMessages(filesPath)
uaMessages = uaMessages(aor) uaMessages = uaMessages(aor)
} }
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_NEUTRAL -> {
} }
} }
} }
@ -86,13 +86,13 @@ class ChatsActivity: AppCompatActivity() {
if (peer.startsWith("sip:")) if (peer.startsWith("sip:"))
builder.setMessage(String.format(getString(R.string.long_chat_question), builder.setMessage(String.format(getString(R.string.long_chat_question),
Utils.friendlyUri(peer, Utils.aorDomain(aor)))) Utils.friendlyUri(peer, Utils.aorDomain(aor))))
.setPositiveButton(getText(R.string.cancel), dialogClickListener) .setNeutralButton(getText(R.string.cancel), dialogClickListener)
.setNegativeButton(getText(R.string.delete), dialogClickListener) .setNegativeButton(getText(R.string.delete), dialogClickListener)
.setNeutralButton(getText(R.string.add_contact), dialogClickListener) .setPositiveButton(getText(R.string.add_contact), dialogClickListener)
.show() .show()
else else
builder.setMessage(String.format(getString(R.string.short_chat_question), peer)) 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) .setNegativeButton(getText(R.string.delete), dialogClickListener)
.show() .show()
true true
@ -115,7 +115,8 @@ class ChatsActivity: AppCompatActivity() {
} }
} }
if (!Utils.checkSipUri(uri)) { 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 { } else {
peerUri.text.clear() peerUri.text.clear()
peerUri.isCursorVisible = false peerUri.isCursorVisible = false

View File

@ -24,13 +24,13 @@ class ContactActivity : AppCompatActivity() {
new = intent.getBooleanExtra("new", false) new = intent.getBooleanExtra("new", false)
if (new) { if (new) {
setTitle("New Contact") setTitle(getString(R.string.new_contact))
nameView.setText("") nameView.setText("")
nameView.hint = "Contact name" nameView.hint = getString(R.string.contact_name)
nameView.setSelection(nameView.text.length) nameView.setSelection(nameView.text.length)
if (uri == "") { if (uri == "") {
uriView.setText("") uriView.setText("")
uriView.hint = "SIP URI" uriView.hint = getString(R.string.sip_uri)
} else { } else {
uriView.setText(uri) uriView.setText(uri)
} }
@ -58,30 +58,32 @@ class ContactActivity : AppCompatActivity() {
val newName = nameView.text.toString().trim() val newName = nameView.text.toString().trim()
if (!Utils.checkName(newName)) { if (!Utils.checkName(newName)) {
Utils.alertView(this, "Notice", Utils.alertView(this, getString(R.string.error),
"Invalid contact name: $newName") String.format(getString(R.string.invalid_contact), newName))
return false return false
} }
if ((new || (Contact.contacts()[index].name != newName)) && if ((new || (Contact.contacts()[index].name != newName)) &&
ContactsActivity.nameExists(newName)) { ContactsActivity.nameExists(newName)) {
Utils.alertView(this, "Notice", Utils.alertView(this, getString(R.string.error),
"Contact $newName already exists") String.format(getString(R.string.contact_already_exists), newName))
return false return false
} }
var newUri = uriView.text.toString().trim() var newUri = uriView.text.toString().trim()
if (!newUri.startsWith("<")) { if (!newUri.startsWith("<")) {
if (!newUri.startsWith("sip:")) newUri = "sip:$newUri" if (!newUri.startsWith("sip:")) newUri = "sip:$newUri"
if (!Utils.checkAorUri(newUri)) { if (!Utils.checkAor(newUri.substringAfter("sip:"))) {
Utils.alertView(this, "Notice","Invalid contact URI: $newUri") Utils.alertView(this, getString(R.string.error),
String.format(getString(R.string.invalid_contact_uri), newUri))
return false return false
} }
} }
if (new) { if (new) {
if (Contact.contacts().size >= Contact.CONTACTS_SIZE) { if (Contact.contacts().size >= Contact.CONTACTS_SIZE) {
Utils.alertView(this, Utils.alertView(this, getString(R.string.notice),
"Notice", "Maximum number of contacts exceeded") String.format(getString(R.string.contacts_exceeded),
Contact.CONTACTS_SIZE))
return true return true
} else { } else {
Contact.contacts().add(Contact(newName, newUri)) 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 { _ -> nameView.setOnClickListener { _ ->
val dialogClickListener = DialogInterface.OnClickListener { _, which -> val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) { when (which) {
DialogInterface.BUTTON_NEUTRAL, DialogInterface.BUTTON_NEGATIVE -> { DialogInterface.BUTTON_POSITIVE, DialogInterface.BUTTON_NEGATIVE -> {
val i = Intent(cxt, MainActivity::class.java) val i = Intent(cxt, MainActivity::class.java)
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP) 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") i.putExtra("action", "call")
else else
i.putExtra("action", "message") i.putExtra("action", "message")
@ -48,36 +48,36 @@ class ContactListAdapter(private val cxt: Context, private val rows: ArrayList<C
(cxt as Activity).startActivity(i) (cxt as Activity).startActivity(i)
} }
} }
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_NEUTRAL -> {
} }
} }
} }
val builder = AlertDialog.Builder(cxt, R.style.Theme_AppCompat) val builder = AlertDialog.Builder(cxt, R.style.Theme_AppCompat)
builder.setMessage(String.format(cxt.getString(R.string.contact_action_question), builder.setMessage(String.format(cxt.getString(R.string.contact_action_question),
Contact.contacts()[pos].name)) Contact.contacts()[pos].name))
.setNeutralButton(cxt.getText(R.string.call), dialogClickListener) .setNeutralButton(cxt.getText(R.string.cancel), dialogClickListener)
.setNegativeButton(cxt.getText(R.string.send_message), dialogClickListener) .setNegativeButton(cxt.getText(R.string.call), dialogClickListener)
.setPositiveButton(cxt.getText(R.string.cancel), dialogClickListener) .setPositiveButton(cxt.getText(R.string.send_message), dialogClickListener)
.show() .show()
} }
} }
nameView.setOnLongClickListener { _ -> nameView.setOnLongClickListener { _ ->
val dialogClickListener = DialogInterface.OnClickListener { _, which -> val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) { when (which) {
DialogInterface.BUTTON_NEGATIVE -> { DialogInterface.BUTTON_POSITIVE -> {
Contact.contacts().removeAt(pos) Contact.contacts().removeAt(pos)
ContactsActivity.saveContacts(cxt.applicationContext.filesDir) ContactsActivity.saveContacts(cxt.applicationContext.filesDir)
this.notifyDataSetChanged() this.notifyDataSetChanged()
} }
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_NEGATIVE -> {
} }
} }
} }
val builder = AlertDialog.Builder(cxt, R.style.Theme_AppCompat) val builder = AlertDialog.Builder(cxt, R.style.Theme_AppCompat)
builder.setMessage(String.format(cxt.getString(R.string.contact_delete_question), builder.setMessage(String.format(cxt.getString(R.string.contact_delete_question),
Contact.contacts()[pos].name)) Contact.contacts()[pos].name))
.setNegativeButton(cxt.getText(R.string.delete), dialogClickListener) .setNegativeButton(cxt.getText(R.string.cancel), dialogClickListener)
.setPositiveButton(cxt.getText(R.string.cancel), dialogClickListener) .setPositiveButton(cxt.getText(R.string.delete), dialogClickListener)
.show() .show()
true true
} }

View File

@ -31,7 +31,8 @@ class ContactsActivity : AppCompatActivity() {
plusButton.setOnClickListener { plusButton.setOnClickListener {
if (Contact.contacts().size >= Contact.CONTACTS_SIZE) { if (Contact.contacts().size >= Contact.CONTACTS_SIZE) {
Utils.alertView(this, getString(R.string.notice), 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 { } else {
val i = Intent(this, ContactActivity::class.java) val i = Intent(this, ContactActivity::class.java)
val b = Bundle() val b = Bundle()
@ -57,7 +58,8 @@ class ContactsActivity : AppCompatActivity() {
when (item.itemId) { when (item.itemId) {
R.id.export_contacts -> { R.id.export_contacts -> {
if (saveContacts(dir)) if (saveContacts(dir))
Utils.alertView(this,"", getString(R.string.exported_contacts)) Utils.alertView(this, "",
getString(R.string.exported_contacts))
else else
Utils.alertView(this,getString(R.string.error), Utils.alertView(this,getString(R.string.error),
getString(R.string.export_error)) getString(R.string.export_error))
@ -65,7 +67,7 @@ class ContactsActivity : AppCompatActivity() {
R.id.import_contacts -> { R.id.import_contacts -> {
if (restoreContacts(dir)) { if (restoreContacts(dir)) {
Utils.alertView(this, "", Utils.alertView(this, "",
"Imported contacts from Download folder.") getString(R.string.imported_contacts))
clAdapter.notifyDataSetChanged() clAdapter.notifyDataSetChanged()
saveContacts(applicationContext.filesDir) saveContacts(applicationContext.filesDir)
} else } else

View File

@ -345,7 +345,7 @@ class MainActivity : AppCompatActivity() {
if (acc.vmUri != "") { if (acc.vmUri != "") {
val dialogClickListener = DialogInterface.OnClickListener { _, which -> val dialogClickListener = DialogInterface.OnClickListener { _, which ->
when (which) { when (which) {
DialogInterface.BUTTON_NEGATIVE -> { DialogInterface.BUTTON_POSITIVE -> {
val callIntent = Intent(this, MainActivity::class.java) val callIntent = Intent(this, MainActivity::class.java)
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP) Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP)
@ -354,16 +354,16 @@ class MainActivity : AppCompatActivity() {
callIntent.putExtra("peer", acc.vmUri) callIntent.putExtra("peer", acc.vmUri)
startActivity(callIntent) startActivity(callIntent)
} }
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_NEGATIVE -> {
} }
} }
} }
val builder = AlertDialog.Builder(this@MainActivity, val builder = AlertDialog.Builder(this@MainActivity,
R.style.Theme_AppCompat) R.style.Theme_AppCompat)
builder.setTitle(getString(R.string.voicemail_messages)) builder.setTitle(getString(R.string.voicemail_messages))
builder.setMessage(acc.vmMessage()) builder.setMessage(acc.vmMessages(this))
.setPositiveButton(getString(R.string.cancel), dialogClickListener) .setPositiveButton(getString(R.string.listen), dialogClickListener)
.setNegativeButton(getString(R.string.check), dialogClickListener) .setNegativeButton(getString(R.string.cancel), dialogClickListener)
.show() .show()
} }
} }

View File

@ -28,7 +28,7 @@ class MessageListAdapter(private val cxt: Context, private val rows: ArrayList<M
if (up) { if (up) {
lp.setMargins(75, 10, 0, 10) lp.setMargins(75, 10, 0, 10)
layout.setBackgroundResource(R.drawable.you_bg) layout.setBackgroundResource(R.drawable.you_bg)
peer = "You" peer = cxt.getString(R.string.you)
} else { } else {
lp.setMargins(0, 10, 75, 10) lp.setMargins(0, 10, 75, 10)
layout.setBackgroundResource(R.drawable.peer_bg) 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") val fmt = SimpleDateFormat("dd/MM, HH:mm")
info = fmt.format(cal.time) 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" infoView.text = "$info - $peer"
if (message.direction == R.drawable.arrow_up_red) { if (message.direction == R.drawable.arrow_up_red) {
if (message.responseCode != 0) if (message.responseCode != 0)
infoView.text = "${infoView.text} - Failed: ${message.responseCode} " + infoView.text = "${infoView.text} - ${cxt.getString(R.string.message_failed)}: " +
"${message.responseReason}" "${message.responseCode} ${message.responseReason}"
else 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)) infoView.setTextColor(ContextCompat.getColor(cxt, R.color.colorAccent))
} }
val textView = messageView.findViewById(R.id.text) as TextView 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 { 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 { fun checkTelNo(no: String): Boolean {
@ -244,14 +254,6 @@ object Utils {
return false 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 { fun checkPrintAscii(s: String): Boolean {
if (s == "") return true if (s == "") return true
return Regex("^[ -~]*\$").matches(s) return Regex("^[ -~]*\$").matches(s)

View File

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

View File

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

View File

@ -3,91 +3,100 @@
<!-- About Activity --> <!-- About Activity -->
<string name="about_title">baresip Sovellus</string> <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 --> <!-- Account Activity -->
<string name="account">Tili</string> <string name="account">Tili</string>
<string name="display_name">Tilin käyttäjän nimi</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="your_name">Tilin käyttäjän nimi</string>
<string name="display_name_help">Tilin käyttäjän nimi, joka esiintyy <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">Käyttäjätunnus</string>
<string name="authentication_username_help">Todentamiseen käytettävä <string name="authentication_username_help">Todentamiseen käytettävä
käyttäjätunnus, jos välityspalvelin vaatii sellaisen.</string> käyttäjätunnus, jos välityspalvelin vaatii sellaisen.</string>
<string name="authentication_password">Todentamiseen käytettävä salasana</string> <string name="authentication_password">Salasana</string>
<string name="authentication_password_help">Todentamiseen käytettävä <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">Välityspalvelimet</string>
<string name="outbound_proxies_help">Yhden tai kahden <string name="outbound_proxies_help">Yhden tai kahden
välityspalvelimen SIP URI, joille SIP-sanomat lähetetään. Jos välityspalvelimen SIP URI, joille SIP-sanomat lähetetään. Jos
välityspalvelimia on annettu kaksi, REGISTER-sanomat yritetään välityspalvelimia on annettu kaksi, REGISTER-sanomat yritetään
lähettää molemmille välityspalvelimille ja muut sanomat yhdelle lähettää molemmille välityspalvelimille ja muut sanomat yhdelle
toiminnassa olevalle välityspalvelimelle, Jos välityspalvelimia ei toiminnassa olevalle välityspalvelimelle. Jos välityspalvelimia ei
ole annettu, SIP-sanomat lähetetään palvelimelle, mikä selviää ole annettu, SIP-sanomat lähetetään palvelimelle, mikä selviää
kohde-URI:n domainille tehtävän NAPTR/SRV/A-tietueiden kohteen domainille tehtävien NAPTR/SRV/Animipalvelukyselyiden perusteella.
nimipalvelukyselyiden perusteella. Jos välityspalvelimen osoite SIP Jos välityspalvelimen osoite SIP
URI:ssa on IPv6-osoite, osoite pitää kirjoittaa sulkujen [] sisään. URI:ssa on IPv6-osoite, osoite pitää kirjoittaa sulkujen [] sisään.
\nEsimerkkejä:\n&#8226; sip:foo.com:5060;transport=tls\n&#8226; \nEsimerkkejä:\n&#8226; sip:foo.com:5060;transport=tls\n&#8226;
sip:[2001:67c:223:777::10]:5060;transport=tcp\n sip:[2001:67c:223:777::10]:5060;transport=tcp\n
</string> </string>
<string name="sip_uri_of_proxy_server">Välityspalvelimen SIP URI</string> <string name="sip_uri_of_proxy_server">Välityspalvelimen SIP URI</string>
<string name="sip_uri_of_another_proxy_server">Toisen <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">Rekisteröi</string>
<string name="register_help">Jos merkitty, rekisteröinti on <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>
<string name="audio_codecs">Äänen koodausmenetelmät</string> <string name="audio_codecs">Äänen koodausmenetelmät</string>
<string name="audio_codecs_help">Luettelo käytössä olevista äänen <string name="audio_codecs_help">Luettelo käytössä olevista äänen
koodausmenetelmistä prioriteettijärjestyksessä,</string> koodausmenetelmistä prioriteettijärjestyksessä.</string>
<string name="media_nat">Media NAT:n hallinta</string> <string name="media_nat">Media NAT hallinta</string>
<string name="media_nat_help">Valitsee media NAT hallintaprotokollan <string name="media_nat_help">Valitsee media NAT hallintaprotokollan
(vapaaehtoinen). Vaihtoehtoja ovat STUN (Session Traversal Utilities (vapaaehtoinen). Vaihtoehtoja ovat STUN (Session Traversal Utilities
for NAT, RFC 5389) ja ICE (Interactive Connectivity Establishment, for NAT, RFC 5389) ja ICE (Interactive Connectivity Establishment, RFC 5245).
RFC 5245).
</string> </string>
<string name="stun_server">STUN-palvelin</string> <string name="stun_server">STUN-palvelin</string>
<string name="stun_server_help">STUN-palvelimen muotoa palvelin[:portti] <string name="stun_server_help">STUN-palvelimen muotoa palvelin[:portti]
oleva osoite. Oletusarvo on \'stun.l.google.com:19302\', joka oleva osoite. Oletusarvo on \'stun.l.google.com:19302\', joka
osoittaa Google:n julkiseen STUN-palvelimeen. Käyttäjätunnusta ja osoittaa Google:n julkiseen STUN-palvelimeen. Käyttäjätunnusta ja
salasanaa ei voi tällä hetkellä antaa. salasanaa ei voi tällä hetkellä antaa.
</string> </string>
<string name="stun_server_default">stun.l.google.com:19302</string> <string name="stun_server_default">stun.l.google.com:19302</string>
<string name="media_encryption">Median salaus</string> <string name="media_encryption">Median salaus</string>
<string name="media_encryption_help">Valitsee median <string name="media_encryption_help">Valitsee median salausprotokollan (vapaaehtoinen).\n
salausprotokollan.\n &#8226; ZRTP (suositeltu) tarkoittaa, että
&#8226; ZRTP (suositeltu) tarkoittaa, että ZRTP-salausta yritetään neuvotella sen jälkeen, kun puhelu on
ZRTP-salausta yritetään neuvotella sen jälkeen, kun puhelu on alkanut.\n
alkanut.\n &#8226; DTLS-SRTPF tarkoittaa, että
&#8226; DTLS-SRTPF tarkoittaa, että UDP/TLS/RTP/SAVPF-protokollaa tarjotaan lähteviin puheluihin
UDP/TLS/RTP/SAVPF-protokollaa tarjotaan lähteviin puheluihin ja että RTP/SAVP-, RTP/SAVPF-, UDP/TLS/RTP/SAVP- tai
ja että RTP/SAVP-, RTP/SAVPF-, UDP/TLS/RTP/SAVP- tai UDP/TLS/RTP/SAVPF-protokollaa käytetään, jos sellaista tarjotaan
UDP/TLS/RTP/SAVPF-protokollaa käytetään, jos sellaista tarjotaan tulevassa puhelussa.\n
tulevassa puhelussa.\n &#8226; SRTP-MANDF tarkoittaa, että RTP/SAVPF-protokollaa tarjotaan
&#8226; SRTP-MANDF tarkoittaa, että RTP/SAVPF-protokollaa tarjotaan lähtevissä puheluissa ja että se vaaditaan tulevissa puheluissa.\n
lähtevissä puheluissa ja että se vaaditaan tulevissa puheluissa.\n &#8226; SRTP-MAND takoittaa, että RTP/SAVP-protokollaa tarjotaan
&#8226; SRTP-MAND takoittaa, että RTP/SAVP-protokollaa tarjotaan lähteviin puheluihin ja että se vaaditaan tulevissa puheluissa.\n
lähteviin puheluihin ja että se vaaditaan tulevissa puheluissa.\n &#8226; SRTP tarkoittaa, että RTP/AVP-protokollaa tarjotaan
&#8226; SRTP tarkoittaa, että RTP/AVP-protokollaa tarjotaan lähteviin puheluihin ja että RTP/SAVP- tai RTP/SAVPF-protokollaa
lähteviin puheluihin ja että RTP/SAVP- tai RTP/SAVPF-protokollaa käytetään, jos sellaista tarjotaan tulevissa puheluissa.\n
käytetään, jos sellaista tarjotaan tulevissa puheluissa.\n
&#8226; Ei mitään tarkoittaa, että mediaa ei salata.
</string> </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 <string name="voicemain_uri_help">SIP URI, jota käytetään
puhepostiviestien kuunteluun. Jos URI:a ei ole annettu, tietoa puhepostiviestien kuunteluun. Jos URI:a ei ole annettu, tietoa
mahdollista puhepostiviesteistä (Message Waiting Indications) ei mahdollista puhepostiviesteistä (Message Waiting Indications) ei tilata.
tilata.
</string> </string>
<string name="default_account">Oletustili</string> <string name="default_account">Oletustili</string>
<string name="default_account_help">Jos merkitty, niin tämä tili on <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> </string>
<!-- Accounts Activity --> <!-- Accounts Activity -->
<string name="accounts">Tilit</string> <string name="accounts">Tilit</string>
<string name="sip_uri_user_domain">SIP osoite käyttäjä@domain</string> <string name="user_domain">käyttäjä@domain</string>
<string name="invalid_aor">Virheellinen SIP osoite \'%1$s\'.</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_exists">Tili \'%1$s\' on jo olemassa.</string>
<string name="account_allocation_failure">"Uuden tilin luonti <string name="account_allocation_failure">"Uuden tilin luonti
epäonnistui. epäonnistui.
@ -118,28 +127,42 @@
<!-- Baresip Service --> <!-- Baresip Service -->
<string name="answer">Vastaa</string> <string name="answer">Vastaa</string>
<string name="reject">Hylkää</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="transfer_request">Puhelun siirtopyyntö kohteeseen</string>
<string name="message_from">Viesti lähettäjältä</string> <string name="message_from">Viesti lähettäjältä</string>
<!-- Calls Activity --> <!-- 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 --> <!-- Chat Activity -->
<string name="chat">Viestiketju</string> <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="new_message">Uusi viesti</string>
<string name="long_message_question">Haluatko poistaa viestin tai <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="short_message_question">Haluatko poistaa viestin?</string>
<string name="add_contact">Lisää kontakti</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 --> <!-- Chats Activity -->
<string name="chats">Viestiketjut</string> <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 <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 <string name="short_chat_question">Haluatko poistaa viestiketjun
\'%1$s\'? \'%1$s\'?
</string> </string>
@ -151,8 +174,8 @@
käynnistyy automaattisesti, kun laite käynnistyy.</string> käynnistyy automaattisesti, kun laite käynnistyy.</string>
<string name="listen_address">Kuunteluosoite</string> <string name="listen_address">Kuunteluosoite</string>
<string name="listen_address_help">IP-osoite ja portti muotoa <string name="listen_address_help">IP-osoite ja portti muotoa
\'osoite:portti\', missä baresip ottaa vastaan sisään tulevat \'osoite:portti\', missä baresip kuuntelee sisään tulevia
SIP-sanomat. Jos IP-osoite on IPv6-osoite, se täytyy kirjoittaa SIP-sanomia. Jos IP-osoite on IPv6-osoite, se täytyy kirjoittaa
sulkujen [] sisään. IPv4-osoite 0.0.0.0 tai IPv6-osoite [::] sulkujen [] sisään. IPv4-osoite 0.0.0.0 tai IPv6-osoite [::]
tarkoittaa kaikkia käytössä olevia osoitteita. Oletusarvo on tyhjä, tarkoittaa kaikkia käytössä olevia osoitteita. Oletusarvo on tyhjä,
jolloin baresip kuuntelee porttia 5060 kaikilla käytössä olevilla jolloin baresip kuuntelee porttia 5060 kaikilla käytössä olevilla
@ -160,11 +183,11 @@
</string> </string>
<string name="prefer_ipv6">Suosi IPv6-protokollaa</string> <string name="prefer_ipv6">Suosi IPv6-protokollaa</string>
<string name="prefer_ipv6_help">Jos merkitty, baresip suosii <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">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 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 kirjoittaa sulkujen [] sisään. Oletusarvo on
\'8.8.8.8:53,[2001:4860:4860::8888]:53\', mikä osoittaa Googlen \'8.8.8.8:53,[2001:4860:4860::8888]:53\', mikä osoittaa Googlen
julkisiin DNS-palvelijoihin.</string> julkisiin DNS-palvelijoihin.</string>
@ -178,23 +201,25 @@
käytössä. käytössä.
</string> </string>
<string name="default_call_volume">Oletus äänen voimakkuus</string> <string name="default_call_volume">Oletus äänen voimakkuus</string>
<string name="default_call_volume_help">Jos valittu, puhelun oletus <string name="default_call_volume_help">Jos valittu, puhelun äänen voimakkuus
äänen voimakkuus asteikolla 1&#8211;10. asteikolla 1&#8211;10.
</string> </string>
<string name="debug">Lokiviestit</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ä. info-tason logcat lokiviestejä.
</string> </string>
<string name="reset_config">Palauta oletuskonfiguraatio</string> <string name="reset_config">Palauta oletuskonfiguraatio</string>
<string name="reset_config_help">Jos valittu, palautetaan <string name="reset_config_help">Jos merkitty, oletuskonfiguraatio palautetaan, kun
oletuskonfiguraatio. baresip seuraavan kerran käynnistetään.
</string> </string>
<!-- Contact Activity --> <!-- Contact Activity -->
<string name="contact">Kontakti</string> <string name="contact">Kontakti</string>
<string name="contact_name">Kontaktin nimi</string> <string name="new_contact">Uusi kontakti</string>
<string name="export_contacts">Tallenna</string> <string name="contact_name">Nimi</string>
<string name="import_contacts">Palauta</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 --> <!-- Contacts Activity -->
<string name="contacts">Kontaktit</string> <string name="contacts">Kontaktit</string>
@ -207,6 +232,7 @@
<string name="contacts_exceeded">Kontaktiesi enimmäismäärä %1$d on <string name="contacts_exceeded">Kontaktiesi enimmäismäärä %1$d on
ylittynyt. ylittynyt.
</string> </string>
<string name="export_contacts">Tallenna</string>
<string name="exported_contacts">Kontaktit tallennettiin <string name="exported_contacts">Kontaktit tallennettiin
Download-kansion tiedostoon \'contacts.bs\'. Download-kansion tiedostoon \'contacts.bs\'.
</string> </string>
@ -214,8 +240,8 @@
epäonnistui. Tarkista Sovellukset -> baresip -> Käyttöluvat -> epäonnistui. Tarkista Sovellukset -> baresip -> Käyttöluvat ->
Tallennustila. Tallennustila.
</string> </string>
<string name="imported_contacts">Palautettiin kontaktit <string name="import_contacts">Palauta</string>
Download-kansiosta. <string name="imported_contacts">Kontaktit palautettiin Download-kansiosta.
</string> </string>
<string name="import_error">Kontantien palauttaminen <string name="import_error">Kontantien palauttaminen
Download-kansiosta epäonnistui. Tarkista Sovellukset -> baresip -> Download-kansiosta epäonnistui. Tarkista Sovellukset -> baresip ->
@ -228,7 +254,6 @@
<string name="info">Tieto</string> <string name="info">Tieto</string>
<string name="notice">Huomio</string> <string name="notice">Huomio</string>
<string name="cancel">Peruuta</string> <string name="cancel">Peruuta</string>
<string name="check">Tarkista</string>
<string name="ok">OK</string> <string name="ok">OK</string>
<string name="yes">Kyllä</string> <string name="yes">Kyllä</string>
<string name="no">Ei</string> <string name="no">Ei</string>
@ -248,10 +273,9 @@
<string name="quit">Lopeta</string> <string name="quit">Lopeta</string>
<string name="outgoing_call_to_dots">Lähtevä puhelu &#8230;</string> <string name="outgoing_call_to_dots">Lähtevä puhelu &#8230;</string>
<string name="incoming_call_from_dots">Tuleva 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="invalid_sip_uri">Virheellinen SIP URI</string>
<string name="callee">Puhelun kohde</string> <string name="callee">Puhelun kohde</string>
<string name="call">Puhelu</string>
<string name="hangup">Lopeta</string> <string name="hangup">Lopeta</string>
<string name="hold">Aseta puhelu pitoon</string> <string name="hold">Aseta puhelu pitoon</string>
<string name="dtmf">DTMF</string> <string name="dtmf">DTMF</string>
@ -261,6 +285,14 @@
<string name="rate">Nopeus</string> <string name="rate">Nopeus</string>
<string name="voicemail">Puheposti</string> <string name="voicemail">Puheposti</string>
<string name="voicemail_messages">Puhepostiviestit</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="messages">Viestit</string>
<string name="dialpad">Numeronäppäimistö</string> <string name="dialpad">Numeronäppäimistö</string>
<string name="call_already_active">Sinulla on jo puhelu käynnissä <string name="call_already_active">Sinulla on jo puhelu käynnissä

View File

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