From 3bc93e5dd280e6eec050241b80aa009c1baf5204 Mon Sep 17 00:00:00 2001 From: Juha Heinanen Date: Mon, 3 Dec 2018 08:55:29 +0200 Subject: [PATCH] - added possibility to export/import contacts from Download folder - requires WRITE_EXTERNAL_STORAGE permission --- app/src/main/AndroidManifest.xml | 2 + .../com/tutpro/baresip/ContactActivity.kt | 2 +- .../com/tutpro/baresip/ContactListAdapter.kt | 2 +- .../com/tutpro/baresip/ContactsActivity.kt | 42 +++++++++++++++---- .../kotlin/com/tutpro/baresip/MainActivity.kt | 5 +-- .../main/kotlin/com/tutpro/baresip/Utils.kt | 10 +++-- app/src/main/res/layout/activity_contact.xml | 2 +- 7 files changed, 48 insertions(+), 17 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f513fdb5..78ccbdfc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,8 @@ + + Contact.name } - ContactsActivity.saveContacts(applicationContext.filesDir.absolutePath) + ContactsActivity.saveContacts(applicationContext.filesDir) i.putExtra("name", newName) setResult(Activity.RESULT_OK, i) diff --git a/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt b/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt index 025fa550..64b1850b 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ContactListAdapter.kt @@ -67,7 +67,7 @@ class ContactListAdapter(private val cxt: Context, private val rows: ArrayList { Contact.contacts().removeAt(pos) - ContactsActivity.saveContacts() + ContactsActivity.saveContacts(cxt.applicationContext.filesDir) this.notifyDataSetChanged() } DialogInterface.BUTTON_POSITIVE -> { diff --git a/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt index 7c96dd0d..3092baea 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ContactsActivity.kt @@ -3,8 +3,10 @@ package com.tutpro.baresip import android.app.Activity import android.content.* import android.os.Bundle +import android.os.Environment import android.support.v7.app.AppCompatActivity import android.util.Log +import android.view.Menu import android.view.MenuItem import android.widget.ImageButton import android.widget.ListView @@ -19,8 +21,6 @@ class ContactsActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_contacts) - filesPath = applicationContext.filesDir.absolutePath - val listView = findViewById(R.id.contacts) as ListView val aor = intent.extras.getString("aor") @@ -49,8 +49,35 @@ class ContactsActivity : AppCompatActivity() { if (resultCode == RESULT_OK) clAdapter.notifyDataSetChanged() } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.contacts_menu, menu) + return true + } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) when (item.itemId) { + R.id.export_contacts -> { + if (saveContacts(dir)) + Utils.alertView(this,"", + "Exported contacts to Download folder.") + else + Utils.alertView(this,"Error", + "Failed to export contacts to Download folder. " + + "Check Apps -> baresip -> Permissions -> Storage.") + } + R.id.import_contacts -> { + if (restoreContacts(dir)) { + Utils.alertView(this, "", + "Imported contacts from Download folder.") + clAdapter.notifyDataSetChanged() + saveContacts(applicationContext.filesDir) + } else + Utils.alertView(this,"Error", + "Failed to import contacts from Download folder. " + + "Check Apps -> baresip -> Permissions -> Storage and that " + + "the file exists in the folder.") + } android.R.id.home -> { Log.d("Baresip", "Back array was pressed at Contacts") val i = Intent() @@ -70,17 +97,17 @@ class ContactsActivity : AppCompatActivity() { companion object { - internal var filesPath = "" - fun saveContacts(path: String = filesPath) { + fun saveContacts(path: File): Boolean { var contents = "" for (c in Contact.contacts()) contents += "\"${c.name}\" ${c.uri}\n" - Utils.putFileContents(File(path + "/contacts"), contents) + return Utils.putFileContents(File(path, "contacts"), contents) } - fun restoreContacts(path: String = filesPath) { - val content = Utils.getFileContents(File(path + "/contacts")) + fun restoreContacts(path: File): Boolean { + val content = Utils.getFileContents(File(path, "contacts")) + if (content == "Failed") return false Api.contacts_remove() Contact.contacts().clear() content.lines().forEach { @@ -92,6 +119,7 @@ class ContactsActivity : AppCompatActivity() { Contact.contacts().add(Contact(name, uri)) } } + return true } fun findContactURI(name: String): String { diff --git a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt index a63769d6..f73fb6bc 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/MainActivity.kt @@ -186,7 +186,7 @@ class MainActivity : AppCompatActivity() { } } - ContactsActivity.restoreContacts(applicationContext.filesDir.absolutePath) + ContactsActivity.restoreContacts(applicationContext.filesDir) callUri.setAdapter(ArrayAdapter(this, android.R.layout.select_dialog_item, Contact.contacts().map{Contact -> Contact.name})) callUri.threshold = 2 @@ -657,8 +657,7 @@ class MainActivity : AppCompatActivity() { super.onNewIntent(intent) val action = intent.getStringExtra("action") Log.d("Baresip", "onNewIntent action '$action'") - if (action != null) - handleIntent(intent) + if (action != null) handleIntent(intent) } private fun handleIntent(intent: Intent) { diff --git a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt index 3078c59b..574c3f28 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Utils.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Utils.kt @@ -16,7 +16,7 @@ object Utils { fun getFileContents(file: File): String { if (!file.exists()) { Log.e("Baresip", "Failed to find file: " + file.path) - return "" + return "Failed" } else { val length = file.length().toInt() val bytes = ByteArray(length) @@ -31,13 +31,13 @@ object Utils { } catch (e: java.io.IOException) { Log.e("Baresip", "Failed to read file: " + file.path + ": " + e.toString()) - return "" + return "Failed" } } } - fun putFileContents(file: File, contents: String) { + fun putFileContents(file: File, contents: String): Boolean { try { val fOut = FileOutputStream(file.absoluteFile, false) val fWriter = OutputStreamWriter(fOut) @@ -47,12 +47,14 @@ object Utils { fOut.close() } catch (e: java.io.IOException) { Log.e("Baresip", "Failed to put contents to file: " + e.toString()) + return false } } catch (e: java.io.FileNotFoundException) { Log.e("Baresip", "Failed to find contents file: " + e.toString()) + return false } - + return true } fun getNameValue(string: String, name: String): ArrayList { diff --git a/app/src/main/res/layout/activity_contact.xml b/app/src/main/res/layout/activity_contact.xml index 971208a9..dba54321 100644 --- a/app/src/main/res/layout/activity_contact.xml +++ b/app/src/main/res/layout/activity_contact.xml @@ -22,7 +22,7 @@