mirror of
https://github.com/SimpleMobileTools/Simple-Contacts.git
synced 2025-02-12 09:30:39 +01:00
fix #110, allow launching the app without granting Contacts permission
This commit is contained in:
parent
764de9c858
commit
e05f48b425
@ -59,17 +59,12 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
|
||||
handlePermission(PERMISSION_READ_CONTACTS) {
|
||||
if (it) {
|
||||
handlePermission(PERMISSION_WRITE_CONTACTS) {
|
||||
if (it) {
|
||||
storeLocalAccountData()
|
||||
initFragments()
|
||||
} else {
|
||||
toast(R.string.no_contacts_permission)
|
||||
finish()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
toast(R.string.no_contacts_permission)
|
||||
finish()
|
||||
storeLocalAccountData()
|
||||
initFragments()
|
||||
}
|
||||
}
|
||||
storeStateVariables()
|
||||
|
@ -9,7 +9,10 @@ import android.os.Build
|
||||
import android.provider.ContactsContract
|
||||
import android.support.v4.content.FileProvider
|
||||
import com.simplemobiletools.commons.extensions.getIntValue
|
||||
import com.simplemobiletools.commons.extensions.hasPermission
|
||||
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.commons.helpers.isLollipopPlus
|
||||
import com.simplemobiletools.contacts.BuildConfig
|
||||
import com.simplemobiletools.contacts.R
|
||||
@ -155,3 +158,5 @@ fun Context.getPhotoThumbnailSize(): Int {
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
fun Context.hasContactPermissions() = hasPermission(PERMISSION_READ_CONTACTS) && hasPermission(PERMISSION_WRITE_CONTACTS)
|
||||
|
@ -20,16 +20,43 @@ import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME
|
||||
import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME
|
||||
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
|
||||
import com.simplemobiletools.contacts.R
|
||||
import com.simplemobiletools.contacts.extensions.config
|
||||
import com.simplemobiletools.contacts.extensions.dbHelper
|
||||
import com.simplemobiletools.contacts.extensions.getByteArray
|
||||
import com.simplemobiletools.contacts.extensions.getPhotoThumbnailSize
|
||||
import com.simplemobiletools.contacts.extensions.*
|
||||
import com.simplemobiletools.contacts.models.*
|
||||
|
||||
class ContactsHelper(val activity: BaseSimpleActivity) {
|
||||
fun getContacts(callback: (ArrayList<Contact>) -> Unit) {
|
||||
val contacts = SparseArray<Contact>()
|
||||
Thread {
|
||||
getDeviceContacts(contacts)
|
||||
|
||||
activity.dbHelper.getContacts(activity).forEach {
|
||||
contacts.put(it.id, it)
|
||||
}
|
||||
|
||||
val contactsSize = contacts.size()
|
||||
var resultContacts = ArrayList<Contact>(contactsSize)
|
||||
(0 until contactsSize).mapTo(resultContacts) { contacts.valueAt(it) }
|
||||
resultContacts = resultContacts.distinctBy { it.contactId } as ArrayList<Contact>
|
||||
|
||||
// groups are obtained with contactID, not rawID, so assign them to proper contacts like this
|
||||
val groups = getContactGroups(getStoredGroups())
|
||||
val size = groups.size()
|
||||
for (i in 0 until size) {
|
||||
val key = groups.keyAt(i)
|
||||
resultContacts.firstOrNull { it.contactId == key }?.groups = groups.valueAt(i)
|
||||
}
|
||||
|
||||
activity.runOnUiThread {
|
||||
callback(resultContacts)
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
private fun getDeviceContacts(contacts: SparseArray<Contact>) {
|
||||
if (!activity.hasContactPermissions()) {
|
||||
return
|
||||
}
|
||||
|
||||
val uri = ContactsContract.Data.CONTENT_URI
|
||||
val projection = getContactProjection()
|
||||
val selection = "${ContactsContract.Data.MIMETYPE} = ?"
|
||||
@ -101,28 +128,6 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
|
||||
val key = notes.keyAt(i)
|
||||
contacts[key]?.notes = notes.valueAt(i)
|
||||
}
|
||||
|
||||
activity.dbHelper.getContacts(activity).forEach {
|
||||
contacts.put(it.id, it)
|
||||
}
|
||||
|
||||
val contactsSize = contacts.size()
|
||||
var resultContacts = ArrayList<Contact>(contactsSize)
|
||||
(0 until contactsSize).mapTo(resultContacts) { contacts.valueAt(it) }
|
||||
resultContacts = resultContacts.distinctBy { it.contactId } as ArrayList<Contact>
|
||||
|
||||
// groups are obtained with contactID, not rawID, so assign them to proper contacts like this
|
||||
val groups = getContactGroups(getStoredGroups())
|
||||
size = groups.size()
|
||||
for (i in 0 until size) {
|
||||
val key = groups.keyAt(i)
|
||||
resultContacts.firstOrNull { it.contactId == key }?.groups = groups.valueAt(i)
|
||||
}
|
||||
|
||||
activity.runOnUiThread {
|
||||
callback(resultContacts)
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
private fun getPhoneNumbers(contactId: Int? = null): SparseArray<ArrayList<PhoneNumber>> {
|
||||
@ -317,6 +322,10 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
|
||||
|
||||
private fun getContactGroups(storedGroups: ArrayList<Group>, contactId: Int? = null): SparseArray<ArrayList<Group>> {
|
||||
val groups = SparseArray<ArrayList<Group>>()
|
||||
if (!activity.hasContactPermissions()) {
|
||||
return groups
|
||||
}
|
||||
|
||||
val uri = ContactsContract.Data.CONTENT_URI
|
||||
val projection = arrayOf(
|
||||
ContactsContract.Data.CONTACT_ID,
|
||||
@ -357,7 +366,17 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
|
||||
}
|
||||
|
||||
fun getStoredGroups(): ArrayList<Group> {
|
||||
val groups = getDeviceStoredGroups()
|
||||
groups.addAll(activity.dbHelper.getGroups())
|
||||
return groups
|
||||
}
|
||||
|
||||
fun getDeviceStoredGroups(): ArrayList<Group> {
|
||||
val groups = ArrayList<Group>()
|
||||
if (!activity.hasContactPermissions()) {
|
||||
return groups
|
||||
}
|
||||
|
||||
val uri = ContactsContract.Groups.CONTENT_URI
|
||||
val projection = arrayOf(
|
||||
ContactsContract.Groups._ID,
|
||||
@ -389,8 +408,6 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
|
||||
} finally {
|
||||
cursor?.close()
|
||||
}
|
||||
|
||||
groups.addAll(activity.dbHelper.getGroups())
|
||||
return groups
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user