diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index d7f3df30..b7735d19 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -130,10 +130,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { initFragments() } - contacts_fragment?.refreshContacts() contacts_fragment?.onActivityResume() - favorites_fragment?.refreshContacts() favorites_fragment?.onActivityResume() + refreshContacts(true, true) } if (hasPermission(PERMISSION_WRITE_CONTACTS)) { @@ -267,7 +266,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private fun getInactiveTabIndexes(activeIndex: Int) = arrayListOf(0, 1, 2).filter { it != activeIndex } private fun initFragments() { - viewpager.adapter = ViewPagerAdapter(this) viewpager.offscreenPageLimit = 2 viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { @@ -288,6 +286,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } }) viewpager.currentItem = config.lastUsedViewPagerPage + refreshContacts(true, true) main_tabs_holder.onTabSelectionChanged( tabUnselectedAction = { @@ -306,15 +305,14 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private fun showSortingDialog() { ChangeSortingDialog(this) { - contacts_fragment?.refreshContacts() - favorites_fragment?.refreshContacts() + refreshContacts(true, true) } } fun showFilterDialog() { FilterContactSourcesDialog(this) { contacts_fragment?.forceListRedraw = true - contacts_fragment?.refreshContacts() + refreshContacts(true, false) } } @@ -336,7 +334,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { ImportContactsDialog(this, path) { if (it) { runOnUiThread { - refreshContacts() + refreshContacts(true, true) } } } @@ -399,13 +397,32 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { BuildConfig.VERSION_NAME, faqItems) } - override fun refreshContacts() { - contacts_fragment.refreshContacts() - favorites_fragment.refreshContacts() + override fun refreshContacts(refreshContactsTab: Boolean, refreshFavoritesTab: Boolean) { + if (isActivityDestroyed()) { + return + } + + ContactsHelper(this).getContacts { + if (isActivityDestroyed()) { + return@getContacts + } + + if (viewpager.adapter == null) { + viewpager.adapter = ViewPagerAdapter(this, it) + } + + if (refreshContactsTab) { + contacts_fragment?.refreshContacts(it) + } + + if (refreshFavoritesTab) { + favorites_fragment?.refreshContacts(it) + } + } } override fun refreshFavorites() { - favorites_fragment?.refreshContacts() + refreshContacts(false, true) } private fun checkWhatsNewDialog() { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 7b704bb6..95a04a55 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -130,7 +130,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList) : PagerAdapter() { override fun instantiateItem(container: ViewGroup, position: Int): Any { val layout = getFragment(position) val view = activity.layoutInflater.inflate(layout, container, false) container.addView(view) - (view as? MyViewPagerFragment)?.setupFragment(activity) + (view as FragmentInterface).apply { + setupFragment(activity) + refreshContacts(contacts) + } return view } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt index f4881002..104eaa41 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt @@ -16,7 +16,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa private fun showAddFavoritesDialog() { AddFavoritesDialog(activity!!) { - refreshContacts() + activity!!.refreshContacts(false, true) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt index 49103e3f..e52fe7e7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/GroupsFragment.kt @@ -5,6 +5,7 @@ import android.support.design.widget.CoordinatorLayout import android.util.AttributeSet import com.simplemobiletools.contacts.activities.MainActivity import com.simplemobiletools.contacts.interfaces.FragmentInterface +import com.simplemobiletools.contacts.models.Contact class GroupsFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet), FragmentInterface { override fun setupFragment(activity: MainActivity) { @@ -16,6 +17,6 @@ class GroupsFragment(context: Context, attributeSet: AttributeSet) : Coordinator override fun primaryColorChanged(color: Int) { } - override fun refreshContacts() { + override fun refreshContacts(contacts: ArrayList) { } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index 5f34a546..e273e94c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -15,7 +15,10 @@ import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.editContact import com.simplemobiletools.contacts.extensions.tryStartCall import com.simplemobiletools.contacts.extensions.viewContact -import com.simplemobiletools.contacts.helpers.* +import com.simplemobiletools.contacts.helpers.Config +import com.simplemobiletools.contacts.helpers.ON_CLICK_CALL_CONTACT +import com.simplemobiletools.contacts.helpers.ON_CLICK_EDIT_CONTACT +import com.simplemobiletools.contacts.helpers.ON_CLICK_VIEW_CONTACT import com.simplemobiletools.contacts.interfaces.FragmentInterface import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.fragment_layout.view.* @@ -48,8 +51,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) fragment_placeholder_2.text = activity.getString(R.string.add_favorites) } } - - refreshContacts() } override fun textColorChanged(color: Int) { @@ -67,45 +68,34 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) fun startNameWithSurnameChanged(startNameWithSurname: Boolean) { (fragment_list.adapter as ContactsAdapter).apply { config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME - refreshContacts() + this@MyViewPagerFragment.activity!!.refreshContacts(true, true) } } - override fun refreshContacts() { - if (activity == null || activity!!.isActivityDestroyed()) { - return + override fun refreshContacts(contacts: ArrayList) { + if (config.lastUsedContactSource.isEmpty()) { + val grouped = contacts.groupBy { it.source }.maxWith(compareBy { it.value.size }) + config.lastUsedContactSource = grouped?.key ?: "" } - ContactsHelper(activity!!).getContacts { - var contacts = it - if (activity == null || activity!!.isActivityDestroyed()) { - return@getContacts - } - - if (config.lastUsedContactSource.isEmpty()) { - val grouped = contacts.groupBy { it.source }.maxWith(compareBy { it.value.size }) - config.lastUsedContactSource = grouped?.key ?: "" - } - - contacts = if (this is FavoritesFragment) { - contacts.filter { it.starred == 1 } as ArrayList + val filtered = if (this is FavoritesFragment) { + contacts.filter { it.starred == 1 } as ArrayList + } else { + val contactSources = config.displayContactSources + if (config.showAllContacts()) { + contacts } else { - val contactSources = config.displayContactSources - if (config.showAllContacts()) { - contacts - } else { - contacts.filter { contactSources.contains(it.source) } as ArrayList - } + contacts.filter { contactSources.contains(it.source) } as ArrayList } + } - Contact.sorting = config.sorting - contacts.sort() + Contact.sorting = config.sorting + filtered.sort() - if (contacts.hashCode() != lastHashCode) { - lastHashCode = contacts.hashCode() - activity!!.runOnUiThread { - setupContacts(contacts) - } + if (filtered.hashCode() != lastHashCode) { + lastHashCode = filtered.hashCode() + activity?.runOnUiThread { + setupContacts(filtered) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index dd0abc9c..ee8c0980 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -116,7 +116,9 @@ class ContactsHelper(val activity: BaseSimpleActivity) { var resultContacts = ArrayList(contactsSize) (0 until contactsSize).mapTo(resultContacts) { contacts.valueAt(it) } resultContacts = resultContacts.distinctBy { it.contactId } as ArrayList - callback(resultContacts) + activity.runOnUiThread { + callback(resultContacts) + } }.start() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt index e4a1c2d3..0f49e205 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/FragmentInterface.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.contacts.interfaces import com.simplemobiletools.contacts.activities.MainActivity +import com.simplemobiletools.contacts.models.Contact interface FragmentInterface { fun setupFragment(activity: MainActivity) @@ -9,5 +10,5 @@ interface FragmentInterface { fun primaryColorChanged(color: Int) - fun refreshContacts() + fun refreshContacts(contacts: ArrayList) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RefreshContactsListener.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RefreshContactsListener.kt index 3d0c687b..7819aa1f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RefreshContactsListener.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/interfaces/RefreshContactsListener.kt @@ -1,7 +1,7 @@ package com.simplemobiletools.contacts.interfaces interface RefreshContactsListener { - fun refreshContacts() + fun refreshContacts(refreshContactsTab: Boolean, refreshFavoritesTab: Boolean) fun refreshFavorites() }