|
1 | 1 | package com.simplemobiletools.contacts.helpers |
2 | 2 |
|
| 3 | +import android.accounts.Account |
3 | 4 | import android.accounts.AccountManager |
4 | 5 | import android.app.Activity |
5 | 6 | import android.content.* |
@@ -61,6 +62,33 @@ class ContactsHelper(val activity: Activity) { |
61 | 62 | }.start() |
62 | 63 | } |
63 | 64 |
|
| 65 | + private fun getContentResolverAccounts(): HashSet<ContactSource> { |
| 66 | + val uri = ContactsContract.Data.CONTENT_URI |
| 67 | + val projection = arrayOf( |
| 68 | + ContactsContract.RawContacts.ACCOUNT_NAME, |
| 69 | + ContactsContract.RawContacts.ACCOUNT_TYPE |
| 70 | + ) |
| 71 | + |
| 72 | + val sources = HashSet<ContactSource>() |
| 73 | + var cursor: Cursor? = null |
| 74 | + try { |
| 75 | + cursor = activity.contentResolver.query(uri, projection, null, null, null) |
| 76 | + if (cursor?.moveToFirst() == true) { |
| 77 | + do { |
| 78 | + val name = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: "" |
| 79 | + val type = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_TYPE) ?: "" |
| 80 | + val source = ContactSource(name, type) |
| 81 | + sources.add(source) |
| 82 | + } while (cursor.moveToNext()) |
| 83 | + } |
| 84 | + } catch (e: Exception) { |
| 85 | + } finally { |
| 86 | + cursor?.close() |
| 87 | + } |
| 88 | + |
| 89 | + return sources |
| 90 | + } |
| 91 | + |
64 | 92 | private fun getDeviceContacts(contacts: SparseArray<Contact>) { |
65 | 93 | if (!activity.hasContactPermissions()) { |
66 | 94 | return |
@@ -662,14 +690,17 @@ class ContactsHelper(val activity: Activity) { |
662 | 690 | return sources |
663 | 691 | } |
664 | 692 |
|
665 | | - val accountManager = AccountManager.get(activity) |
666 | | - accountManager.accounts.filter { it.name.contains("@") || localAccountTypes.contains(it.type) }.forEach { |
667 | | - if (ContentResolver.getIsSyncable(it, ContactsContract.AUTHORITY) == 1) { |
| 693 | + val accounts = AccountManager.get(activity).accounts |
| 694 | + accounts.forEach { |
| 695 | + if (ContentResolver.getIsSyncable(it, ContactsContract.AUTHORITY) == 1 && ContentResolver.getSyncAutomatically(it, ContactsContract.AUTHORITY)) { |
668 | 696 | val contactSource = ContactSource(it.name, it.type) |
669 | 697 | sources.add(contactSource) |
670 | 698 | } |
671 | 699 | } |
672 | 700 |
|
| 701 | + val contentResolverAccounts = getContentResolverAccounts().filter { !accounts.contains(Account(it.name, it.type)) } |
| 702 | + sources.addAll(contentResolverAccounts) |
| 703 | + |
673 | 704 | if (sources.isEmpty() && activity.config.localAccountName.isEmpty() && activity.config.localAccountType.isEmpty()) { |
674 | 705 | sources.add(ContactSource("", "")) |
675 | 706 | } |
|
0 commit comments