From 59837806be52e31c027bdbe905f9d4d16484589d Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 2 Jan 2018 16:49:03 +0100 Subject: [PATCH] handle PICK contact intent --- app/src/main/AndroidManifest.xml | 16 +++ .../activities/SelectContactActivity.kt | 111 ++++++++++++++++++ ...tesAdapter.kt => SelectContactsAdapter.kt} | 4 +- .../contacts/dialogs/AddFavoritesDialog.kt | 21 ++-- .../contacts/helpers/ContactsHelper.kt | 19 +++ ...avorites.xml => layout_select_contact.xml} | 11 +- app/src/main/res/menu/menu_select_contact.xml | 10 ++ 7 files changed, 175 insertions(+), 17 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/activities/SelectContactActivity.kt rename app/src/main/kotlin/com/simplemobiletools/contacts/adapters/{AddFavoritesAdapter.kt => SelectContactsAdapter.kt} (96%) rename app/src/main/res/layout/{dialog_add_favorites.xml => layout_select_contact.xml} (76%) create mode 100644 app/src/main/res/menu/menu_select_contact.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2083a624..90bf4437 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,6 +42,22 @@ + + + + + + + + + + + + + + confirmSelection() + else -> return super.onOptionsItemSelected(item) + } + return true + } + + private fun initContacts() { + skipFavorites = intent.getBooleanExtra("extraSkipFavorites", false) + allowMultiple = intent.getBooleanExtra("isPickMultiContactsWithoutProfile", false) + if (allowMultiple) { + title = getString(R.string.select_contacts) + invalidateOptionsMenu() + } + + ContactsHelper(this).getContacts { + var contacts = it + if (isActivityDestroyed()) { + return@getContacts + } + + val contactSources = config.displayContactSources + if (!config.showAllContacts()) { + contacts = contacts.filter { contactSources.contains(it.source) } as ArrayList + } + + if (skipFavorites) { + val favorites = config.favorites + contacts = contacts.filter { !favorites.contains(it.id.toString()) } as ArrayList + } + + Contact.sorting = config.sorting + contacts.sort() + + runOnUiThread { + select_contact_list.adapter = SelectContactsAdapter(this, contacts, HashSet()) + select_contact_fastscroller.allowBubbleDisplay = baseConfig.showInfoBubble + select_contact_fastscroller.setViews(select_contact_list) { + select_contact_fastscroller.updateBubbleText(contacts[it].getBubbleText()) + } + } + } + } + + private fun confirmSelection() { + val selectedItems = (select_contact_list.adapter as SelectContactsAdapter).getSelectedItemsSet() + val lookupKey = ContactsHelper(this).getContactLookupKey(selectedItems.first()) + val lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey) + + Intent().apply { + data = lookupUri + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + setResult(RESULT_OK, this) + } + finish() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/AddFavoritesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt similarity index 96% rename from app/src/main/kotlin/com/simplemobiletools/contacts/adapters/AddFavoritesAdapter.kt rename to app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt index 6b40c0dd..badf877d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/AddFavoritesAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt @@ -20,8 +20,8 @@ import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.* import java.util.* -class AddFavoritesAdapter(val activity: SimpleActivity, val contacts: List, val selectedContacts: Set) - : RecyclerView.Adapter() { +class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List, val selectedContacts: Set) + : RecyclerView.Adapter() { private val itemViews = SparseArray() private val selectedPositions = HashSet() private val config = activity.config diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt index 0cb45e42..7cb1c661 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt @@ -5,37 +5,38 @@ import com.simplemobiletools.commons.extensions.baseConfig import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity -import com.simplemobiletools.contacts.adapters.AddFavoritesAdapter +import com.simplemobiletools.contacts.adapters.SelectContactsAdapter import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.models.Contact -import kotlinx.android.synthetic.main.dialog_add_favorites.view.* +import kotlinx.android.synthetic.main.layout_select_contact.view.* import java.util.HashSet import kotlin.collections.ArrayList class AddFavoritesDialog(val activity: SimpleActivity, val callback: () -> Unit) { private var dialog: AlertDialog? = null - private var view = activity.layoutInflater.inflate(R.layout.dialog_add_favorites, null) + private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null) private val config = activity.config private var allContacts = ArrayList() init { ContactsHelper(activity).getContacts { allContacts = it - Contact.sorting = config.sorting - allContacts.sort() val contactSources = config.displayContactSources if (!activity.config.showAllContacts()) { allContacts = allContacts.filter { contactSources.contains(it.source) } as ArrayList } + Contact.sorting = config.sorting + allContacts.sort() + activity.runOnUiThread { view.apply { - add_favorites_list.adapter = AddFavoritesAdapter(activity, allContacts, config.favorites) - add_favorites_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble - add_favorites_fastscroller.setViews(add_favorites_list) { - add_favorites_fastscroller.updateBubbleText(allContacts[it].getBubbleText()) + select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, config.favorites) + select_contact_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble + select_contact_fastscroller.setViews(select_contact_list) { + select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText()) } } } @@ -52,7 +53,7 @@ class AddFavoritesDialog(val activity: SimpleActivity, val callback: () -> Unit) private fun dialogConfirmed() { val allDisplayedIDs = ArrayList() allContacts.mapTo(allDisplayedIDs, { it.id.toString() }) - val selectedItems = (view.add_favorites_list.adapter as AddFavoritesAdapter).getSelectedItemsSet() + val selectedItems = (view.select_contact_list.adapter as SelectContactsAdapter).getSelectedItemsSet() config.addFavorites(selectedItems) allDisplayedIDs.removeAll(selectedItems) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index 11cf1a24..6d8f9f7d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -521,6 +521,25 @@ class ContactsHelper(val activity: BaseSimpleActivity) { } } + fun getContactLookupKey(contactId: String): String { + val uri = ContactsContract.Data.CONTENT_URI + val projection = arrayOf(ContactsContract.Data.CONTACT_ID, ContactsContract.Data.LOOKUP_KEY) + val selection = "${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.RAW_CONTACT_ID} = ?" + val selectionArgs = arrayOf(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, contactId) + var cursor: Cursor? = null + try { + cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + if (cursor?.moveToFirst() == true) { + val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) + val lookupKey = cursor.getStringValue(ContactsContract.Data.LOOKUP_KEY) + return "$lookupKey/$id" + } + } finally { + cursor?.close() + } + return "" + } + fun deleteContact(contact: Contact) = deleteContacts(arrayListOf(contact)) fun deleteContacts(contacts: ArrayList) { diff --git a/app/src/main/res/layout/dialog_add_favorites.xml b/app/src/main/res/layout/layout_select_contact.xml similarity index 76% rename from app/src/main/res/layout/dialog_add_favorites.xml rename to app/src/main/res/layout/layout_select_contact.xml index ca66a80e..f904d1d1 100644 --- a/app/src/main/res/layout/dialog_add_favorites.xml +++ b/app/src/main/res/layout/layout_select_contact.xml @@ -2,25 +2,26 @@ diff --git a/app/src/main/res/menu/menu_select_contact.xml b/app/src/main/res/menu/menu_select_contact.xml new file mode 100644 index 00000000..f33e03eb --- /dev/null +++ b/app/src/main/res/menu/menu_select_contact.xml @@ -0,0 +1,10 @@ + + + +