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