diff --git a/app/src/main/kotlin/com/tutpro/baresip/Contact.kt b/app/src/main/kotlin/com/tutpro/baresip/Contact.kt new file mode 100644 index 00000000..c18f66f8 --- /dev/null +++ b/app/src/main/kotlin/com/tutpro/baresip/Contact.kt @@ -0,0 +1,3 @@ +package com.tutpro.baresip + +class Contact(var name: String, var uri: String) \ No newline at end of file diff --git a/app/src/main/kotlin/com/tutpro/baresip/ContactActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ContactActivity.kt index f95e9d88..a590b447 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ContactActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ContactActivity.kt @@ -17,13 +17,23 @@ class ContactActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_contact) - index = intent.extras.getInt("index") - val name = ContactsActivity.contactNames[index] - val uri = ContactsActivity.contactURIs[index] + new = intent.extras.getBoolean("new") + val name: String + val uri: String + if (new) { + name = intent.extras.getString("name") + uri = intent.extras.getString("uri") + } else { + index = intent.extras.getInt("index") + name = ContactsActivity.contacts[index].name + uri = ContactsActivity.contacts[index].uri + } + setTitle(name) nameView = findViewById(R.id.Name) as EditText nameView.setText(name) + if (new) nameView.setSelection(nameView.text.length) uriView = findViewById(R.id.Uri) as EditText uriView.setText(uri) @@ -42,25 +52,37 @@ class ContactActivity : AppCompatActivity() { if (item.itemId == R.id.checkIcon) { - val name = nameView.text.toString().trim() - if (!Utils.checkName(name)) { + val newName = nameView.text.toString().trim() + if (!Utils.checkName(newName)) { Utils.alertView(this, "Notice", - "Invalid contact name: $name") + "Invalid contact name: $newName") + return false + } + if ((new || (ContactsActivity.contacts[index].name != newName)) && + ContactsActivity.nameExists(newName)) { + Utils.alertView(this, "Notice", + "Contact $newName already exists") return false } - var uri = uriView.text.toString().trim() - if (!uri.startsWith("<")) { - if (!uri.startsWith("sip:")) uri = "sip:$uri" - if (!Utils.checkUri(uri)) { - Utils.alertView(this, "Notice","Invalid contact URI: $uri") + var newUri = uriView.text.toString().trim() + if (!newUri.startsWith("<")) { + if (!newUri.startsWith("sip:")) newUri = "sip:$newUri" + if (!Utils.checkUri(newUri)) { + Utils.alertView(this, "Notice","Invalid contact URI: $newUri") return false } } - ContactsActivity.contactNames[index] = name - ContactsActivity.contactURIs[index] = uri + if (new) { + ContactsActivity.contacts.add(Contact(newName, newUri)) + } else { + ContactsActivity.contacts[index].uri = newUri + ContactsActivity.contacts[index].name = newName + } + ContactsActivity.contacts.sortBy { Contact -> Contact.name } ContactsActivity.saveContacts() + setResult(RESULT_OK, i) finish() return true @@ -77,6 +99,7 @@ class ContactActivity : AppCompatActivity() { companion object { internal var index = 0 + internal var new = false } } diff --git a/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt b/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt index e1f25f8b..134f95d8 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt @@ -15,20 +15,21 @@ import android.widget.TextView import java.util.* -class ContactListAdapter(private val cxt: Context, private val rows: ArrayList) : - ArrayAdapter(cxt, R.layout.contact_row, rows) { +class ContactListAdapter(private val cxt: Context, private val rows: ArrayList) : + ArrayAdapter(cxt, R.layout.contact_row, rows) { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val row = rows[position] val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater val rowView = inflater.inflate(R.layout.contact_row, parent, false) val nameView = rowView.findViewById(R.id.contactName) as TextView - nameView.text = row + nameView.text = row.name nameView.textSize = 20f nameView.setPadding(6, 6, 0, 6) nameView.setOnClickListener { _ -> val i = Intent(cxt, ContactActivity::class.java) val b = Bundle() + b.putBoolean("new", false) b.putInt("index", position) i.putExtras(b) (cxt as Activity).startActivityForResult(i, MainActivity.CONTACT_CODE) @@ -38,10 +39,9 @@ class ContactListAdapter(private val cxt: Context, private val rows: ArrayList Log.d("Baresip", "Delete button clicked") val deleteDialog = AlertDialog.Builder(cxt) - deleteDialog.setMessage("Do you want to delete contact ${row}") + deleteDialog.setMessage("Do you want to delete contact ${row.name}") deleteDialog.setPositiveButton("Delete") { dialog, _ -> - ContactsActivity.contactNames.removeAt(position) - ContactsActivity.contactURIs.removeAt(position) + ContactsActivity.contacts.removeAt(position) ContactsActivity.saveContacts() this.notifyDataSetChanged() dialog.dismiss() diff --git a/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt index 277db059..56117c60 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt @@ -23,8 +23,8 @@ class ContactsActivity : AppCompatActivity() { setContentView(R.layout.activity_contacts) val listview = findViewById(R.id.contacts) as ListView - Log.d("Baresip", "Got ${contactNames.size} contacts") - clAdapter = ContactListAdapter(this, contactNames) + Log.d("Baresip", "Got ${contacts.size} contacts") + clAdapter = ContactListAdapter(this, contacts) listview.adapter = clAdapter val addContactButton = findViewById(R.id.addContact) as ImageButton @@ -35,27 +35,31 @@ class ContactsActivity : AppCompatActivity() { Log.e("Baresip", "Invalid contact name $name") Utils.alertView(this, "Notice", "Invalid contact name: $name") - } else if (contactNames.contains(name)) { - Log.e("Baresip", "Contact name $name already exists") + } else if (nameExists(name)) { Utils.alertView(this, "Notice", "Contact $name already exists") } else { newNameView.setText("") newNameView.hint = "Contact name" newNameView.clearFocus() - contactNames.add(name) - contactURIs.add("") - clAdapter.notifyDataSetChanged() - saveContacts() val i = Intent(this, ContactActivity::class.java) val b = Bundle() - b.putInt("index", contactNames.size - 1) + b.putBoolean("new", true) + b.putString("name", name) + b.putString("uri", "") i.putExtras(b) startActivityForResult(i, MainActivity.CONTACT_CODE) } } } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == RESULT_OK) { + Log.d("Baresip", "Notifying clAdapter") + clAdapter.notifyDataSetChanged() + } + } + override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> { @@ -68,52 +72,55 @@ class ContactsActivity : AppCompatActivity() { return true } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (resultCode == RESULT_OK) { - Log.d("Baresip", "Notifying clAdapter") - clAdapter.notifyDataSetChanged() - } + override fun onBackPressed() { + Log.d("Baresip", "Back button was pressed at Contacts") + val i = Intent() + setResult(Activity.RESULT_OK, i) + finish() } companion object { - var contactNames = ArrayList() - var contactURIs = ArrayList() + var contacts = ArrayList() fun generateContacts(path: String) { val content = Utils.getFileContents(File(path)) MainActivity.contacts_remove() - contactNames.clear() - contactURIs.clear() + contacts.clear() content.lines().forEach { val parts = it.split("\"") if (parts.size == 3) { val name = parts[1] - var uri = parts[2].trim() + val uri = parts[2].trim() MainActivity.contact_add("\"$name\" $uri") - contactNames.add(name) - contactURIs.add(uri) + contacts.add(Contact(name, uri)) } } } fun saveContacts() { var contents = "" - for (i in contactNames.indices) - contents += "\"${contactNames[i]}\" ${contactURIs[i]}\n" + for (c in contacts) + contents += "\"${c.name}\" ${c.uri}\n" val path = MainActivity.filesPath + "/contacts" Utils.putFileContents(File(path), contents) Log.d("Baresip", "Saved contacts '${contents}' to '$path") } fun findContactURI(name: String): String { - for (i in contactNames.indices) - if (contactNames[i] == name) - return contactURIs[i].removePrefix("<") + for (c in contacts) + if (c.name == name) + return c.uri.removePrefix("<") .replaceAfter(">", "") .replace(">", "") return name } + + fun nameExists(name: String): Boolean { + for (c in contacts) + if (c.name.equals(name, ignoreCase = true)) return true + return false + } } } diff --git a/app/src/main/kotlin/com/tutpro/baresip/HistoryActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/HistoryActivity.kt index 82b5ad42..81267e8b 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/HistoryActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/HistoryActivity.kt @@ -27,8 +27,7 @@ class HistoryActivity : AppCompatActivity() { val listview = findViewById(R.id.history) as ListView - val b = intent.extras - aor = b.getString("aor") + aor = intent.extras.getString("aor") aorGenerateHistory(aor) val adapter = HistoryListAdapter(this, uaHistory) @@ -44,16 +43,15 @@ class HistoryActivity : AppCompatActivity() { val dialogClickListener = DialogInterface.OnClickListener { _, which -> when (which) { DialogInterface.BUTTON_NEUTRAL -> { - ContactsActivity.contactNames.add("New Name") - if (uaHistory[pos].peerDomain == "") - ContactsActivity.contactURIs.add(uaHistory[pos].peerURI) - else - ContactsActivity.contactURIs.add("sip:${uaHistory[pos].peerURI}" + - "@" + uaHistory[pos].peerDomain) - ContactsActivity.saveContacts() val i = Intent(this, ContactActivity::class.java) val b = Bundle() - b.putInt("index", ContactsActivity.contactNames.size - 1) + b.putBoolean("new", true) + b.putString("name", "New Name") + if (uaHistory[pos].peerDomain == "") + b.putString("uri", uaHistory[pos].peerURI) + else + b.putString("uri", "sip:${uaHistory[pos].peerURI}@" + + uaHistory[pos].peerDomain) i.putExtras(b) startActivityForResult(i, MainActivity.CONTACT_CODE) } diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index a5705771..3992aa1a 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -44,7 +44,6 @@ class MainActivity : AppCompatActivity() { internal lateinit var dtmf: EditText internal lateinit var uaAdapter: UaSpinnerAdapter internal lateinit var aorSpinner: Spinner - internal lateinit var calleeAdapter: ArrayAdapter internal lateinit var am: AudioManager internal lateinit var imm: InputMethodManager internal lateinit var nm: NotificationManager @@ -228,9 +227,8 @@ class MainActivity : AppCompatActivity() { "/contacts") callee.threshold = 2 - calleeAdapter = ArrayAdapter(this, - android.R.layout.select_dialog_item, ContactsActivity.contactNames) - callee.setAdapter(calleeAdapter) + callee.setAdapter(ArrayAdapter(this, android.R.layout.select_dialog_item, + ContactsActivity.contacts.map{Contact -> Contact.name})) securityButton.setOnClickListener { when (securityButton.tag) { @@ -472,7 +470,8 @@ class MainActivity : AppCompatActivity() { } CONTACTS_CODE -> { - calleeAdapter.notifyDataSetChanged() + callee.setAdapter(ArrayAdapter(this, android.R.layout.select_dialog_item, + ContactsActivity.contacts.map{Contact -> Contact.name})) } EDIT_CONFIG_CODE -> {