From 91e645b08e20e55c4fb9c2342e86a8619c3e2b7f Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 13:05:55 +0200 Subject: [PATCH] improve the contact source loading synchronicity --- .../pro/activities/ViewContactActivity.kt | 77 ++++++++----------- .../contacts/pro/extensions/Context.kt | 43 +++++++---- .../contacts/pro/helpers/ContactsHelper.kt | 2 +- 3 files changed, 65 insertions(+), 57 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index bd9d9a06..bd1b374d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -18,6 +18,7 @@ import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.pro.extensions.* import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.Contact +import com.simplemobiletools.contacts.pro.models.ContactSource import com.simplemobiletools.contacts.pro.models.PhoneNumber import kotlinx.android.synthetic.main.activity_view_contact.* import kotlinx.android.synthetic.main.item_event.view.* @@ -32,8 +33,8 @@ import kotlinx.android.synthetic.main.item_website.view.* class ViewContactActivity : ContactActivity() { private var isViewIntent = false private var wasEditLaunched = false - private var shownContactSources = ArrayList() private var duplicateContacts = ArrayList() + private var contactSources = ArrayList() private var showFields = 0 private val COMPARABLE_PHONE_NUMBER_LENGTH = 7 @@ -201,9 +202,12 @@ class ViewContactActivity : ContactActivity() { setupFavorite() setupNames() - getDuplicateContacts { - setupPhoneNumbers() - setupContactSources() + ContactsHelper(this).getContactSources { + contactSources = it + getDuplicateContacts { + setupPhoneNumbers() + setupContactSources() + } } setupEmails() @@ -499,8 +503,32 @@ class ViewContactActivity : ContactActivity() { } private fun setupContactSources() { - if (contact_sources_holder.childCount == 0) { - addContactSource(contact!!) + if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { + val sources = LinkedHashMap() + sources[contact!!] = contact!!.source + duplicateContacts.forEach { + sources[it] = it.source + } + + contact_sources_holder.removeAllViews() + for ((key, value) in sources) { + layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { + val contactSource = getPublicContactSourceSync(value, contactSources) + contact_source.text = contactSource + contact_source.copyOnLongClick(contactSource) + contact_sources_holder.addView(this) + + contact_source.setOnClickListener { + launchEditContact(key) + } + } + } + + contact_source_image.beVisible() + contact_sources_holder.beVisible() + } else { + contact_source_image.beGone() + contact_sources_holder.beGone() } } @@ -517,48 +545,11 @@ class ViewContactActivity : ContactActivity() { runOnUiThread { callback() - - val currContactSources = duplicateContacts.map { it.source } - if (currContactSources.toString() != shownContactSources.toString()) { - for (i in (contact_sources_holder.childCount - 1) downTo 1) { - contact_sources_holder.removeView(contact_sources_holder.getChildAt(i)) - shownContactSources.clear() - } - } - - if (shownContactSources.isEmpty()) { - duplicateContacts.forEach { - addContactSource(it) - shownContactSources.add(it.source) - } - } } } } } - private fun addContactSource(contact: Contact) { - if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { - layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { - getPublicContactSource(contact.source) { - contact_source.text = it - contact_source.copyOnLongClick(it) - contact_sources_holder.addView(this) - - contact_source.setOnClickListener { - launchEditContact(contact) - } - } - } - - contact_source_image.beVisible() - contact_sources_holder.beVisible() - } else { - contact_source_image.beGone() - contact_sources_holder.beGone() - } - } - private fun deleteContactFromAllSources() { val addition = if (contact_sources_holder.childCount > 1) { "\n\n${getString(R.string.delete_from_all_sources)}" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 59868db0..2aafcf93 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -15,7 +15,10 @@ import android.provider.ContactsContract import android.telecom.TelecomManager import androidx.core.content.FileProvider import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS +import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS +import com.simplemobiletools.commons.helpers.isMarshmallowPlus +import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.contacts.pro.BuildConfig import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.EditContactActivity @@ -30,7 +33,6 @@ import com.simplemobiletools.contacts.pro.models.ContactSource import com.simplemobiletools.contacts.pro.models.Organization import java.io.File - val Context.config: Config get() = Config.newInstance(applicationContext) val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() @@ -196,24 +198,39 @@ fun Context.getPublicContactSource(source: String, callback: (String) -> Unit) { when (source) { SMT_PRIVATE -> callback(getString(R.string.phone_storage_hidden)) else -> { - ensureBackgroundThread { - ContactsHelper(this).getContactSources { - var newSource = source - for (contactSource in it) { - if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) { - newSource += " (${getString(R.string.telegram)})" - break - } - } - Handler(Looper.getMainLooper()).post { - callback(newSource) + ContactsHelper(this).getContactSources { + var newSource = source + for (contactSource in it) { + if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) { + newSource += " (${getString(R.string.telegram)})" + break } } + Handler(Looper.getMainLooper()).post { + callback(newSource) + } } } } } +fun Context.getPublicContactSourceSync(source: String, contactSources: ArrayList): String { + return when (source) { + SMT_PRIVATE -> getString(R.string.phone_storage_hidden) + else -> { + var newSource = source + for (contactSource in contactSources) { + if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) { + newSource += " (${getString(R.string.telegram)})" + break + } + } + + return newSource + } + } +} + fun Context.sendSMSToContacts(contacts: ArrayList) { val numbers = StringBuilder() contacts.forEach { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index cf179b81..1b9a2df7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -848,7 +848,7 @@ class ContactsHelper(val context: Context) { } } - private fun getContactSourcesSync(): ArrayList { + fun getContactSourcesSync(): ArrayList { val sources = getDeviceContactSources() sources.add(context.getPrivateContactSource()) return ArrayList(sources)