handle PICK contact intent
This commit is contained in:
parent
b57884ab8e
commit
59837806be
|
@ -42,6 +42,22 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".activities.SelectContactActivity"
|
||||||
|
android:label="@string/select_contact">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.PICK"/>
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
|
||||||
|
<data android:mimeType="vnd.android.cursor.dir/contact"/>
|
||||||
|
<data android:mimeType="vnd.android.cursor.dir/person"/>
|
||||||
|
<data android:mimeType="vnd.android.cursor.dir/phone_v2"/>
|
||||||
|
<data android:mimeType="vnd.android.cursor.dir/phone"/>
|
||||||
|
<data android:mimeType="vnd.android.cursor.dir/email_v2"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.SettingsActivity"
|
android:name=".activities.SettingsActivity"
|
||||||
android:label="@string/settings"
|
android:label="@string/settings"
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
package com.simplemobiletools.contacts.activities
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.provider.ContactsContract
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
|
import com.simplemobiletools.commons.extensions.appLaunched
|
||||||
|
import com.simplemobiletools.commons.extensions.baseConfig
|
||||||
|
import com.simplemobiletools.commons.extensions.isActivityDestroyed
|
||||||
|
import com.simplemobiletools.commons.extensions.toast
|
||||||
|
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
|
||||||
|
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
|
||||||
|
import com.simplemobiletools.contacts.R
|
||||||
|
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.layout_select_contact.*
|
||||||
|
|
||||||
|
class SelectContactActivity : SimpleActivity() {
|
||||||
|
private var skipFavorites = false
|
||||||
|
private var allowMultiple = false
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.layout_select_contact)
|
||||||
|
appLaunched()
|
||||||
|
|
||||||
|
handlePermission(PERMISSION_READ_CONTACTS) {
|
||||||
|
if (it) {
|
||||||
|
handlePermission(PERMISSION_WRITE_CONTACTS) {
|
||||||
|
if (it) {
|
||||||
|
initContacts()
|
||||||
|
} else {
|
||||||
|
toast(R.string.no_contacts_permission)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
toast(R.string.no_contacts_permission)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
menuInflater.inflate(R.menu.menu_select_contact, menu)
|
||||||
|
menu.findItem(R.id.confirm).isVisible = allowMultiple
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
when (item.itemId) {
|
||||||
|
R.id.confirm -> 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<Contact>
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skipFavorites) {
|
||||||
|
val favorites = config.favorites
|
||||||
|
contacts = contacts.filter { !favorites.contains(it.id.toString()) } as ArrayList<Contact>
|
||||||
|
}
|
||||||
|
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,8 +20,8 @@ import com.simplemobiletools.contacts.models.Contact
|
||||||
import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.*
|
import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.*
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class AddFavoritesAdapter(val activity: SimpleActivity, val contacts: List<Contact>, val selectedContacts: Set<String>)
|
class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Contact>, val selectedContacts: Set<String>)
|
||||||
: RecyclerView.Adapter<AddFavoritesAdapter.ViewHolder>() {
|
: RecyclerView.Adapter<SelectContactsAdapter.ViewHolder>() {
|
||||||
private val itemViews = SparseArray<View>()
|
private val itemViews = SparseArray<View>()
|
||||||
private val selectedPositions = HashSet<Int>()
|
private val selectedPositions = HashSet<Int>()
|
||||||
private val config = activity.config
|
private val config = activity.config
|
|
@ -5,37 +5,38 @@ import com.simplemobiletools.commons.extensions.baseConfig
|
||||||
import com.simplemobiletools.commons.extensions.setupDialogStuff
|
import com.simplemobiletools.commons.extensions.setupDialogStuff
|
||||||
import com.simplemobiletools.contacts.R
|
import com.simplemobiletools.contacts.R
|
||||||
import com.simplemobiletools.contacts.activities.SimpleActivity
|
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.extensions.config
|
||||||
import com.simplemobiletools.contacts.helpers.ContactsHelper
|
import com.simplemobiletools.contacts.helpers.ContactsHelper
|
||||||
import com.simplemobiletools.contacts.models.Contact
|
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 java.util.HashSet
|
||||||
import kotlin.collections.ArrayList
|
import kotlin.collections.ArrayList
|
||||||
|
|
||||||
class AddFavoritesDialog(val activity: SimpleActivity, val callback: () -> Unit) {
|
class AddFavoritesDialog(val activity: SimpleActivity, val callback: () -> Unit) {
|
||||||
private var dialog: AlertDialog? = null
|
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 val config = activity.config
|
||||||
private var allContacts = ArrayList<Contact>()
|
private var allContacts = ArrayList<Contact>()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
ContactsHelper(activity).getContacts {
|
ContactsHelper(activity).getContacts {
|
||||||
allContacts = it
|
allContacts = it
|
||||||
Contact.sorting = config.sorting
|
|
||||||
allContacts.sort()
|
|
||||||
|
|
||||||
val contactSources = config.displayContactSources
|
val contactSources = config.displayContactSources
|
||||||
if (!activity.config.showAllContacts()) {
|
if (!activity.config.showAllContacts()) {
|
||||||
allContacts = allContacts.filter { contactSources.contains(it.source) } as ArrayList<Contact>
|
allContacts = allContacts.filter { contactSources.contains(it.source) } as ArrayList<Contact>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Contact.sorting = config.sorting
|
||||||
|
allContacts.sort()
|
||||||
|
|
||||||
activity.runOnUiThread {
|
activity.runOnUiThread {
|
||||||
view.apply {
|
view.apply {
|
||||||
add_favorites_list.adapter = AddFavoritesAdapter(activity, allContacts, config.favorites)
|
select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, config.favorites)
|
||||||
add_favorites_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble
|
select_contact_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble
|
||||||
add_favorites_fastscroller.setViews(add_favorites_list) {
|
select_contact_fastscroller.setViews(select_contact_list) {
|
||||||
add_favorites_fastscroller.updateBubbleText(allContacts[it].getBubbleText())
|
select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,7 +53,7 @@ class AddFavoritesDialog(val activity: SimpleActivity, val callback: () -> Unit)
|
||||||
private fun dialogConfirmed() {
|
private fun dialogConfirmed() {
|
||||||
val allDisplayedIDs = ArrayList<String>()
|
val allDisplayedIDs = ArrayList<String>()
|
||||||
allContacts.mapTo(allDisplayedIDs, { it.id.toString() })
|
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)
|
config.addFavorites(selectedItems)
|
||||||
allDisplayedIDs.removeAll(selectedItems)
|
allDisplayedIDs.removeAll(selectedItems)
|
||||||
|
|
||||||
|
|
|
@ -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 deleteContact(contact: Contact) = deleteContacts(arrayListOf(contact))
|
||||||
|
|
||||||
fun deleteContacts(contacts: ArrayList<Contact>) {
|
fun deleteContacts(contacts: ArrayList<Contact>) {
|
||||||
|
|
|
@ -2,25 +2,26 @@
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:id="@+id/add_favorites_holder"
|
android:id="@+id/select_contact_holder"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyRecyclerView
|
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
android:id="@+id/add_favorites_list"
|
android:id="@+id/select_contact_list"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
|
android:scrollbars="none"
|
||||||
app:layoutManager="android.support.v7.widget.LinearLayoutManager"/>
|
app:layoutManager="android.support.v7.widget.LinearLayoutManager"/>
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.FastScroller
|
<com.simplemobiletools.commons.views.FastScroller
|
||||||
android:id="@+id/add_favorites_fastscroller"
|
android:id="@+id/select_contact_fastscroller"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_alignBottom="@+id/add_favorites_list"
|
android:layout_alignBottom="@+id/select_contact_list"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_alignParentRight="true"
|
android:layout_alignParentRight="true"
|
||||||
android:layout_alignTop="@+id/add_favorites_list"
|
android:layout_alignTop="@+id/select_contact_list"
|
||||||
android:paddingLeft="@dimen/normal_margin"
|
android:paddingLeft="@dimen/normal_margin"
|
||||||
android:paddingStart="@dimen/normal_margin">
|
android:paddingStart="@dimen/normal_margin">
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<item
|
||||||
|
android:id="@+id/confirm"
|
||||||
|
android:icon="@drawable/ic_check"
|
||||||
|
android:title="@string/confirm_selection"
|
||||||
|
app:showAsAction="ifRoom"/>
|
||||||
|
</menu>
|
Loading…
Reference in New Issue