moving some Activity extension responsibilities to Context

This commit is contained in:
tibbi
2018-11-28 21:52:38 +01:00
parent f96f2bca22
commit 7c0661983d
5 changed files with 215 additions and 219 deletions

View File

@ -51,7 +51,7 @@ android {
} }
dependencies { dependencies {
implementation 'com.simplemobiletools:commons:5.4.7' implementation 'com.simplemobiletools:commons:5.5.0'
implementation 'joda-time:joda-time:2.10.1' implementation 'joda-time:joda-time:2.10.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4'

View File

@ -1,9 +1,7 @@
package com.simplemobiletools.contacts.pro.extensions package com.simplemobiletools.contacts.pro.extensions
import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.provider.ContactsContract
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.sharePathIntent import com.simplemobiletools.commons.extensions.sharePathIntent
@ -17,8 +15,6 @@ import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog
import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.Contact
import com.simplemobiletools.contacts.pro.models.ContactSource
import java.io.File
fun SimpleActivity.startCallIntent(recipient: String) { fun SimpleActivity.startCallIntent(recipient: String) {
handlePermission(PERMISSION_CALL_PHONE) { handlePermission(PERMISSION_CALL_PHONE) {
@ -93,13 +89,6 @@ fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (new
} }
} }
fun SimpleActivity.getPublicContactSource(source: String): String {
return when (source) {
config.localAccountName -> getString(R.string.phone_storage)
SMT_PRIVATE -> getString(R.string.phone_storage_hidden)
else -> source
}
}
fun BaseSimpleActivity.shareContacts(contacts: ArrayList<Contact>) { fun BaseSimpleActivity.shareContacts(contacts: ArrayList<Contact>) {
val file = getTempFile() val file = getTempFile()
@ -117,96 +106,6 @@ fun BaseSimpleActivity.shareContacts(contacts: ArrayList<Contact>) {
} }
} }
fun BaseSimpleActivity.sendSMSToContacts(contacts: ArrayList<Contact>) {
val numbers = StringBuilder()
contacts.forEach {
val number = it.phoneNumbers.firstOrNull { it.type == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE }
?: it.phoneNumbers.firstOrNull()
if (number != null) {
numbers.append("${number.value};")
}
val uriString = "smsto:${numbers.toString().trimEnd(';')}"
Intent(Intent.ACTION_SENDTO, Uri.parse(uriString)).apply {
if (resolveActivity(packageManager) != null) {
startActivity(this)
} else {
toast(R.string.no_app_found)
}
}
}
}
fun BaseSimpleActivity.sendEmailToContacts(contacts: ArrayList<Contact>) {
val emails = ArrayList<String>()
contacts.forEach {
it.emails.forEach {
if (it.value.isNotEmpty()) {
emails.add(it.value)
}
}
}
Intent(Intent.ACTION_SEND_MULTIPLE).apply {
type = "message/rfc822"
putExtra(Intent.EXTRA_EMAIL, emails.toTypedArray())
if (resolveActivity(packageManager) != null) {
startActivity(this)
} else {
toast(R.string.no_app_found)
}
}
}
fun BaseSimpleActivity.getTempFile(): File? {
val folder = File(cacheDir, "contacts")
if (!folder.exists()) {
if (!folder.mkdir()) {
toast(R.string.unknown_error_occurred)
return null
}
}
return File(folder, "contacts.vcf")
}
fun BaseSimpleActivity.addContactsToGroup(contacts: ArrayList<Contact>, groupId: Long) {
val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList<Contact>
val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList<Contact>
if (publicContacts.isNotEmpty()) {
ContactsHelper(this).addContactsToGroup(publicContacts, groupId)
}
if (privateContacts.isNotEmpty()) {
LocalContactsHelper(this).addContactsToGroup(privateContacts, groupId)
}
}
fun BaseSimpleActivity.removeContactsFromGroup(contacts: ArrayList<Contact>, groupId: Long) {
val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList<Contact>
val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList<Contact>
if (publicContacts.isNotEmpty() && hasContactPermissions()) {
ContactsHelper(this).removeContactsFromGroup(publicContacts, groupId)
}
if (privateContacts.isNotEmpty()) {
LocalContactsHelper(this).removeContactsFromGroup(privateContacts, groupId)
}
}
fun BaseSimpleActivity.getContactPublicUri(contact: Contact): Uri {
val lookupKey = ContactsHelper(this).getContactLookupKey(contact.id.toString())
return Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey)
}
fun Activity.getVisibleContactSources(): ArrayList<String> {
val sources = ContactsHelper(this).getDeviceContactSources()
sources.add(ContactSource(getString(R.string.phone_storage_hidden), SMT_PRIVATE))
val sourceNames = ArrayList(sources).map { if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name }.toMutableList() as ArrayList<String>
sourceNames.removeAll(config.ignoredContactSources)
return sourceNames
}
fun SimpleActivity.contactClicked(contact: Contact) { fun SimpleActivity.contactClicked(contact: Contact) {
when (config.onContactClick) { when (config.onContactClick) {
ON_CLICK_CALL_CONTACT -> callContact(contact) ON_CLICK_CALL_CONTACT -> callContact(contact)

View File

@ -16,13 +16,11 @@ import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.EditContactActivity import com.simplemobiletools.contacts.pro.activities.EditContactActivity
import com.simplemobiletools.contacts.pro.activities.ViewContactActivity import com.simplemobiletools.contacts.pro.activities.ViewContactActivity
import com.simplemobiletools.contacts.pro.databases.ContactsDatabase import com.simplemobiletools.contacts.pro.databases.ContactsDatabase
import com.simplemobiletools.contacts.pro.helpers.CONTACT_ID import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.helpers.Config
import com.simplemobiletools.contacts.pro.helpers.IS_PRIVATE
import com.simplemobiletools.contacts.pro.helpers.SMT_PRIVATE
import com.simplemobiletools.contacts.pro.interfaces.ContactsDao import com.simplemobiletools.contacts.pro.interfaces.ContactsDao
import com.simplemobiletools.contacts.pro.interfaces.GroupsDao import com.simplemobiletools.contacts.pro.interfaces.GroupsDao
import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.Contact
import com.simplemobiletools.contacts.pro.models.ContactSource
import com.simplemobiletools.contacts.pro.models.Organization import com.simplemobiletools.contacts.pro.models.Organization
import java.io.File import java.io.File
@ -184,3 +182,101 @@ fun Context.getPhotoThumbnailSize(): Int {
} }
fun Context.hasContactPermissions() = hasPermission(PERMISSION_READ_CONTACTS) && hasPermission(PERMISSION_WRITE_CONTACTS) fun Context.hasContactPermissions() = hasPermission(PERMISSION_READ_CONTACTS) && hasPermission(PERMISSION_WRITE_CONTACTS)
fun Context.getPublicContactSource(source: String): String {
return when (source) {
config.localAccountName -> getString(R.string.phone_storage)
SMT_PRIVATE -> getString(R.string.phone_storage_hidden)
else -> source
}
}
fun Context.sendSMSToContacts(contacts: ArrayList<Contact>) {
val numbers = StringBuilder()
contacts.forEach {
val number = it.phoneNumbers.firstOrNull { it.type == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE }
?: it.phoneNumbers.firstOrNull()
if (number != null) {
numbers.append("${number.value};")
}
val uriString = "smsto:${numbers.toString().trimEnd(';')}"
Intent(Intent.ACTION_SENDTO, Uri.parse(uriString)).apply {
if (resolveActivity(packageManager) != null) {
startActivity(this)
} else {
toast(R.string.no_app_found)
}
}
}
}
fun Context.sendEmailToContacts(contacts: ArrayList<Contact>) {
val emails = ArrayList<String>()
contacts.forEach {
it.emails.forEach {
if (it.value.isNotEmpty()) {
emails.add(it.value)
}
}
}
Intent(Intent.ACTION_SEND_MULTIPLE).apply {
type = "message/rfc822"
putExtra(Intent.EXTRA_EMAIL, emails.toTypedArray())
if (resolveActivity(packageManager) != null) {
startActivity(this)
} else {
toast(R.string.no_app_found)
}
}
}
fun Context.getTempFile(): File? {
val folder = File(cacheDir, "contacts")
if (!folder.exists()) {
if (!folder.mkdir()) {
toast(R.string.unknown_error_occurred)
return null
}
}
return File(folder, "contacts.vcf")
}
fun Context.addContactsToGroup(contacts: ArrayList<Contact>, groupId: Long) {
val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList<Contact>
val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList<Contact>
if (publicContacts.isNotEmpty()) {
ContactsHelper(this).addContactsToGroup(publicContacts, groupId)
}
if (privateContacts.isNotEmpty()) {
LocalContactsHelper(this).addContactsToGroup(privateContacts, groupId)
}
}
fun Context.removeContactsFromGroup(contacts: ArrayList<Contact>, groupId: Long) {
val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList<Contact>
val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList<Contact>
if (publicContacts.isNotEmpty() && hasContactPermissions()) {
ContactsHelper(this).removeContactsFromGroup(publicContacts, groupId)
}
if (privateContacts.isNotEmpty()) {
LocalContactsHelper(this).removeContactsFromGroup(privateContacts, groupId)
}
}
fun Context.getContactPublicUri(contact: Contact): Uri {
val lookupKey = ContactsHelper(this).getContactLookupKey(contact.id.toString())
return Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey)
}
fun Context.getVisibleContactSources(): ArrayList<String> {
val sources = ContactsHelper(this).getDeviceContactSources()
sources.add(ContactSource(getString(R.string.phone_storage_hidden), SMT_PRIVATE))
val sourceNames = ArrayList(sources).map { if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name }.toMutableList() as ArrayList<String>
sourceNames.removeAll(config.ignoredContactSources)
return sourceNames
}

View File

@ -3,11 +3,12 @@ package com.simplemobiletools.contacts.pro.helpers
import android.accounts.Account import android.accounts.Account
import android.accounts.AccountManager import android.accounts.AccountManager
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity
import android.content.* import android.content.*
import android.database.Cursor import android.database.Cursor
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.provider.CallLog import android.provider.CallLog
import android.provider.ContactsContract import android.provider.ContactsContract
import android.provider.ContactsContract.CommonDataKinds import android.provider.ContactsContract.CommonDataKinds
@ -26,24 +27,24 @@ import java.text.SimpleDateFormat
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
class ContactsHelper(val activity: Activity) { class ContactsHelper(val context: Context) {
private val BATCH_SIZE = 100 private val BATCH_SIZE = 100
private var displayContactSources = ArrayList<String>() private var displayContactSources = ArrayList<String>()
fun getContacts(callback: (ArrayList<Contact>) -> Unit) { fun getContacts(callback: (ArrayList<Contact>) -> Unit) {
Thread { Thread {
val contacts = SparseArray<Contact>() val contacts = SparseArray<Contact>()
displayContactSources = activity.getVisibleContactSources() displayContactSources = context.getVisibleContactSources()
getDeviceContacts(contacts) getDeviceContacts(contacts)
if (displayContactSources.contains(SMT_PRIVATE)) { if (displayContactSources.contains(SMT_PRIVATE)) {
LocalContactsHelper(activity).getAllContacts().forEach { LocalContactsHelper(context).getAllContacts().forEach {
contacts.put(it.id, it) contacts.put(it.id, it)
} }
} }
val contactsSize = contacts.size() val contactsSize = contacts.size()
val showOnlyContactsWithNumbers = activity.config.showOnlyContactsWithNumbers val showOnlyContactsWithNumbers = context.config.showOnlyContactsWithNumbers
var tempContacts = ArrayList<Contact>(contactsSize) var tempContacts = ArrayList<Contact>(contactsSize)
val resultContacts = ArrayList<Contact>(contactsSize) val resultContacts = ArrayList<Contact>(contactsSize)
@ -57,7 +58,7 @@ class ContactsHelper(val activity: Activity) {
contacts.valueAt(it) contacts.valueAt(it)
} }
if (activity.config.filterDuplicates) { if (context.config.filterDuplicates) {
tempContacts = tempContacts.distinctBy { tempContacts = tempContacts.distinctBy {
it.getHashToCompare() it.getHashToCompare()
} as ArrayList<Contact> } as ArrayList<Contact>
@ -82,11 +83,11 @@ class ContactsHelper(val activity: Activity) {
resultContacts.firstOrNull { it.contactId == key }?.groups = groups.valueAt(i) resultContacts.firstOrNull { it.contactId == key }?.groups = groups.valueAt(i)
} }
Contact.sorting = activity.config.sorting Contact.sorting = context.config.sorting
Contact.startWithSurname = activity.config.startNameWithSurname Contact.startWithSurname = context.config.startNameWithSurname
resultContacts.sort() resultContacts.sort()
activity.runOnUiThread { Handler(Looper.getMainLooper()).post {
callback(resultContacts) callback(resultContacts)
} }
}.start() }.start()
@ -101,19 +102,19 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
callback(getContactWithId(id, false)) callback(getContactWithId(id, false))
return@Thread return@Thread
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
callback(LocalContactsHelper(activity).getContactWithNumber(number)) callback(LocalContactsHelper(context).getContactWithNumber(number))
}.start() }.start()
} }
@ -127,7 +128,7 @@ class ContactsHelper(val activity: Activity) {
val sources = HashSet<ContactSource>() val sources = HashSet<ContactSource>()
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, null, null, null) cursor = context.contentResolver.query(uri, projection, null, null, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val name = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: "" val name = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: ""
@ -145,7 +146,7 @@ class ContactsHelper(val activity: Activity) {
} }
private fun getDeviceContacts(contacts: SparseArray<Contact>) { private fun getDeviceContacts(contacts: SparseArray<Contact>) {
if (!activity.hasContactPermissions()) { if (!context.hasContactPermissions()) {
return return
} }
@ -157,7 +158,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, sortOrder) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -188,7 +189,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -276,7 +277,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -294,7 +295,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -315,7 +316,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -324,7 +325,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -347,7 +348,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -363,7 +364,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -386,7 +387,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -402,7 +403,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -425,7 +426,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -441,7 +442,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -463,7 +464,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -478,7 +479,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -499,7 +500,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -508,7 +509,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -530,7 +531,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -545,7 +546,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -566,7 +567,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
@ -580,7 +581,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -590,7 +591,7 @@ class ContactsHelper(val activity: Activity) {
private fun getContactGroups(storedGroups: ArrayList<Group>, contactId: Int? = null): SparseArray<ArrayList<Group>> { private fun getContactGroups(storedGroups: ArrayList<Group>, contactId: Int? = null): SparseArray<ArrayList<Group>> {
val groups = SparseArray<ArrayList<Group>>() val groups = SparseArray<ArrayList<Group>>()
if (!activity.hasContactPermissions()) { if (!context.hasContactPermissions()) {
return groups return groups
} }
@ -605,7 +606,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID)
@ -620,7 +621,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -673,7 +674,7 @@ class ContactsHelper(val activity: Activity) {
fun getStoredGroups(callback: (ArrayList<Group>) -> Unit) { fun getStoredGroups(callback: (ArrayList<Group>) -> Unit) {
Thread { Thread {
val groups = getStoredGroupsSync() val groups = getStoredGroupsSync()
activity.runOnUiThread { Handler(Looper.getMainLooper()).post {
callback(groups) callback(groups)
} }
}.start() }.start()
@ -681,13 +682,13 @@ class ContactsHelper(val activity: Activity) {
fun getStoredGroupsSync(): ArrayList<Group> { fun getStoredGroupsSync(): ArrayList<Group> {
val groups = getDeviceStoredGroups() val groups = getDeviceStoredGroups()
groups.addAll(activity.groupsDB.getGroups()) groups.addAll(context.groupsDB.getGroups())
return groups return groups
} }
fun getDeviceStoredGroups(): ArrayList<Group> { fun getDeviceStoredGroups(): ArrayList<Group> {
val groups = ArrayList<Group>() val groups = ArrayList<Group>()
if (!activity.hasContactPermissions()) { if (!context.hasContactPermissions()) {
return groups return groups
} }
@ -703,7 +704,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getLongValue(ContactsContract.Groups._ID) val id = cursor.getLongValue(ContactsContract.Groups._ID)
@ -718,7 +719,7 @@ class ContactsHelper(val activity: Activity) {
} while (cursor.moveToNext()) } while (cursor.moveToNext())
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} finally { } finally {
cursor?.close() cursor?.close()
} }
@ -728,7 +729,7 @@ class ContactsHelper(val activity: Activity) {
fun createNewGroup(title: String, accountName: String, accountType: String): Group? { fun createNewGroup(title: String, accountName: String, accountType: String): Group? {
if (accountType == SMT_PRIVATE) { if (accountType == SMT_PRIVATE) {
val newGroup = Group(null, title) val newGroup = Group(null, title)
val id = activity.groupsDB.insertOrUpdate(newGroup) val id = context.groupsDB.insertOrUpdate(newGroup)
newGroup.id = id newGroup.id = id
return newGroup return newGroup
} }
@ -743,11 +744,11 @@ class ContactsHelper(val activity: Activity) {
} }
try { try {
val results = activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) val results = context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
val rawId = ContentUris.parseId(results[0].uri) val rawId = ContentUris.parseId(results[0].uri)
return Group(rawId, title) return Group(rawId, title)
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} }
return null return null
} }
@ -763,9 +764,9 @@ class ContactsHelper(val activity: Activity) {
} }
try { try {
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} }
} }
@ -778,9 +779,9 @@ class ContactsHelper(val activity: Activity) {
operations.add(ContentProviderOperation.newDelete(uri).build()) operations.add(ContentProviderOperation.newDelete(uri).build())
try { try {
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} }
} }
@ -788,7 +789,7 @@ class ContactsHelper(val activity: Activity) {
if (id == 0) { if (id == 0) {
return null return null
} else if (isLocalPrivate) { } else if (isLocalPrivate) {
return LocalContactsHelper(activity).getContactWithId(id) return LocalContactsHelper(context).getContactWithId(id)
} }
val selection = "${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.RAW_CONTACT_ID} = ?" val selection = "${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.RAW_CONTACT_ID} = ?"
@ -808,7 +809,7 @@ class ContactsHelper(val activity: Activity) {
val projection = getContactProjection() val projection = getContactProjection()
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
val prefix = cursor.getStringValue(CommonDataKinds.StructuredName.PREFIX) ?: "" val prefix = cursor.getStringValue(CommonDataKinds.StructuredName.PREFIX) ?: ""
@ -849,22 +850,22 @@ class ContactsHelper(val activity: Activity) {
private fun getContactSourcesSync(): ArrayList<ContactSource> { private fun getContactSourcesSync(): ArrayList<ContactSource> {
val sources = getDeviceContactSources() val sources = getDeviceContactSources()
sources.add(ContactSource(activity.getString(R.string.phone_storage_hidden), SMT_PRIVATE)) sources.add(ContactSource(context.getString(R.string.phone_storage_hidden), SMT_PRIVATE))
return ArrayList(sources) return ArrayList(sources)
} }
fun getDeviceContactSources(): LinkedHashSet<ContactSource> { fun getDeviceContactSources(): LinkedHashSet<ContactSource> {
val sources = LinkedHashSet<ContactSource>() val sources = LinkedHashSet<ContactSource>()
if (!activity.hasContactPermissions()) { if (!context.hasContactPermissions()) {
return sources return sources
} }
val accounts = AccountManager.get(activity).accounts val accounts = AccountManager.get(context).accounts
accounts.forEach { accounts.forEach {
if (ContentResolver.getIsSyncable(it, ContactsContract.AUTHORITY) == 1) { if (ContentResolver.getIsSyncable(it, ContactsContract.AUTHORITY) == 1) {
val contactSource = ContactSource(it.name, it.type) val contactSource = ContactSource(it.name, it.type)
if (it.type == TELEGRAM_PACKAGE) { if (it.type == TELEGRAM_PACKAGE) {
contactSource.name += " (${activity.getString(R.string.telegram)})" contactSource.name += " (${context.getString(R.string.telegram)})"
} }
sources.add(contactSource) sources.add(contactSource)
} }
@ -875,7 +876,7 @@ class ContactsHelper(val activity: Activity) {
} }
sources.addAll(contentResolverAccounts) sources.addAll(contentResolverAccounts)
if (sources.isEmpty() && activity.config.localAccountName.isEmpty() && activity.config.localAccountType.isEmpty()) { if (sources.isEmpty() && context.config.localAccountName.isEmpty() && context.config.localAccountType.isEmpty()) {
sources.add(ContactSource("", "")) sources.add(ContactSource("", ""))
} }
@ -899,7 +900,7 @@ class ContactsHelper(val activity: Activity) {
) )
private fun getSortString(): String { private fun getSortString(): String {
val sorting = activity.config.sorting val sorting = context.config.sorting
var sort = when { var sort = when {
sorting and SORT_BY_FIRST_NAME != 0 -> "${CommonDataKinds.StructuredName.GIVEN_NAME} COLLATE NOCASE" sorting and SORT_BY_FIRST_NAME != 0 -> "${CommonDataKinds.StructuredName.GIVEN_NAME} COLLATE NOCASE"
sorting and SORT_BY_MIDDLE_NAME != 0 -> "${CommonDataKinds.StructuredName.MIDDLE_NAME} COLLATE NOCASE" sorting and SORT_BY_MIDDLE_NAME != 0 -> "${CommonDataKinds.StructuredName.MIDDLE_NAME} COLLATE NOCASE"
@ -921,7 +922,7 @@ class ContactsHelper(val activity: Activity) {
val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, id.toString()) val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, id.toString())
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
return cursor.getIntValue(ContactsContract.Data.CONTACT_ID) return cursor.getIntValue(ContactsContract.Data.CONTACT_ID)
} }
@ -933,9 +934,9 @@ class ContactsHelper(val activity: Activity) {
} }
fun updateContact(contact: Contact, photoUpdateStatus: Int): Boolean { fun updateContact(contact: Contact, photoUpdateStatus: Int): Boolean {
activity.toast(R.string.updating) context.toast(R.string.updating)
if (contact.source == SMT_PRIVATE) { if (contact.source == SMT_PRIVATE) {
return LocalContactsHelper(activity).insertOrUpdateContact(contact) return LocalContactsHelper(context).insertOrUpdateContact(contact)
} }
try { try {
@ -1149,9 +1150,9 @@ class ContactsHelper(val activity: Activity) {
val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, contact.contactId.toString()) val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, contact.contactId.toString())
val contentValues = ContentValues(1) val contentValues = ContentValues(1)
contentValues.put(ContactsContract.Contacts.STARRED, contact.starred) contentValues.put(ContactsContract.Contacts.STARRED, contact.starred)
activity.contentResolver.update(uri, contentValues, null, null) context.contentResolver.update(uri, contentValues, null, null)
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} }
// photo // photo
@ -1160,10 +1161,10 @@ class ContactsHelper(val activity: Activity) {
PHOTO_REMOVED -> removePhoto(contact, operations) PHOTO_REMOVED -> removePhoto(contact, operations)
} }
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
return true return true
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
return false return false
} }
} }
@ -1171,9 +1172,9 @@ class ContactsHelper(val activity: Activity) {
private fun addPhoto(contact: Contact, operations: ArrayList<ContentProviderOperation>): ArrayList<ContentProviderOperation> { private fun addPhoto(contact: Contact, operations: ArrayList<ContentProviderOperation>): ArrayList<ContentProviderOperation> {
if (contact.photoUri.isNotEmpty()) { if (contact.photoUri.isNotEmpty()) {
val photoUri = Uri.parse(contact.photoUri) val photoUri = Uri.parse(contact.photoUri)
val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri) val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, photoUri)
val thumbnailSize = activity.getPhotoThumbnailSize() val thumbnailSize = context.getPhotoThumbnailSize()
val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false) val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false)
val scaledSizePhotoData = scaledPhoto.getByteArray() val scaledSizePhotoData = scaledPhoto.getByteArray()
scaledPhoto.recycle() scaledPhoto.recycle()
@ -1215,15 +1216,15 @@ class ContactsHelper(val activity: Activity) {
} }
if (operations.size % BATCH_SIZE == 0) { if (operations.size % BATCH_SIZE == 0) {
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
operations.clear() operations.clear()
} }
} }
try { try {
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} }
} }
@ -1238,16 +1239,16 @@ class ContactsHelper(val activity: Activity) {
} }
if (operations.size % BATCH_SIZE == 0) { if (operations.size % BATCH_SIZE == 0) {
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
operations.clear() operations.clear()
} }
} }
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
} }
fun insertContact(contact: Contact): Boolean { fun insertContact(contact: Contact): Boolean {
if (contact.source == SMT_PRIVATE) { if (contact.source == SMT_PRIVATE) {
return LocalContactsHelper(activity).insertOrUpdateContact(contact) return LocalContactsHelper(context).insertOrUpdateContact(contact)
} }
try { try {
@ -1386,9 +1387,9 @@ class ContactsHelper(val activity: Activity) {
var scaledSizePhotoData: ByteArray? var scaledSizePhotoData: ByteArray?
if (contact.photoUri.isNotEmpty()) { if (contact.photoUri.isNotEmpty()) {
val photoUri = Uri.parse(contact.photoUri) val photoUri = Uri.parse(contact.photoUri)
val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri) val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, photoUri)
val thumbnailSize = activity.getPhotoThumbnailSize() val thumbnailSize = context.getPhotoThumbnailSize()
val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false) val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false)
scaledSizePhotoData = scaledPhoto.getByteArray() scaledSizePhotoData = scaledPhoto.getByteArray()
@ -1406,7 +1407,7 @@ class ContactsHelper(val activity: Activity) {
val results: Array<ContentProviderResult> val results: Array<ContentProviderResult>
try { try {
results = activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) results = context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
} finally { } finally {
scaledSizePhotoData = null scaledSizePhotoData = null
} }
@ -1423,12 +1424,12 @@ class ContactsHelper(val activity: Activity) {
val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, userId.toString()) val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, userId.toString())
val contentValues = ContentValues(1) val contentValues = ContentValues(1)
contentValues.put(ContactsContract.Contacts.STARRED, contact.starred) contentValues.put(ContactsContract.Contacts.STARRED, contact.starred)
activity.contentResolver.update(uri, contentValues, null, null) context.contentResolver.update(uri, contentValues, null, null)
} }
return true return true
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
return false return false
} }
} }
@ -1436,7 +1437,7 @@ class ContactsHelper(val activity: Activity) {
private fun addFullSizePhoto(contactId: Long, fullSizePhotoData: ByteArray) { private fun addFullSizePhoto(contactId: Long, fullSizePhotoData: ByteArray) {
val baseUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactId) val baseUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactId)
val displayPhotoUri = Uri.withAppendedPath(baseUri, ContactsContract.RawContacts.DisplayPhoto.CONTENT_DIRECTORY) val displayPhotoUri = Uri.withAppendedPath(baseUri, ContactsContract.RawContacts.DisplayPhoto.CONTENT_DIRECTORY)
val fileDescriptor = activity.contentResolver.openAssetFileDescriptor(displayPhotoUri, "rw") val fileDescriptor = context.contentResolver.openAssetFileDescriptor(displayPhotoUri, "rw")
val photoStream = fileDescriptor.createOutputStream() val photoStream = fileDescriptor.createOutputStream()
photoStream.write(fullSizePhotoData) photoStream.write(fullSizePhotoData)
photoStream.close() photoStream.close()
@ -1450,7 +1451,7 @@ class ContactsHelper(val activity: Activity) {
val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, contactId) val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, contactId)
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID)
val lookupKey = cursor.getStringValue(ContactsContract.Data.LOOKUP_KEY) val lookupKey = cursor.getStringValue(ContactsContract.Data.LOOKUP_KEY)
@ -1470,7 +1471,7 @@ class ContactsHelper(val activity: Activity) {
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
return cursor.getStringValue(ContactsContract.Data._ID) return cursor.getStringValue(ContactsContract.Data._ID)
} }
@ -1483,7 +1484,7 @@ class ContactsHelper(val activity: Activity) {
fun addFavorites(contacts: ArrayList<Contact>) { fun addFavorites(contacts: ArrayList<Contact>) {
Thread { Thread {
toggleLocalFavorites(contacts, true) toggleLocalFavorites(contacts, true)
if (activity.hasContactPermissions()) { if (context.hasContactPermissions()) {
toggleFavorites(contacts, true) toggleFavorites(contacts, true)
} }
}.start() }.start()
@ -1492,7 +1493,7 @@ class ContactsHelper(val activity: Activity) {
fun removeFavorites(contacts: ArrayList<Contact>) { fun removeFavorites(contacts: ArrayList<Contact>) {
Thread { Thread {
toggleLocalFavorites(contacts, false) toggleLocalFavorites(contacts, false)
if (activity.hasContactPermissions()) { if (context.hasContactPermissions()) {
toggleFavorites(contacts, false) toggleFavorites(contacts, false)
} }
}.start() }.start()
@ -1509,25 +1510,25 @@ class ContactsHelper(val activity: Activity) {
} }
if (operations.size % BATCH_SIZE == 0) { if (operations.size % BATCH_SIZE == 0) {
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
operations.clear() operations.clear()
} }
} }
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} }
} }
private fun toggleLocalFavorites(contacts: ArrayList<Contact>, addToFavorites: Boolean) { private fun toggleLocalFavorites(contacts: ArrayList<Contact>, addToFavorites: Boolean) {
val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray() val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray()
LocalContactsHelper(activity).toggleFavorites(localContacts, addToFavorites) LocalContactsHelper(context).toggleFavorites(localContacts, addToFavorites)
} }
fun deleteContact(contact: Contact) { fun deleteContact(contact: Contact) {
Thread { Thread {
if (contact.source == SMT_PRIVATE) { if (contact.source == SMT_PRIVATE) {
activity.contactsDB.deleteContactId(contact.id) context.contactsDB.deleteContactId(contact.id)
} else { } else {
deleteContacts(arrayListOf(contact)) deleteContacts(arrayListOf(contact))
} }
@ -1536,7 +1537,7 @@ class ContactsHelper(val activity: Activity) {
fun deleteContacts(contacts: ArrayList<Contact>) { fun deleteContacts(contacts: ArrayList<Contact>) {
val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray() val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray()
LocalContactsHelper(activity).deleteContactIds(localContacts) LocalContactsHelper(context).deleteContactIds(localContacts)
try { try {
val operations = ArrayList<ContentProviderOperation>() val operations = ArrayList<ContentProviderOperation>()
@ -1549,16 +1550,16 @@ class ContactsHelper(val activity: Activity) {
} }
if (operations.size % BATCH_SIZE == 0) { if (operations.size % BATCH_SIZE == 0) {
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
operations.clear() operations.clear()
} }
} }
if (activity.hasPermission(PERMISSION_WRITE_CONTACTS)) { if (context.hasPermission(PERMISSION_WRITE_CONTACTS)) {
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
} }
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} }
} }
@ -1566,7 +1567,7 @@ class ContactsHelper(val activity: Activity) {
fun getRecents(callback: (ArrayList<RecentCall>) -> Unit) { fun getRecents(callback: (ArrayList<RecentCall>) -> Unit) {
Thread { Thread {
val calls = ArrayList<RecentCall>() val calls = ArrayList<RecentCall>()
if (!activity.hasPermission(PERMISSION_WRITE_CALL_LOG) || !activity.hasPermission(PERMISSION_READ_CALL_LOG)) { if (!context.hasPermission(PERMISSION_WRITE_CALL_LOG) || !context.hasPermission(PERMISSION_READ_CALL_LOG)) {
callback(calls) callback(calls)
return@Thread return@Thread
} }
@ -1584,13 +1585,13 @@ class ContactsHelper(val activity: Activity) {
val currentYear = SimpleDateFormat("yyyy", Locale.getDefault()).format(currentDate) val currentYear = SimpleDateFormat("yyyy", Locale.getDefault()).format(currentDate)
val todayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(currentDate) val todayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(currentDate)
val yesterdayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(Date(System.currentTimeMillis() - DAY_SECONDS * 1000)) val yesterdayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(Date(System.currentTimeMillis() - DAY_SECONDS * 1000))
val yesterday = activity.getString(R.string.yesterday) val yesterday = context.getString(R.string.yesterday)
val timeFormat = if (activity.config.use24HourFormat) "HH:mm" else "h:mm a" val timeFormat = if (context.config.use24HourFormat) "HH:mm" else "h:mm a"
var prevNumber = "" var prevNumber = ""
var cursor: Cursor? = null var cursor: Cursor? = null
try { try {
cursor = activity.contentResolver.query(uri, projection, null, null, sorting) cursor = context.contentResolver.query(uri, projection, null, null, sorting)
if (cursor?.moveToFirst() == true) { if (cursor?.moveToFirst() == true) {
do { do {
val id = cursor.getIntValue(CallLog.Calls._ID) val id = cursor.getIntValue(CallLog.Calls._ID)
@ -1634,14 +1635,14 @@ class ContactsHelper(val activity: Activity) {
} }
if (operations.size % BATCH_SIZE == 0) { if (operations.size % BATCH_SIZE == 0) {
activity.contentResolver.applyBatch(CallLog.AUTHORITY, operations) context.contentResolver.applyBatch(CallLog.AUTHORITY, operations)
operations.clear() operations.clear()
} }
} }
activity.contentResolver.applyBatch(CallLog.AUTHORITY, operations) context.contentResolver.applyBatch(CallLog.AUTHORITY, operations)
} catch (e: Exception) { } catch (e: Exception) {
activity.showErrorToast(e) context.showErrorToast(e)
} }
}.start() }.start()
} }

View File

@ -1,6 +1,6 @@
package com.simplemobiletools.contacts.pro.helpers package com.simplemobiletools.contacts.pro.helpers
import android.app.Activity import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.net.Uri import android.net.Uri
@ -14,13 +14,13 @@ import com.simplemobiletools.contacts.pro.models.Group
import com.simplemobiletools.contacts.pro.models.LocalContact import com.simplemobiletools.contacts.pro.models.LocalContact
import com.simplemobiletools.contacts.pro.models.Organization import com.simplemobiletools.contacts.pro.models.Organization
class LocalContactsHelper(val activity: Activity) { class LocalContactsHelper(val context: Context) {
fun getAllContacts() = activity.contactsDB.getContacts().map { convertLocalContactToContact(it) }.toMutableList() as ArrayList<Contact> fun getAllContacts() = context.contactsDB.getContacts().map { convertLocalContactToContact(it) }.toMutableList() as ArrayList<Contact>
fun getContactWithId(id: Int) = convertLocalContactToContact(activity.contactsDB.getContactWithId(id)) fun getContactWithId(id: Int) = convertLocalContactToContact(context.contactsDB.getContactWithId(id))
fun getContactWithNumber(number: String): Contact? { fun getContactWithNumber(number: String): Contact? {
activity.contactsDB.getContacts().forEach { context.contactsDB.getContacts().forEach {
if (it.phoneNumbers.map { it.value }.contains(number)) { if (it.phoneNumbers.map { it.value }.contains(number)) {
return convertLocalContactToContact(it) return convertLocalContactToContact(it)
} }
@ -30,7 +30,7 @@ class LocalContactsHelper(val activity: Activity) {
fun insertOrUpdateContact(contact: Contact): Boolean { fun insertOrUpdateContact(contact: Contact): Boolean {
val localContact = convertContactToLocalContact(contact) val localContact = convertContactToLocalContact(contact)
return activity.contactsDB.insertOrUpdate(localContact) > 0 return context.contactsDB.insertOrUpdate(localContact) > 0
} }
fun addContactsToGroup(contacts: ArrayList<Contact>, groupId: Long) { fun addContactsToGroup(contacts: ArrayList<Contact>, groupId: Long) {
@ -40,7 +40,7 @@ class LocalContactsHelper(val activity: Activity) {
newGroups.add(groupId) newGroups.add(groupId)
newGroups.distinct() newGroups.distinct()
localContact.groups = newGroups localContact.groups = newGroups
activity.contactsDB.insertOrUpdate(localContact) context.contactsDB.insertOrUpdate(localContact)
} }
} }
@ -50,20 +50,20 @@ class LocalContactsHelper(val activity: Activity) {
val newGroups = localContact.groups val newGroups = localContact.groups
newGroups.remove(groupId) newGroups.remove(groupId)
localContact.groups = newGroups localContact.groups = newGroups
activity.contactsDB.insertOrUpdate(localContact) context.contactsDB.insertOrUpdate(localContact)
} }
} }
fun deleteContactIds(ids: Array<Int>) { fun deleteContactIds(ids: Array<Int>) {
ids.forEach { ids.forEach {
activity.contactsDB.deleteContactId(it) context.contactsDB.deleteContactId(it)
} }
} }
fun toggleFavorites(ids: Array<Int>, addToFavorites: Boolean) { fun toggleFavorites(ids: Array<Int>, addToFavorites: Boolean) {
val isStarred = if (addToFavorites) 1 else 0 val isStarred = if (addToFavorites) 1 else 0
ids.forEach { ids.forEach {
activity.contactsDB.updateStarred(isStarred, it) context.contactsDB.updateStarred(isStarred, it)
} }
} }
@ -73,9 +73,9 @@ class LocalContactsHelper(val activity: Activity) {
} }
val photoUri = Uri.parse(uri) val photoUri = Uri.parse(uri)
val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri) val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, photoUri)
val thumbnailSize = activity.getPhotoThumbnailSize() val thumbnailSize = context.getPhotoThumbnailSize()
val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize * 2, thumbnailSize * 2, false) val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize * 2, thumbnailSize * 2, false)
val scaledSizePhotoData = scaledPhoto.getByteArray() val scaledSizePhotoData = scaledPhoto.getByteArray()
scaledPhoto.recycle() scaledPhoto.recycle()
@ -97,9 +97,9 @@ class LocalContactsHelper(val activity: Activity) {
} }
} }
val storedGroups = ContactsHelper(activity).getStoredGroupsSync() val storedGroups = ContactsHelper(context).getStoredGroupsSync()
return activity.getEmptyContact().apply { return context.getEmptyContact().apply {
id = localContact.id!! id = localContact.id!!
prefix = localContact.prefix prefix = localContact.prefix
firstName = localContact.firstName firstName = localContact.firstName