From bae7af14741d260125a1a0cb34d68375bb1ac68a Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Wed, 4 May 2022 15:32:15 +0300 Subject: [PATCH 1/7] show contact count at contact sources --- .../adapters/FilterContactSourcesAdapter.kt | 39 +++---- .../pro/dialogs/ExportContactsDialog.kt | 102 +++++++++++------- .../pro/dialogs/FilterContactSourcesDialog.kt | 61 +++++++---- 3 files changed, 129 insertions(+), 73 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt index 39baf6e6..7ad1d146 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt @@ -14,25 +14,27 @@ import kotlinx.android.synthetic.main.item_filter_contact_source.view.* class FilterContactSourcesAdapter( val activity: SimpleActivity, - private val contactSources: List, + private val data: List, private val displayContactSources: ArrayList -) : - RecyclerView.Adapter() { +) : RecyclerView.Adapter() { + private val selectedKeys = HashSet() + data class ContactSourceModel(val contactSource: ContactSource, val count: Int) + init { - contactSources.forEachIndexed { index, contactSource -> - if (displayContactSources.contains(contactSource.name)) { - selectedKeys.add(contactSource.hashCode()) + data.forEachIndexed { index, model -> + if (displayContactSources.contains(model.contactSource.name)) { + selectedKeys.add(model.hashCode()) } - if (contactSource.type == SMT_PRIVATE && displayContactSources.contains(SMT_PRIVATE)) { - selectedKeys.add(contactSource.hashCode()) + if (model.contactSource.type == SMT_PRIVATE && displayContactSources.contains(SMT_PRIVATE)) { + selectedKeys.add(model.hashCode()) } } } - private fun toggleItemSelection(select: Boolean, contactSource: ContactSource, position: Int) { + private fun toggleItemSelection(select: Boolean, contactSource: ContactSourceModel, position: Int) { if (select) { selectedKeys.add(contactSource.hashCode()) } else { @@ -42,7 +44,7 @@ class FilterContactSourcesAdapter( notifyItemChanged(position) } - fun getSelectedContactSources() = contactSources.filter { selectedKeys.contains(it.hashCode()) } + fun getSelectedContactSources() = data.filter { selectedKeys.contains(it.hashCode()) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = activity.layoutInflater.inflate(R.layout.item_filter_contact_source, parent, false) @@ -50,26 +52,27 @@ class FilterContactSourcesAdapter( } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val contactSource = contactSources[position] - holder.bindView(contactSource) + val model = data[position] + holder.bindView(model) } - override fun getItemCount() = contactSources.size + override fun getItemCount() = data.size inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - fun bindView(contactSource: ContactSource): View { - val isSelected = selectedKeys.contains(contactSource.hashCode()) + fun bindView(model: ContactSourceModel): View { + val isSelected = selectedKeys.contains(model.hashCode()) itemView.apply { filter_contact_source_checkbox.isChecked = isSelected filter_contact_source_checkbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) - filter_contact_source_checkbox.text = contactSource.publicName - filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) } + val displayName = "${model.contactSource.publicName} (${model.count})" + filter_contact_source_checkbox.text = displayName + filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, model) } } return itemView } - private fun viewClicked(select: Boolean, contactSource: ContactSource) { + private fun viewClicked(select: Boolean, contactSource: ContactSourceModel) { toggleItemSelection(select, contactSource, adapterPosition) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt index f0457a18..604853e1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.contacts.pro.dialogs +import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog @@ -11,16 +12,21 @@ import com.simplemobiletools.contacts.pro.adapters.FilterContactSourcesAdapter import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources import com.simplemobiletools.contacts.pro.helpers.ContactsHelper +import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.ContactSource import kotlinx.android.synthetic.main.dialog_export_contacts.view.* import java.io.File -import java.util.* -class ExportContactsDialog(val activity: SimpleActivity, val path: String, val hidePath: Boolean, - private val callback: (file: File, ignoredContactSources: HashSet) -> Unit) { - private var contactSources = ArrayList() +class ExportContactsDialog( + val activity: SimpleActivity, val path: String, val hidePath: Boolean, + private val callback: (file: File, ignoredContactSources: HashSet) -> Unit +) { private var ignoreClicks = false private var realPath = if (path.isEmpty()) activity.internalStoragePath else path + private var contactSources = ArrayList() + private var contacts = ArrayList() + private var isContactSourcesReady = false + private var isContactsReady = false init { val view = (activity.layoutInflater.inflate(R.layout.dialog_export_contacts, null) as ViewGroup).apply { @@ -40,47 +46,71 @@ class ExportContactsDialog(val activity: SimpleActivity, val path: String, val h } } - ContactsHelper(activity).getContactSources { - it.mapTo(contactSources) { it.copy() } - activity.runOnUiThread { - export_contacts_list.adapter = FilterContactSourcesAdapter(activity, it, activity.getVisibleContactSources()) - } + ContactsHelper(activity).getContactSources { contactSources -> + contactSources.mapTo(this@ExportContactsDialog.contactSources) { it.copy() } + isContactSourcesReady = true + processDataIfReady(this) + } + + ContactsHelper(activity).getContacts(getAll = true) { contacts -> + contacts.mapTo(this@ExportContactsDialog.contacts) { it.copy() } + isContactsReady = true + processDataIfReady(this) } } AlertDialog.Builder(activity) - .setPositiveButton(R.string.ok, null) - .setNegativeButton(R.string.cancel, null) - .create().apply { - activity.setupDialogStuff(view, this, R.string.export_contacts) { - getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - if (view.export_contacts_list.adapter == null || ignoreClicks) { - return@setOnClickListener - } + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this, R.string.export_contacts) { + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + if (view.export_contacts_list.adapter == null || ignoreClicks) { + return@setOnClickListener + } - val filename = view.export_contacts_filename.value - when { - filename.isEmpty() -> activity.toast(R.string.empty_name) - filename.isAValidFilename() -> { - val file = File(realPath, "$filename.vcf") - if (!hidePath && file.exists()) { - activity.toast(R.string.name_taken) - return@setOnClickListener - } - - ignoreClicks = true - ensureBackgroundThread { - activity.config.lastExportPath = file.absolutePath.getParentPath() - val selectedSources = (view.export_contacts_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources() - val ignoredSources = contactSources.filter { !selectedSources.contains(it) }.map { it.getFullIdentifier() }.toHashSet() - callback(file, ignoredSources) - dismiss() - } + val filename = view.export_contacts_filename.value + when { + filename.isEmpty() -> activity.toast(R.string.empty_name) + filename.isAValidFilename() -> { + val file = File(realPath, "$filename.vcf") + if (!hidePath && file.exists()) { + activity.toast(R.string.name_taken) + return@setOnClickListener + } + + ignoreClicks = true + ensureBackgroundThread { + activity.config.lastExportPath = file.absolutePath.getParentPath() + val selectedSources = (view.export_contacts_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources() + val ignoredSources = contactSources + .filter { !selectedSources.map { source -> source.contactSource }.contains(it) } + .map { it.getFullIdentifier() } + .toHashSet() + callback(file, ignoredSources) + dismiss() } - else -> activity.toast(R.string.invalid_name) } + else -> activity.toast(R.string.invalid_name) } } } + } + } + + private fun processDataIfReady(view: View) { + if (!isContactSourcesReady || !isContactsReady) { + return + } + + val adapterData = ArrayList() + for (source in contactSources) { + val count = contacts.filter { it.source == source.name }.count() + adapterData.add(FilterContactSourcesAdapter.ContactSourceModel(source, count)) + } + + activity.runOnUiThread { + view.export_contacts_list.adapter = FilterContactSourcesAdapter(activity, adapterData, activity.getVisibleContactSources()) + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt index 1090c7d3..71465224 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt @@ -5,45 +5,68 @@ import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.FilterContactSourcesAdapter +import com.simplemobiletools.contacts.pro.adapters.FilterContactSourcesAdapter.ContactSourceModel import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources import com.simplemobiletools.contacts.pro.helpers.ContactsHelper import com.simplemobiletools.contacts.pro.helpers.SMT_PRIVATE +import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.ContactSource import kotlinx.android.synthetic.main.dialog_filter_contact_sources.view.* -import java.util.* class FilterContactSourcesDialog(val activity: SimpleActivity, private val callback: () -> Unit) { private var dialog: AlertDialog? = null private val view = activity.layoutInflater.inflate(R.layout.dialog_filter_contact_sources, null) private var contactSources = ArrayList() + private var contacts = ArrayList() + private var isContactSourcesReady = false + private var isContactsReady = false init { - ContactsHelper(activity).getContactSources { - if (it.isEmpty()) { - return@getContactSources - } + ContactsHelper(activity).getContactSources { contactSources -> + contactSources.mapTo(this.contactSources) { it.copy() } + isContactSourcesReady = true + processDataIfReady() + } - it.mapTo(contactSources) { it.copy() } - val selectedSources = activity.getVisibleContactSources() - activity.runOnUiThread { - view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, it, selectedSources) + ContactsHelper(activity).getContacts(getAll = true) { contacts -> + contacts.mapTo(this.contacts) { it.copy() } + isContactsReady = true + processDataIfReady() + } + } - dialog = AlertDialog.Builder(activity) - .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() } - .setNegativeButton(R.string.cancel, null) - .create().apply { - activity.setupDialogStuff(view, this) - } - } + private fun processDataIfReady() { + if (!isContactSourcesReady || !isContactsReady) { + return + } + + val adapterData = ArrayList() + for (source in contactSources) { + val count = contacts.filter { it.source == source.name }.count() + adapterData.add(ContactSourceModel(source, count)) + } + + val selectedSources = activity.getVisibleContactSources() + activity.runOnUiThread { + view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, adapterData, selectedSources) + + dialog = AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() } + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this) + } } } private fun confirmContactSources() { val selectedContactSources = (view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources() - val ignoredContactSources = contactSources.filter { !selectedContactSources.contains(it) }.map { - if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.getFullIdentifier() - }.toHashSet() + val ignoredContactSources = contactSources + .filter { !selectedContactSources.map { it.contactSource }.contains(it) } + .map { + if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.getFullIdentifier() + }.toHashSet() if (activity.getVisibleContactSources() != ignoredContactSources) { activity.config.ignoredContactSources = ignoredContactSources From e5423218ebd8a39b9e5d8dc4d3a3379faedfa5e5 Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Thu, 5 May 2022 12:49:12 +0300 Subject: [PATCH 2/7] refactor ContactSourceModel --- .../adapters/FilterContactSourcesAdapter.kt | 34 +++++++++---------- .../pro/dialogs/ExportContactsDialog.kt | 11 +++--- .../pro/dialogs/FilterContactSourcesDialog.kt | 22 ++++++------ .../contacts/pro/models/ContactSource.kt | 2 +- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt index 7ad1d146..868d83ef 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt @@ -14,27 +14,25 @@ import kotlinx.android.synthetic.main.item_filter_contact_source.view.* class FilterContactSourcesAdapter( val activity: SimpleActivity, - private val data: List, + private val contactSources: List, private val displayContactSources: ArrayList ) : RecyclerView.Adapter() { private val selectedKeys = HashSet() - data class ContactSourceModel(val contactSource: ContactSource, val count: Int) - init { - data.forEachIndexed { index, model -> - if (displayContactSources.contains(model.contactSource.name)) { - selectedKeys.add(model.hashCode()) + contactSources.forEachIndexed { index, contactSource -> + if (displayContactSources.contains(contactSource.name)) { + selectedKeys.add(contactSource.hashCode()) } - if (model.contactSource.type == SMT_PRIVATE && displayContactSources.contains(SMT_PRIVATE)) { - selectedKeys.add(model.hashCode()) + if (contactSource.type == SMT_PRIVATE && displayContactSources.contains(SMT_PRIVATE)) { + selectedKeys.add(contactSource.hashCode()) } } } - private fun toggleItemSelection(select: Boolean, contactSource: ContactSourceModel, position: Int) { + private fun toggleItemSelection(select: Boolean, contactSource: ContactSource, position: Int) { if (select) { selectedKeys.add(contactSource.hashCode()) } else { @@ -44,7 +42,7 @@ class FilterContactSourcesAdapter( notifyItemChanged(position) } - fun getSelectedContactSources() = data.filter { selectedKeys.contains(it.hashCode()) } + fun getSelectedContactSources() = contactSources.filter { selectedKeys.contains(it.hashCode()) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = activity.layoutInflater.inflate(R.layout.item_filter_contact_source, parent, false) @@ -52,27 +50,27 @@ class FilterContactSourcesAdapter( } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val model = data[position] - holder.bindView(model) + val contactSource = contactSources[position] + holder.bindView(contactSource) } - override fun getItemCount() = data.size + override fun getItemCount() = contactSources.size inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - fun bindView(model: ContactSourceModel): View { - val isSelected = selectedKeys.contains(model.hashCode()) + fun bindView(contactSource: ContactSource): View { + val isSelected = selectedKeys.contains(contactSource.hashCode()) itemView.apply { filter_contact_source_checkbox.isChecked = isSelected filter_contact_source_checkbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) - val displayName = "${model.contactSource.publicName} (${model.count})" + val displayName = "${contactSource.publicName} (${contactSource.count})" filter_contact_source_checkbox.text = displayName - filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, model) } + filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) } } return itemView } - private fun viewClicked(select: Boolean, contactSource: ContactSourceModel) { + private fun viewClicked(select: Boolean, contactSource: ContactSource) { toggleItemSelection(select, contactSource, adapterPosition) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt index 604853e1..ef8e91df 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/ExportContactsDialog.kt @@ -84,7 +84,7 @@ class ExportContactsDialog( activity.config.lastExportPath = file.absolutePath.getParentPath() val selectedSources = (view.export_contacts_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources() val ignoredSources = contactSources - .filter { !selectedSources.map { source -> source.contactSource }.contains(it) } + .filter { !selectedSources.contains(it) } .map { it.getFullIdentifier() } .toHashSet() callback(file, ignoredSources) @@ -103,14 +103,17 @@ class ExportContactsDialog( return } - val adapterData = ArrayList() + val contactSourcesWithCount = ArrayList() for (source in contactSources) { val count = contacts.filter { it.source == source.name }.count() - adapterData.add(FilterContactSourcesAdapter.ContactSourceModel(source, count)) + contactSourcesWithCount.add(source.copy(count = count)) } + contactSources.clear() + contactSources.addAll(contactSourcesWithCount) + activity.runOnUiThread { - view.export_contacts_list.adapter = FilterContactSourcesAdapter(activity, adapterData, activity.getVisibleContactSources()) + view.export_contacts_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, activity.getVisibleContactSources()) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt index 71465224..ef07f938 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt @@ -5,7 +5,6 @@ import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.FilterContactSourcesAdapter -import com.simplemobiletools.contacts.pro.adapters.FilterContactSourcesAdapter.ContactSourceModel import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources import com.simplemobiletools.contacts.pro.helpers.ContactsHelper @@ -41,15 +40,18 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb return } - val adapterData = ArrayList() - for (source in contactSources) { - val count = contacts.filter { it.source == source.name }.count() - adapterData.add(ContactSourceModel(source, count)) + val contactSourcesWithCount = ArrayList() + for (contactSource in contactSources) { + val count = contacts.filter { it.source == contactSource.name }.count() + contactSourcesWithCount.add(contactSource.copy(count = count)) } + contactSources.clear() + contactSources.addAll(contactSourcesWithCount) + val selectedSources = activity.getVisibleContactSources() activity.runOnUiThread { - view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, adapterData, selectedSources) + view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedSources) dialog = AlertDialog.Builder(activity) .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() } @@ -62,11 +64,9 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb private fun confirmContactSources() { val selectedContactSources = (view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources() - val ignoredContactSources = contactSources - .filter { !selectedContactSources.map { it.contactSource }.contains(it) } - .map { - if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.getFullIdentifier() - }.toHashSet() + val ignoredContactSources = contactSources.filter { !selectedContactSources.contains(it) }.map { + if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.getFullIdentifier() + }.toHashSet() if (activity.getVisibleContactSources() != ignoredContactSources) { activity.config.ignoredContactSources = ignoredContactSources diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/ContactSource.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/ContactSource.kt index a5f55e30..d9976154 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/ContactSource.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/ContactSource.kt @@ -2,7 +2,7 @@ package com.simplemobiletools.contacts.pro.models import com.simplemobiletools.contacts.pro.helpers.SMT_PRIVATE -data class ContactSource(var name: String, var type: String, var publicName: String) { +data class ContactSource(var name: String, var type: String, var publicName: String, var count: Int = 0) { fun getFullIdentifier(): String { return if (type == SMT_PRIVATE) { type From 3ceb83b355b4e53291fe87f162bd77185e0a1615 Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Thu, 5 May 2022 13:57:15 +0300 Subject: [PATCH 3/7] fetch data after dialog is shown --- .../pro/dialogs/FilterContactSourcesDialog.kt | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt index ef07f938..11a802c7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt @@ -22,17 +22,24 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb private var isContactsReady = false init { - ContactsHelper(activity).getContactSources { contactSources -> - contactSources.mapTo(this.contactSources) { it.copy() } - isContactSourcesReady = true - processDataIfReady() - } + dialog = AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() } + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this) { + ContactsHelper(activity).getContactSources { contactSources -> + contactSources.mapTo(this@FilterContactSourcesDialog.contactSources) { it.copy() } + isContactSourcesReady = true + processDataIfReady() + } - ContactsHelper(activity).getContacts(getAll = true) { contacts -> - contacts.mapTo(this.contacts) { it.copy() } - isContactsReady = true - processDataIfReady() - } + ContactsHelper(activity).getContacts(getAll = true) { contacts -> + contacts.mapTo(this@FilterContactSourcesDialog.contacts) { it.copy() } + isContactsReady = true + processDataIfReady() + } + } + } } private fun processDataIfReady() { @@ -49,16 +56,9 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb contactSources.clear() contactSources.addAll(contactSourcesWithCount) - val selectedSources = activity.getVisibleContactSources() activity.runOnUiThread { + val selectedSources = activity.getVisibleContactSources() view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedSources) - - dialog = AlertDialog.Builder(activity) - .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() } - .setNegativeButton(R.string.cancel, null) - .create().apply { - activity.setupDialogStuff(view, this) - } } } From ec90f2d41faa3cbe7104fe1d83294c0404f09a81 Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Fri, 6 May 2022 11:32:55 +0300 Subject: [PATCH 4/7] add the contact count dynamically --- .../pro/dialogs/FilterContactSourcesDialog.kt | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt index 11a802c7..ec2008cb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt @@ -22,28 +22,21 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb private var isContactsReady = false init { - dialog = AlertDialog.Builder(activity) - .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() } - .setNegativeButton(R.string.cancel, null) - .create().apply { - activity.setupDialogStuff(view, this) { - ContactsHelper(activity).getContactSources { contactSources -> - contactSources.mapTo(this@FilterContactSourcesDialog.contactSources) { it.copy() } - isContactSourcesReady = true - processDataIfReady() - } + ContactsHelper(activity).getContactSources { contactSources -> + contactSources.mapTo(this@FilterContactSourcesDialog.contactSources) { it.copy() } + isContactSourcesReady = true + processDataIfReady() + } - ContactsHelper(activity).getContacts(getAll = true) { contacts -> - contacts.mapTo(this@FilterContactSourcesDialog.contacts) { it.copy() } - isContactsReady = true - processDataIfReady() - } - } - } + ContactsHelper(activity).getContacts(getAll = true) { contacts -> + contacts.mapTo(this@FilterContactSourcesDialog.contacts) { it.copy() } + isContactsReady = true + processDataIfReady() + } } private fun processDataIfReady() { - if (!isContactSourcesReady || !isContactsReady) { + if (!isContactSourcesReady) { return } @@ -59,6 +52,15 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb activity.runOnUiThread { val selectedSources = activity.getVisibleContactSources() view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedSources) + + if (dialog == null) { + dialog = AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() } + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this) + } + } } } From 7f382311eaa7f2c31f6f7f059eb573a2b0f962d9 Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Wed, 11 May 2022 14:27:14 +0300 Subject: [PATCH 5/7] replace (0) with not showing anything --- .../contacts/pro/adapters/FilterContactSourcesAdapter.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt index 868d83ef..f35f41e0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt @@ -62,7 +62,8 @@ class FilterContactSourcesAdapter( itemView.apply { filter_contact_source_checkbox.isChecked = isSelected filter_contact_source_checkbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) - val displayName = "${contactSource.publicName} (${contactSource.count})" + val countText = if (contactSource.count > 0) "(${contactSource.count})" else "" + val displayName = "${contactSource.publicName} $countText" filter_contact_source_checkbox.text = displayName filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) } } From bdb9fd47b876d528b09b414356f11e2023917bf8 Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Wed, 11 May 2022 21:03:32 +0300 Subject: [PATCH 6/7] space correction --- .../contacts/pro/adapters/FilterContactSourcesAdapter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt index f35f41e0..cc05d490 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt @@ -62,8 +62,8 @@ class FilterContactSourcesAdapter( itemView.apply { filter_contact_source_checkbox.isChecked = isSelected filter_contact_source_checkbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) - val countText = if (contactSource.count > 0) "(${contactSource.count})" else "" - val displayName = "${contactSource.publicName} $countText" + val countText = if (contactSource.count > 0) " (${contactSource.count})" else "" + val displayName = "${contactSource.publicName}$countText" filter_contact_source_checkbox.text = displayName filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) } } From dcac05922ab9379b8fb1c8da5d302404453e2593 Mon Sep 17 00:00:00 2001 From: Pavel Poley Date: Thu, 12 May 2022 11:37:37 +0300 Subject: [PATCH 7/7] hide the value only if we have no data yet --- .../contacts/pro/adapters/FilterContactSourcesAdapter.kt | 2 +- .../contacts/pro/dialogs/FilterContactSourcesDialog.kt | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt index cc05d490..c96c373e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/FilterContactSourcesAdapter.kt @@ -62,7 +62,7 @@ class FilterContactSourcesAdapter( itemView.apply { filter_contact_source_checkbox.isChecked = isSelected filter_contact_source_checkbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) - val countText = if (contactSource.count > 0) " (${contactSource.count})" else "" + val countText = if (contactSource.count >= 0) " (${contactSource.count})" else "" val displayName = "${contactSource.publicName}$countText" filter_contact_source_checkbox.text = displayName filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt index ec2008cb..6c2351fc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/FilterContactSourcesDialog.kt @@ -42,7 +42,11 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb val contactSourcesWithCount = ArrayList() for (contactSource in contactSources) { - val count = contacts.filter { it.source == contactSource.name }.count() + val count = if (isContactsReady) { + contacts.filter { it.source == contactSource.name }.count() + } else { + -1 + } contactSourcesWithCount.add(contactSource.copy(count = count)) }