From ffd89252c7388ffd53034c40545a25ee698ad989 Mon Sep 17 00:00:00 2001 From: merkost Date: Fri, 14 Jul 2023 13:22:20 +1000 Subject: [PATCH 01/21] Small improvement --- .../simplemobiletools/contacts/pro/activities/MainActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index a9967a16..26dc7995 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -172,9 +172,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { super.onActivityResult(requestCode, resultCode, resultData) - if (requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + if (requestCode == PICK_IMPORT_SOURCE_INTENT && resultCode == Activity.RESULT_OK && resultData?.data != null) { tryImportContactsFromFile(resultData.data!!) - } else if (requestCode == PICK_EXPORT_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) { + } else if (requestCode == PICK_EXPORT_FILE_INTENT && resultCode == Activity.RESULT_OK && resultData?.data != null) { try { val outputStream = contentResolver.openOutputStream(resultData.data!!) exportContactsTo(ignoredExportContactSources, outputStream) From ce337a31f57ed0b2f06c7645994fe1fb030a5b1f Mon Sep 17 00:00:00 2001 From: merkost Date: Mon, 17 Jul 2023 15:13:41 +1000 Subject: [PATCH 02/21] Contacts favorites grid implemented --- .../pro/activities/GroupContactsActivity.kt | 15 ++- .../contacts/pro/activities/MainActivity.kt | 9 ++ .../contacts/pro/adapters/ContactsAdapter.kt | 58 +++++++++-- .../pro/fragments/ContactsFragment.kt | 44 +++++++++ .../pro/fragments/FavoritesFragment.kt | 93 ++++++++++++++++++ .../pro/fragments/MyViewPagerFragment.kt | 98 ++++++------------- app/src/main/res/menu/menu.xml | 4 + 7 files changed, 240 insertions(+), 81 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt index 55618e44..5473a1cd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt @@ -10,16 +10,18 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.NavigationIcon import com.simplemobiletools.commons.helpers.ensureBackgroundThread +import com.simplemobiletools.commons.models.contacts.Contact +import com.simplemobiletools.commons.models.contacts.Group import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter import com.simplemobiletools.contacts.pro.dialogs.SelectContactsDialog -import com.simplemobiletools.contacts.pro.extensions.* +import com.simplemobiletools.contacts.pro.extensions.handleGenericContactClick import com.simplemobiletools.contacts.pro.helpers.GROUP import com.simplemobiletools.contacts.pro.helpers.LOCATION_GROUP_CONTACTS import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.pro.interfaces.RemoveFromGroupListener -import com.simplemobiletools.commons.models.contacts.* import kotlinx.android.synthetic.main.activity_group_contacts.* +import kotlinx.android.synthetic.main.fragment_layout.fragment_list class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, RefreshContactsListener { private var allContacts = ArrayList() @@ -146,7 +148,14 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh private fun updateContacts(contacts: ArrayList) { val currAdapter = group_contacts_list.adapter if (currAdapter == null) { - ContactsAdapter(this, contacts, this, LOCATION_GROUP_CONTACTS, this, group_contacts_list) { + ContactsAdapter( + this, + contactItems = contacts, + recyclerView = fragment_list, + location = LOCATION_GROUP_CONTACTS, + removeListener = this, + refreshListener = this + ) { contactClicked(it as Contact) }.apply { group_contacts_list.adapter = this diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index 26dc7995..e765d7ce 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -15,6 +15,7 @@ import android.widget.TextView import android.widget.Toast import androidx.viewpager.widget.ViewPager import com.simplemobiletools.commons.databases.ContactsDatabase +import com.simplemobiletools.commons.dialogs.ChangeViewTypeDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog import com.simplemobiletools.commons.extensions.* @@ -198,6 +199,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { findItem(R.id.sort).isVisible = currentFragment != groups_fragment findItem(R.id.filter).isVisible = currentFragment != groups_fragment findItem(R.id.dialpad).isVisible = !config.showDialpadButton + findItem(R.id.change_view_type).isVisible = currentFragment == favorites_fragment findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations) } } @@ -225,6 +227,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { R.id.import_contacts -> tryImportContacts() R.id.export_contacts -> tryExportContacts() R.id.more_apps_from_us -> launchMoreAppsFromUsIntent() + R.id.change_view_type -> changeViewType() R.id.settings -> launchSettings() R.id.about -> launchAbout() else -> return@setOnMenuItemClickListener false @@ -661,4 +664,10 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { checkWhatsNew(this, BuildConfig.VERSION_CODE) } } + + private fun changeViewType() { + ChangeViewTypeDialog(this) { + favorites_fragment?.updateFavoritesColumnCount() + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index b001c1f6..dbf74a56 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -16,6 +16,7 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide @@ -46,15 +47,17 @@ import java.util.* class ContactsAdapter( activity: SimpleActivity, - var contactItems: ArrayList, + var contactItems: MutableList, + recyclerView: MyRecyclerView, + highlightText: String = "", + var viewType: Int = VIEW_TYPE_LIST, private val refreshListener: RefreshContactsListener?, private val location: Int, private val removeListener: RemoveFromGroupListener?, - recyclerView: MyRecyclerView, - highlightText: String = "", private val enableDrag: Boolean = false, itemClick: (Any) -> Unit -) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate, ItemTouchHelperContract { +) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate, ItemTouchHelperContract, + MyRecyclerView.MyZoomListener { private val NEW_GROUP_ID = -1 @@ -66,13 +69,16 @@ class ContactsAdapter( var showPhoneNumbers = config.showPhoneNumbers var fontSize = activity.getTextSize() var onDragEndListener: (() -> Unit)? = null + var onColumnCountListener: (Int) -> Unit = {} - private val itemLayout = if (showPhoneNumbers) R.layout.item_contact_with_number else R.layout.item_contact_without_number private var touchHelper: ItemTouchHelper? = null private var startReorderDragListener: StartReorderDragListener? = null init { setupDragListener(true) + if (recyclerView.layoutManager is GridLayoutManager) { + setupZoomListener(this) + } if (enableDrag) { touchHelper = ItemTouchHelper(ItemMoveCallback(this)) @@ -143,7 +149,21 @@ class ContactsAdapter( notifyDataSetChanged() } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(itemLayout, parent) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val layout = when (viewType) { + VIEW_TYPE_GRID -> { + if (showPhoneNumbers) R.layout.item_contact_with_number_grid else R.layout.item_contact_without_number_grid + } + else -> { + if (showPhoneNumbers) R.layout.item_contact_with_number else R.layout.item_contact_without_number + } + } + return createViewHolder(layout, parent) + } + + override fun getItemViewType(position: Int): Int { + return viewType + } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val contact = contactItems[position] @@ -158,9 +178,9 @@ class ContactsAdapter( private fun getItemWithKey(key: Int): Contact? = contactItems.firstOrNull { it.id == key } - fun updateItems(newItems: ArrayList, highlightText: String = "") { + fun updateItems(newItems: List, highlightText: String = "") { if (newItems.hashCode() != contactItems.hashCode()) { - contactItems = newItems.clone() as ArrayList + contactItems = newItems.toMutableList() textToHighlight = highlightText notifyDataSetChanged() finishActMode() @@ -471,4 +491,26 @@ class ContactsAdapter( override fun onRowClear(myViewHolder: ViewHolder?) { onDragEndListener?.invoke() } + + override fun zoomIn() { + val layoutManager = recyclerView.layoutManager + if (layoutManager is GridLayoutManager) { + val currentSpanCount = layoutManager.spanCount + val newSpanCount = (currentSpanCount - 1).coerceIn(CONTACTS_GRID_MIN_COLUMNS_COUNT, CONTACTS_GRID_MAX_COLUMNS_COUNT) + layoutManager.spanCount = newSpanCount + recyclerView.requestLayout() + onColumnCountListener(newSpanCount) + } + } + + override fun zoomOut() { + val layoutManager = recyclerView.layoutManager + if (layoutManager is GridLayoutManager) { + val currentSpanCount = layoutManager.spanCount + val newSpanCount = (currentSpanCount + 1).coerceIn(CONTACTS_GRID_MIN_COLUMNS_COUNT, CONTACTS_GRID_MAX_COLUMNS_COUNT) + layoutManager.spanCount = newSpanCount + recyclerView.requestLayout() + onColumnCountListener(newSpanCount) + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt index d3a89d86..90201acf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt @@ -3,10 +3,19 @@ package com.simplemobiletools.contacts.pro.fragments import android.content.Context import android.content.Intent import android.util.AttributeSet +import com.simplemobiletools.commons.extensions.areSystemAnimationsEnabled import com.simplemobiletools.commons.extensions.hideKeyboard +import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.contacts.pro.activities.EditContactActivity import com.simplemobiletools.contacts.pro.activities.InsertOrEditContactActivity import com.simplemobiletools.contacts.pro.activities.MainActivity +import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter +import com.simplemobiletools.contacts.pro.extensions.config +import com.simplemobiletools.contacts.pro.helpers.LOCATION_CONTACTS_TAB +import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener +import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list +import java.util.ArrayList class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { override fun fabClicked() { @@ -23,4 +32,39 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag (activity as InsertOrEditContactActivity).showFilterDialog() } } + + fun setupContactsAdapter(contacts: List) { + setupViewVisibility(contacts.isNotEmpty()) + val currAdapter = fragment_list.adapter + + if (currAdapter == null || forceListRedraw) { + forceListRedraw = false + val location = LOCATION_CONTACTS_TAB + + ContactsAdapter( + activity = activity as SimpleActivity, + contactItems = contacts.toMutableList(), + refreshListener = activity as RefreshContactsListener, + location = location, + removeListener = null, + recyclerView = fragment_list, + enableDrag = false, + ) { + (activity as RefreshContactsListener).contactClicked(it as Contact) + }.apply { + fragment_list.adapter = this + } + + if (context.areSystemAnimationsEnabled) { + fragment_list.scheduleLayoutAnimation() + } + } else { + (currAdapter as ContactsAdapter).apply { + startNameWithSurname = context.config.startNameWithSurname + showPhoneNumbers = context.config.showPhoneNumbers + showContactThumbnails = context.config.showContactThumbnails + updateItems(contacts) + } + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt index c3afa1be..1ee69b67 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt @@ -2,11 +2,26 @@ package com.simplemobiletools.contacts.pro.fragments import android.content.Context import android.util.AttributeSet +import com.google.gson.Gson +import com.simplemobiletools.commons.extensions.areSystemAnimationsEnabled +import com.simplemobiletools.commons.extensions.beGone +import com.simplemobiletools.commons.extensions.beVisible import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.TAB_FAVORITES +import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID +import com.simplemobiletools.commons.models.contacts.Contact +import com.simplemobiletools.commons.views.MyGridLayoutManager +import com.simplemobiletools.commons.views.MyLinearLayoutManager import com.simplemobiletools.contacts.pro.activities.MainActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter import com.simplemobiletools.contacts.pro.dialogs.SelectContactsDialog +import com.simplemobiletools.contacts.pro.extensions.config +import com.simplemobiletools.contacts.pro.helpers.LOCATION_FAVORITES_TAB +import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener +import kotlinx.android.synthetic.main.dialog_select_contact.view.letter_fastscroller +import kotlinx.android.synthetic.main.fragment_favorites.view.favorites_fragment +import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { override fun fabClicked() { @@ -28,4 +43,82 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa (activity as? MainActivity)?.refreshContacts(TAB_FAVORITES) } } + + fun setupContactsFavoritesAdapter(contacts: ArrayList) { + setupViewVisibility(contacts.isNotEmpty()) + val currAdapter = fragment_list.adapter + + val viewType = context.config.viewType + setFavoritesViewType(viewType) + + if (currAdapter == null || forceListRedraw) { + forceListRedraw = false + val location = LOCATION_FAVORITES_TAB + + ContactsAdapter( + activity = activity as SimpleActivity, + contactItems = contacts, + refreshListener = activity as RefreshContactsListener, + location = location, + viewType = viewType, + removeListener = null, + recyclerView = fragment_list, + enableDrag = true, + ) { + (activity as RefreshContactsListener).contactClicked(it as Contact) + }.apply { + fragment_list.adapter = this + onDragEndListener = { + val adapter = fragment_list?.adapter + if (adapter is ContactsAdapter) { + val items = adapter.contactItems + saveCustomOrderToPrefs(items) + setupLetterFastscroller(items) + } + } + + onColumnCountListener = { newColumnCount -> + context.config.contactsGridColumnCnt = newColumnCount + } + } + + if (context.areSystemAnimationsEnabled) { + fragment_list.scheduleLayoutAnimation() + } + } else { + (currAdapter as ContactsAdapter).apply { + startNameWithSurname = context.config.startNameWithSurname + showPhoneNumbers = context.config.showPhoneNumbers + showContactThumbnails = context.config.showContactThumbnails + this.viewType = viewType + updateItems(contacts) + } + } + } + + private fun setFavoritesViewType(viewType: Int) { + val spanCount = context.config.contactsGridColumnCnt + + val layoutManager = if (viewType == VIEW_TYPE_GRID) { + favorites_fragment.letter_fastscroller.beGone() + MyGridLayoutManager(context, spanCount) + } else { + favorites_fragment.letter_fastscroller.beVisible() + MyLinearLayoutManager(context) + } + fragment_list.layoutManager = layoutManager + } + + fun updateFavoritesColumnCount() { + setupContactsFavoritesAdapter(allContacts) + } + + private fun saveCustomOrderToPrefs(items: List) { + activity?.apply { + val orderIds = items.map { it.id } + val orderGsonString = Gson().toJson(orderIds) + config.favoritesContactsOrder = orderGsonString + } + } + } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt index c286de85..36dbcb54 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt @@ -21,7 +21,12 @@ import com.simplemobiletools.commons.helpers.Converters import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener import com.simplemobiletools.commons.models.contacts.* +import com.simplemobiletools.commons.views.MyGridLayoutManager +import com.simplemobiletools.commons.views.MyLinearLayoutManager import com.simplemobiletools.contacts.pro.extensions.config +import kotlinx.android.synthetic.main.dialog_select_contact.view.letter_fastscroller +import kotlinx.android.synthetic.main.fragment_contacts.view.contacts_fragment +import kotlinx.android.synthetic.main.fragment_favorites.view.favorites_fragment import kotlinx.android.synthetic.main.fragment_layout.view.* import kotlinx.android.synthetic.main.fragment_layout.view.fragment_fab import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list @@ -30,14 +35,15 @@ import kotlinx.android.synthetic.main.fragment_layout.view.fragment_placeholder_ import kotlinx.android.synthetic.main.fragment_layout.view.fragment_wrapper import kotlinx.android.synthetic.main.fragment_letters_layout.view.* import java.util.* +import kotlin.collections.ArrayList abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet) { protected var activity: SimpleActivity? = null protected var allContacts = ArrayList() private var lastHashCode = 0 - private var contactsIgnoringSearch = ArrayList() - private var groupsIgnoringSearch = ArrayList() + private var contactsIgnoringSearch = listOf() + private var groupsIgnoringSearch = listOf() private lateinit var config: Config var skipHashComparing = false @@ -172,15 +178,24 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } private fun setupContacts(contacts: ArrayList) { - if (this is GroupsFragment) { - setupGroupsAdapter(contacts) { - groupsIgnoringSearch = (fragment_list?.adapter as? GroupsAdapter)?.groups ?: ArrayList() + when (this) { + is GroupsFragment -> { + setupGroupsAdapter(contacts) { + groupsIgnoringSearch = (fragment_list?.adapter as? GroupsAdapter)?.groups ?: ArrayList() + } + } + is FavoritesFragment -> { + favorites_fragment.setupContactsFavoritesAdapter(contacts) + contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: listOf() + setupLetterFastscroller(contacts) + letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) + } + else -> { + contacts_fragment.setupContactsAdapter(contacts) + contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: ArrayList() + setupLetterFastscroller(contacts) + letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) } - } else { - setupContactsFavoritesAdapter(contacts) - contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: ArrayList() - setupLetterFastscroller(contacts) - letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) } } @@ -227,63 +242,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - private fun setupContactsFavoritesAdapter(contacts: ArrayList) { - setupViewVisibility(contacts.isNotEmpty()) - val currAdapter = fragment_list.adapter - if (currAdapter == null || forceListRedraw) { - forceListRedraw = false - val location = when { - activity is InsertOrEditContactActivity -> LOCATION_INSERT_OR_EDIT - this is FavoritesFragment -> LOCATION_FAVORITES_TAB - else -> LOCATION_CONTACTS_TAB - } - - val enableDragReorder = this is FavoritesFragment - ContactsAdapter( - activity = activity as SimpleActivity, - contactItems = contacts, - refreshListener = activity as RefreshContactsListener, - location = location, - removeListener = null, - recyclerView = fragment_list, - enableDrag = enableDragReorder, - ) { - (activity as RefreshContactsListener).contactClicked(it as Contact) - }.apply { - fragment_list.adapter = this - if (enableDragReorder) { - onDragEndListener = { - val adapter = fragment_list?.adapter - if (adapter is ContactsAdapter) { - val items = adapter.contactItems - saveCustomOrderToPrefs(items) - setupLetterFastscroller(items) - } - } - } - } - - if (context.areSystemAnimationsEnabled) { - fragment_list.scheduleLayoutAnimation() - } - } else { - (currAdapter as ContactsAdapter).apply { - startNameWithSurname = config.startNameWithSurname - showPhoneNumbers = config.showPhoneNumbers - showContactThumbnails = config.showContactThumbnails - updateItems(contacts) - } - } - } - - private fun saveCustomOrderToPrefs(items: ArrayList) { - activity?.apply { - val orderIds = items.map { it.id } - val orderGsonString = Gson().toJson(orderIds) - config.favoritesContactsOrder = orderGsonString - } - } - fun showContactThumbnailsChanged(showThumbnails: Boolean) { if (this is GroupsFragment) { (fragment_list.adapter as? GroupsAdapter)?.apply { @@ -298,7 +256,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - private fun setupLetterFastscroller(contacts: ArrayList) { + fun setupLetterFastscroller(contacts: List) { val sorting = context.config.sorting letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> try { @@ -396,7 +354,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) setupLetterFastscroller(contactsIgnoringSearch) setupViewVisibility(contactsIgnoringSearch.isNotEmpty()) } else if (fragment_list.adapter is GroupsAdapter) { - (fragment_list.adapter as? GroupsAdapter)?.updateItems(groupsIgnoringSearch) + (fragment_list.adapter as? GroupsAdapter)?.updateItems(ArrayList(groupsIgnoringSearch)) setupViewVisibility(groupsIgnoringSearch.isNotEmpty()) } @@ -405,7 +363,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - private fun setupViewVisibility(hasItemsToShow: Boolean) { + fun setupViewVisibility(hasItemsToShow: Boolean) { if (fragment_placeholder_2.tag != AVOID_CHANGING_VISIBILITY_TAG) { fragment_placeholder_2?.beVisibleIf(!hasItemsToShow) } diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index 9bc767d7..8d174987 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -18,6 +18,10 @@ android:icon="@drawable/ic_dialpad_vector" android:title="@string/dialpad" app:showAsAction="ifRoom" /> + Date: Mon, 17 Jul 2023 15:14:01 +1000 Subject: [PATCH 03/21] list import removed --- .../simplemobiletools/contacts/pro/fragments/ContactsFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt index 90201acf..f8b0555f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/ContactsFragment.kt @@ -15,7 +15,6 @@ import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.helpers.LOCATION_CONTACTS_TAB import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list -import java.util.ArrayList class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { override fun fabClicked() { From e98f61098532a254e650c29fc768ac25372b0379 Mon Sep 17 00:00:00 2001 From: merkost Date: Tue, 18 Jul 2023 12:08:54 +1000 Subject: [PATCH 04/21] Small gradle improvement --- app/build.gradle | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ddec97b4..e88f0c67 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,9 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' -apply plugin: 'kotlin-kapt' +plugins { + id 'com.android.application' + id 'kotlin-android' + id 'kotlin-android-extensions' + id 'kotlin-kapt' +} def keystorePropertiesFile = rootProject.file("keystore.properties") def keystoreProperties = new Properties() From 4052f768a7b4acdcb5c9556e18bfbc9e016ec740 Mon Sep 17 00:00:00 2001 From: merkost Date: Tue, 18 Jul 2023 17:58:55 +1000 Subject: [PATCH 05/21] Updated icon for change view menu item --- app/src/main/res/menu/menu.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index 8d174987..29d3bb09 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -20,8 +20,9 @@ app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> Date: Wed, 19 Jul 2023 10:56:10 +1000 Subject: [PATCH 06/21] Commons updated --- .../contacts/pro/fragments/FavoritesFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt index 1ee69b67..d0ea7578 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt @@ -78,7 +78,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } onColumnCountListener = { newColumnCount -> - context.config.contactsGridColumnCnt = newColumnCount + context.config.contactsGridColumnCount = newColumnCount } } @@ -97,7 +97,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } private fun setFavoritesViewType(viewType: Int) { - val spanCount = context.config.contactsGridColumnCnt + val spanCount = context.config.contactsGridColumnCount val layoutManager = if (viewType == VIEW_TYPE_GRID) { favorites_fragment.letter_fastscroller.beGone() From cf338254bb0c8176aefe4d7685f86cf2a09ab205 Mon Sep 17 00:00:00 2001 From: merkost Date: Wed, 19 Jul 2023 11:02:53 +1000 Subject: [PATCH 07/21] Added column_count menu item --- .../contacts/pro/activities/MainActivity.kt | 19 +++++++++++++++++++ app/src/main/res/menu/menu.xml | 6 ++++++ 2 files changed, 25 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index e765d7ce..976c58ba 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -18,9 +18,11 @@ import com.simplemobiletools.commons.databases.ContactsDatabase import com.simplemobiletools.commons.dialogs.ChangeViewTypeDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.FilePickerDialog +import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.FAQItem +import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.Release import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.contacts.pro.BuildConfig @@ -200,6 +202,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { findItem(R.id.filter).isVisible = currentFragment != groups_fragment findItem(R.id.dialpad).isVisible = !config.showDialpadButton findItem(R.id.change_view_type).isVisible = currentFragment == favorites_fragment + findItem(R.id.column_count).isVisible = currentFragment == favorites_fragment && config.viewType == VIEW_TYPE_GRID findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations) } } @@ -228,6 +231,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { R.id.export_contacts -> tryExportContacts() R.id.more_apps_from_us -> launchMoreAppsFromUsIntent() R.id.change_view_type -> changeViewType() + R.id.column_count -> changeColumnCount() R.id.settings -> launchSettings() R.id.about -> launchAbout() else -> return@setOnMenuItemClickListener false @@ -236,6 +240,21 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } } + private fun changeColumnCount() { + val items = (CONTACTS_GRID_MIN_COLUMNS_COUNT..CONTACTS_GRID_MAX_COLUMNS_COUNT).map { + RadioItem(it, resources.getQuantityString(R.plurals.column_counts, it, it)) + } + + val currentColumnCount = config.contactsGridColumnCount + RadioGroupDialog(this, ArrayList(items), currentColumnCount) { + val newColumnCount = it as Int + if (currentColumnCount != newColumnCount) { + config.contactsGridColumnCount = newColumnCount + favorites_fragment.updateFavoritesColumnCount() + } + } + } + private fun updateMenuColors() { updateStatusbarColor(getProperBackgroundColor()) main_menu.updateColors() diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index 29d3bb09..8963ed08 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -23,6 +23,12 @@ android:icon="@drawable/ic_change_view_vector" android:title="@string/change_view_type" app:showAsAction="ifRoom" /> + Date: Wed, 19 Jul 2023 16:00:04 +1000 Subject: [PATCH 08/21] Removed double showAsAction setting in menu.xml --- app/src/main/res/menu/menu.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index 8963ed08..0eb8d4bc 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -26,17 +26,14 @@ Date: Wed, 19 Jul 2023 16:18:03 +1000 Subject: [PATCH 09/21] Added refreshing menu items on view type changed --- .../simplemobiletools/contacts/pro/activities/MainActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index 976c58ba..577a97c7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -686,6 +686,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private fun changeViewType() { ChangeViewTypeDialog(this) { + refreshMenuItems() favorites_fragment?.updateFavoritesColumnCount() } } From 8f05285188187b9353eeb981d3706e5a86155c3c Mon Sep 17 00:00:00 2001 From: merkost Date: Wed, 19 Jul 2023 17:01:13 +1000 Subject: [PATCH 10/21] Adapter drag support for grid view type --- .../simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index dbf74a56..874912b5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -81,7 +81,7 @@ class ContactsAdapter( } if (enableDrag) { - touchHelper = ItemTouchHelper(ItemMoveCallback(this)) + touchHelper = ItemTouchHelper(ItemMoveCallback(this, viewType == VIEW_TYPE_GRID)) touchHelper!!.attachToRecyclerView(recyclerView) startReorderDragListener = object : StartReorderDragListener { From 6b33eb68a25653e528bc3dec90deb7bbd9a98800 Mon Sep 17 00:00:00 2001 From: merkost Date: Thu, 20 Jul 2023 11:06:51 +1000 Subject: [PATCH 11/21] Change column count bug fixed --- .../pro/fragments/FavoritesFragment.kt | 6 +- .../pro/fragments/MyViewPagerFragment.kt | 77 +++++++++---------- 2 files changed, 40 insertions(+), 43 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt index d0ea7578..905a466c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt @@ -44,7 +44,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } } - fun setupContactsFavoritesAdapter(contacts: ArrayList) { + fun setupContactsFavoritesAdapter(contacts: List) { setupViewVisibility(contacts.isNotEmpty()) val currAdapter = fragment_list.adapter @@ -57,7 +57,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa ContactsAdapter( activity = activity as SimpleActivity, - contactItems = contacts, + contactItems = contacts.toMutableList(), refreshListener = activity as RefreshContactsListener, location = location, viewType = viewType, @@ -110,7 +110,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } fun updateFavoritesColumnCount() { - setupContactsFavoritesAdapter(allContacts) + setupContactsFavoritesAdapter(favouriteContacts) } private fun saveCustomOrderToPrefs(items: List) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt index 36dbcb54..37e2dbbd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt @@ -5,11 +5,12 @@ import android.content.Intent import android.util.AttributeSet import android.view.ViewGroup import androidx.coordinatorlayout.widget.CoordinatorLayout -import com.google.gson.Gson import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.models.contacts.Contact +import com.simplemobiletools.commons.models.contacts.Group import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.GroupContactsActivity import com.simplemobiletools.contacts.pro.activities.InsertOrEditContactActivity @@ -17,29 +18,23 @@ import com.simplemobiletools.contacts.pro.activities.MainActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter import com.simplemobiletools.contacts.pro.adapters.GroupsAdapter -import com.simplemobiletools.commons.helpers.Converters -import com.simplemobiletools.contacts.pro.helpers.* -import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener -import com.simplemobiletools.commons.models.contacts.* -import com.simplemobiletools.commons.views.MyGridLayoutManager -import com.simplemobiletools.commons.views.MyLinearLayoutManager import com.simplemobiletools.contacts.pro.extensions.config +import com.simplemobiletools.contacts.pro.helpers.AVOID_CHANGING_TEXT_TAG +import com.simplemobiletools.contacts.pro.helpers.AVOID_CHANGING_VISIBILITY_TAG +import com.simplemobiletools.contacts.pro.helpers.Config +import com.simplemobiletools.contacts.pro.helpers.GROUP +import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener import kotlinx.android.synthetic.main.dialog_select_contact.view.letter_fastscroller import kotlinx.android.synthetic.main.fragment_contacts.view.contacts_fragment import kotlinx.android.synthetic.main.fragment_favorites.view.favorites_fragment import kotlinx.android.synthetic.main.fragment_layout.view.* -import kotlinx.android.synthetic.main.fragment_layout.view.fragment_fab -import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list -import kotlinx.android.synthetic.main.fragment_layout.view.fragment_placeholder -import kotlinx.android.synthetic.main.fragment_layout.view.fragment_placeholder_2 -import kotlinx.android.synthetic.main.fragment_layout.view.fragment_wrapper -import kotlinx.android.synthetic.main.fragment_letters_layout.view.* -import java.util.* -import kotlin.collections.ArrayList +import kotlinx.android.synthetic.main.fragment_letters_layout.view.letter_fastscroller_thumb +import java.util.Locale abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet) { protected var activity: SimpleActivity? = null protected var allContacts = ArrayList() + protected var favouriteContacts = listOf() private var lastHashCode = 0 private var contactsIgnoringSearch = listOf() @@ -68,11 +63,13 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) this is ContactsFragment -> { fragment_fab.contentDescription = activity.getString(R.string.create_new_contact) } + this is FavoritesFragment -> { fragment_placeholder.text = activity.getString(R.string.no_favorites) fragment_placeholder_2.text = activity.getString(R.string.add_favorites) fragment_fab.contentDescription = activity.getString(R.string.add_favorites) } + this is GroupsFragment -> { fragment_placeholder.text = activity.getString(R.string.no_group_created) fragment_placeholder_2.text = activity.getString(R.string.create_group) @@ -119,26 +116,21 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } if (config.lastUsedContactSource.isEmpty()) { - val grouped = contacts.asSequence().groupBy { it.source }.maxWithOrNull(compareBy { it.value.size }) + val grouped = contacts.groupBy { it.source }.maxWithOrNull(compareBy { it.value.size }) config.lastUsedContactSource = grouped?.key ?: "" } allContacts = contacts - - val filtered = when { - this is GroupsFragment -> contacts - this is FavoritesFragment -> { - val favorites = contacts.filter { it.starred == 1 } as ArrayList - - if (activity!!.config.isCustomOrderSelected) { - sortByCustomOrder(favorites) - } else { - favorites - } + favouriteContacts = contacts.filter { it.starred == 1 }.sortFavourites(activity!!.config.isCustomOrderSelected) + val filtered = when (this) { + is GroupsFragment -> contacts + is FavoritesFragment -> { + favouriteContacts } + else -> { val contactSources = activity!!.getVisibleContactSources() - contacts.filter { contactSources.contains(it.source) } as ArrayList + contacts.filter { contactSources.contains(it.source) } } } @@ -163,33 +155,38 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - private fun sortByCustomOrder(starred: List): ArrayList { - val favoritesOrder = activity!!.config.favoritesContactsOrder + private fun List.sortFavourites(shouldSort: Boolean = true): List { + return if (shouldSort) { + val favoritesOrder = activity!!.config.favoritesContactsOrder - if (favoritesOrder.isEmpty()) { - return ArrayList(starred) + if (favoritesOrder.isEmpty()) { + return this + } + + val orderList = Converters().jsonToStringList(favoritesOrder) + val map = orderList.withIndex().associate { it.value to it.index } + + return sortedBy { map[it.id.toString()] } + } else { + this } - - val orderList = Converters().jsonToStringList(favoritesOrder) - val map = orderList.withIndex().associate { it.value to it.index } - val sorted = starred.sortedBy { map[it.id.toString()] } - - return ArrayList(sorted) } - private fun setupContacts(contacts: ArrayList) { + private fun setupContacts(contacts: List) { when (this) { is GroupsFragment -> { setupGroupsAdapter(contacts) { groupsIgnoringSearch = (fragment_list?.adapter as? GroupsAdapter)?.groups ?: ArrayList() } } + is FavoritesFragment -> { favorites_fragment.setupContactsFavoritesAdapter(contacts) contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: listOf() setupLetterFastscroller(contacts) letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) } + else -> { contacts_fragment.setupContactsAdapter(contacts) contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: ArrayList() @@ -199,7 +196,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - private fun setupGroupsAdapter(contacts: ArrayList, callback: () -> Unit) { + private fun setupGroupsAdapter(contacts: List, callback: () -> Unit) { ContactsHelper(activity!!).getStoredGroups { var storedGroups = it contacts.forEach { From 5ef3e16f1721dd001f44d8c013717c8505604a8e Mon Sep 17 00:00:00 2001 From: merkost Date: Thu, 20 Jul 2023 12:16:46 +1000 Subject: [PATCH 12/21] Refactored and added column count animation --- .../contacts/pro/activities/MainActivity.kt | 16 +++++++-------- .../pro/fragments/FavoritesFragment.kt | 20 ++++++++++++++----- .../pro/fragments/MyViewPagerFragment.kt | 6 ++---- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index 577a97c7..3182edc6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -240,6 +240,13 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } } + private fun changeViewType() { + ChangeViewTypeDialog(this) { + refreshMenuItems() + favorites_fragment?.updateFavouritesAdapter() + } + } + private fun changeColumnCount() { val items = (CONTACTS_GRID_MIN_COLUMNS_COUNT..CONTACTS_GRID_MAX_COLUMNS_COUNT).map { RadioItem(it, resources.getQuantityString(R.plurals.column_counts, it, it)) @@ -250,7 +257,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { val newColumnCount = it as Int if (currentColumnCount != newColumnCount) { config.contactsGridColumnCount = newColumnCount - favorites_fragment.updateFavoritesColumnCount() + favorites_fragment?.columnCountChanged() } } } @@ -683,11 +690,4 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { checkWhatsNew(this, BuildConfig.VERSION_CODE) } } - - private fun changeViewType() { - ChangeViewTypeDialog(this) { - refreshMenuItems() - favorites_fragment?.updateFavoritesColumnCount() - } - } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt index 905a466c..0ee02c75 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt @@ -24,6 +24,8 @@ import kotlinx.android.synthetic.main.fragment_favorites.view.favorites_fragment import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { + private var favouriteContacts = listOf() + override fun fabClicked() { finishActMode() showAddFavoritesDialog() @@ -45,7 +47,8 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } fun setupContactsFavoritesAdapter(contacts: List) { - setupViewVisibility(contacts.isNotEmpty()) + favouriteContacts = contacts + setupViewVisibility(favouriteContacts.isNotEmpty()) val currAdapter = fragment_list.adapter val viewType = context.config.viewType @@ -57,7 +60,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa ContactsAdapter( activity = activity as SimpleActivity, - contactItems = contacts.toMutableList(), + contactItems = favouriteContacts.toMutableList(), refreshListener = activity as RefreshContactsListener, location = location, viewType = viewType, @@ -91,11 +94,15 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa showPhoneNumbers = context.config.showPhoneNumbers showContactThumbnails = context.config.showContactThumbnails this.viewType = viewType - updateItems(contacts) + updateItems(favouriteContacts) } } } + fun updateFavouritesAdapter() { + setupContactsFavoritesAdapter(favouriteContacts) + } + private fun setFavoritesViewType(viewType: Int) { val spanCount = context.config.contactsGridColumnCount @@ -109,8 +116,11 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa fragment_list.layoutManager = layoutManager } - fun updateFavoritesColumnCount() { - setupContactsFavoritesAdapter(favouriteContacts) + fun columnCountChanged() { + (fragment_list.layoutManager as MyGridLayoutManager).spanCount = context!!.config.contactsGridColumnCount + fragment_list?.adapter?.apply { + notifyItemRangeChanged(0, favouriteContacts.size) + } } private fun saveCustomOrderToPrefs(items: List) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt index 37e2dbbd..5207e519 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt @@ -34,7 +34,6 @@ import java.util.Locale abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet) { protected var activity: SimpleActivity? = null protected var allContacts = ArrayList() - protected var favouriteContacts = listOf() private var lastHashCode = 0 private var contactsIgnoringSearch = listOf() @@ -121,11 +120,10 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } allContacts = contacts - favouriteContacts = contacts.filter { it.starred == 1 }.sortFavourites(activity!!.config.isCustomOrderSelected) val filtered = when (this) { is GroupsFragment -> contacts is FavoritesFragment -> { - favouriteContacts + contacts.filter { it.starred == 1 }.sortFavourites(activity!!.config.isCustomOrderSelected) } else -> { @@ -139,7 +137,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) currentHash += it.getHashWithoutPrivatePhoto() } - if (currentHash != lastHashCode || skipHashComparing || filtered.size == 0) { + if (currentHash != lastHashCode || skipHashComparing || filtered.isEmpty()) { skipHashComparing = false lastHashCode = currentHash activity?.runOnUiThread { From 955efe94429e0e0bef39b1c03fa614a7b59a1e1a Mon Sep 17 00:00:00 2001 From: merkost Date: Fri, 21 Jul 2023 23:58:53 +1000 Subject: [PATCH 13/21] Added second nevers in menu to fix some glitches --- app/src/main/res/menu/menu.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index 0eb8d4bc..f7bf1842 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -30,10 +30,12 @@ app:showAsAction="ifRoom" /> Date: Sat, 22 Jul 2023 00:05:25 +1000 Subject: [PATCH 14/21] Improved sortFavourites readability --- .../pro/fragments/MyViewPagerFragment.kt | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt index 5207e519..66b60b8a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt @@ -154,19 +154,16 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } private fun List.sortFavourites(shouldSort: Boolean = true): List { - return if (shouldSort) { - val favoritesOrder = activity!!.config.favoritesContactsOrder + val favoritesOrder = activity?.config?.favoritesContactsOrder + if (!shouldSort || favoritesOrder.isNullOrEmpty()) { + return this + } - if (favoritesOrder.isEmpty()) { - return this - } + val orderList = Converters().jsonToStringList(favoritesOrder) + val map = orderList.withIndex().associate { it.value to it.index } - val orderList = Converters().jsonToStringList(favoritesOrder) - val map = orderList.withIndex().associate { it.value to it.index } - - return sortedBy { map[it.id.toString()] } - } else { - this + return sortedBy { contact -> + map[contact.id.toString()] } } From 73754bfc9fc77f547215ca32cd594ffd0710e173 Mon Sep 17 00:00:00 2001 From: merkost Date: Sat, 22 Jul 2023 10:22:46 +1000 Subject: [PATCH 15/21] Changed CONTACTS_GRID_MIN_COLUMNS_COUNT to 1 --- .../simplemobiletools/contacts/pro/activities/MainActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index 3182edc6..37d66490 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -248,7 +248,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } private fun changeColumnCount() { - val items = (CONTACTS_GRID_MIN_COLUMNS_COUNT..CONTACTS_GRID_MAX_COLUMNS_COUNT).map { + val items = (1..CONTACTS_GRID_MAX_COLUMNS_COUNT).map { RadioItem(it, resources.getQuantityString(R.plurals.column_counts, it, it)) } From 9de68501f7aff387f45016148ae6767680586a7e Mon Sep 17 00:00:00 2001 From: merkost Date: Sat, 22 Jul 2023 10:22:46 +1000 Subject: [PATCH 16/21] Changed CONTACTS_GRID_MIN_COLUMNS_COUNT to 1 --- .../simplemobiletools/contacts/pro/activities/MainActivity.kt | 2 +- .../contacts/pro/adapters/ContactsAdapter.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index 3182edc6..37d66490 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -248,7 +248,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } private fun changeColumnCount() { - val items = (CONTACTS_GRID_MIN_COLUMNS_COUNT..CONTACTS_GRID_MAX_COLUMNS_COUNT).map { + val items = (1..CONTACTS_GRID_MAX_COLUMNS_COUNT).map { RadioItem(it, resources.getQuantityString(R.plurals.column_counts, it, it)) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index 874912b5..47184631 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -496,7 +496,7 @@ class ContactsAdapter( val layoutManager = recyclerView.layoutManager if (layoutManager is GridLayoutManager) { val currentSpanCount = layoutManager.spanCount - val newSpanCount = (currentSpanCount - 1).coerceIn(CONTACTS_GRID_MIN_COLUMNS_COUNT, CONTACTS_GRID_MAX_COLUMNS_COUNT) + val newSpanCount = (currentSpanCount - 1).coerceIn(1, CONTACTS_GRID_MAX_COLUMNS_COUNT) layoutManager.spanCount = newSpanCount recyclerView.requestLayout() onColumnCountListener(newSpanCount) @@ -507,7 +507,7 @@ class ContactsAdapter( val layoutManager = recyclerView.layoutManager if (layoutManager is GridLayoutManager) { val currentSpanCount = layoutManager.spanCount - val newSpanCount = (currentSpanCount + 1).coerceIn(CONTACTS_GRID_MIN_COLUMNS_COUNT, CONTACTS_GRID_MAX_COLUMNS_COUNT) + val newSpanCount = (currentSpanCount + 1).coerceIn(1, CONTACTS_GRID_MAX_COLUMNS_COUNT) layoutManager.spanCount = newSpanCount recyclerView.requestLayout() onColumnCountListener(newSpanCount) From 4ab95c4bb38fdd770281468bb16bb9fbb70ecf85 Mon Sep 17 00:00:00 2001 From: merkost Date: Sat, 22 Jul 2023 22:43:15 +1000 Subject: [PATCH 17/21] Simplified changeColumnCount items array creating --- .../contacts/pro/activities/MainActivity.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index 37d66490..adb3a1d3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -248,12 +248,13 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } private fun changeColumnCount() { - val items = (1..CONTACTS_GRID_MAX_COLUMNS_COUNT).map { - RadioItem(it, resources.getQuantityString(R.plurals.column_counts, it, it)) + val items = ArrayList() + for (i in 1..CONTACTS_GRID_MAX_COLUMNS_COUNT) { + items.add(RadioItem(i, resources.getQuantityString(R.plurals.column_counts, i, i))) } val currentColumnCount = config.contactsGridColumnCount - RadioGroupDialog(this, ArrayList(items), currentColumnCount) { + RadioGroupDialog(this, items, currentColumnCount) { val newColumnCount = it as Int if (currentColumnCount != newColumnCount) { config.contactsGridColumnCount = newColumnCount From 3a03546c3ee55fbc6c394d93137b771137f98025 Mon Sep 17 00:00:00 2001 From: merkost Date: Sat, 22 Jul 2023 22:44:49 +1000 Subject: [PATCH 18/21] commons --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e88f0c67..1c85ff66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -65,7 +65,7 @@ android { } dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:35d685c042' + implementation 'com.github.SimpleMobileTools:Simple-Commons:91763fe00f' implementation 'com.googlecode.ez-vcard:ez-vcard:0.11.3' implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' From 9917d7d84ac9ee4b20936ecdd2844fb6edb355ab Mon Sep 17 00:00:00 2001 From: merkost Date: Sat, 22 Jul 2023 22:44:49 +1000 Subject: [PATCH 19/21] Updated to the latest commons --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e88f0c67..1c85ff66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -65,7 +65,7 @@ android { } dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:35d685c042' + implementation 'com.github.SimpleMobileTools:Simple-Commons:91763fe00f' implementation 'com.googlecode.ez-vcard:ez-vcard:0.11.3' implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' From f78edda1c4a0fcbe0d5354fe8ec3754632fdd396 Mon Sep 17 00:00:00 2001 From: merkost Date: Sun, 23 Jul 2023 11:30:38 +1000 Subject: [PATCH 20/21] Moved grid zoom listener in fragment --- .../contacts/pro/adapters/ContactsAdapter.kt | 30 +-------- .../pro/fragments/FavoritesFragment.kt | 63 +++++++++++++++---- 2 files changed, 52 insertions(+), 41 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index 47184631..89069483 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -16,7 +16,6 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout -import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide @@ -56,8 +55,7 @@ class ContactsAdapter( private val removeListener: RemoveFromGroupListener?, private val enableDrag: Boolean = false, itemClick: (Any) -> Unit -) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate, ItemTouchHelperContract, - MyRecyclerView.MyZoomListener { +) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate, ItemTouchHelperContract { private val NEW_GROUP_ID = -1 @@ -69,16 +67,12 @@ class ContactsAdapter( var showPhoneNumbers = config.showPhoneNumbers var fontSize = activity.getTextSize() var onDragEndListener: (() -> Unit)? = null - var onColumnCountListener: (Int) -> Unit = {} private var touchHelper: ItemTouchHelper? = null private var startReorderDragListener: StartReorderDragListener? = null init { setupDragListener(true) - if (recyclerView.layoutManager is GridLayoutManager) { - setupZoomListener(this) - } if (enableDrag) { touchHelper = ItemTouchHelper(ItemMoveCallback(this, viewType == VIEW_TYPE_GRID)) @@ -491,26 +485,4 @@ class ContactsAdapter( override fun onRowClear(myViewHolder: ViewHolder?) { onDragEndListener?.invoke() } - - override fun zoomIn() { - val layoutManager = recyclerView.layoutManager - if (layoutManager is GridLayoutManager) { - val currentSpanCount = layoutManager.spanCount - val newSpanCount = (currentSpanCount - 1).coerceIn(1, CONTACTS_GRID_MAX_COLUMNS_COUNT) - layoutManager.spanCount = newSpanCount - recyclerView.requestLayout() - onColumnCountListener(newSpanCount) - } - } - - override fun zoomOut() { - val layoutManager = recyclerView.layoutManager - if (layoutManager is GridLayoutManager) { - val currentSpanCount = layoutManager.spanCount - val newSpanCount = (currentSpanCount + 1).coerceIn(1, CONTACTS_GRID_MAX_COLUMNS_COUNT) - layoutManager.spanCount = newSpanCount - recyclerView.requestLayout() - onColumnCountListener(newSpanCount) - } - } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt index 0ee02c75..1de96142 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt @@ -6,12 +6,14 @@ import com.google.gson.Gson import com.simplemobiletools.commons.extensions.areSystemAnimationsEnabled import com.simplemobiletools.commons.extensions.beGone import com.simplemobiletools.commons.extensions.beVisible +import com.simplemobiletools.commons.helpers.CONTACTS_GRID_MAX_COLUMNS_COUNT import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.TAB_FAVORITES import com.simplemobiletools.commons.helpers.VIEW_TYPE_GRID import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.commons.views.MyGridLayoutManager import com.simplemobiletools.commons.views.MyLinearLayoutManager +import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.pro.activities.MainActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter @@ -25,6 +27,7 @@ import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { private var favouriteContacts = listOf() + private var zoomListener: MyRecyclerView.MyZoomListener? = null override fun fabClicked() { finishActMode() @@ -35,6 +38,8 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa showAddFavoritesDialog() } + private fun getRecyclerAdapter() = fragment_list.adapter as? ContactsAdapter + private fun showAddFavoritesDialog() { SelectContactsDialog(activity!!, allContacts, true, false) { addedContacts, removedContacts -> ContactsHelper(activity as SimpleActivity).apply { @@ -49,10 +54,11 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa fun setupContactsFavoritesAdapter(contacts: List) { favouriteContacts = contacts setupViewVisibility(favouriteContacts.isNotEmpty()) - val currAdapter = fragment_list.adapter + val currAdapter = getRecyclerAdapter() val viewType = context.config.viewType setFavoritesViewType(viewType) + initZoomListener(viewType) if (currAdapter == null || forceListRedraw) { forceListRedraw = false @@ -71,6 +77,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa (activity as RefreshContactsListener).contactClicked(it as Contact) }.apply { fragment_list.adapter = this + setupZoomListener(zoomListener) onDragEndListener = { val adapter = fragment_list?.adapter if (adapter is ContactsAdapter) { @@ -79,17 +86,13 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa setupLetterFastscroller(items) } } - - onColumnCountListener = { newColumnCount -> - context.config.contactsGridColumnCount = newColumnCount - } } if (context.areSystemAnimationsEnabled) { fragment_list.scheduleLayoutAnimation() } } else { - (currAdapter as ContactsAdapter).apply { + currAdapter.apply { startNameWithSurname = context.config.startNameWithSurname showPhoneNumbers = context.config.showPhoneNumbers showContactThumbnails = context.config.showContactThumbnails @@ -106,19 +109,55 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa private fun setFavoritesViewType(viewType: Int) { val spanCount = context.config.contactsGridColumnCount - val layoutManager = if (viewType == VIEW_TYPE_GRID) { + if (viewType == VIEW_TYPE_GRID) { favorites_fragment.letter_fastscroller.beGone() - MyGridLayoutManager(context, spanCount) + fragment_list.layoutManager = MyGridLayoutManager(context, spanCount) } else { favorites_fragment.letter_fastscroller.beVisible() - MyLinearLayoutManager(context) + fragment_list.layoutManager = MyLinearLayoutManager(context) + } + } + + private fun initZoomListener(viewType: Int) { + if (viewType == VIEW_TYPE_GRID) { + val layoutManager = fragment_list.layoutManager as MyGridLayoutManager + zoomListener = object : MyRecyclerView.MyZoomListener { + override fun zoomIn() { + if (layoutManager.spanCount > 1) { + reduceColumnCount() + getRecyclerAdapter()?.finishActMode() + } + } + + override fun zoomOut() { + if (layoutManager.spanCount < CONTACTS_GRID_MAX_COLUMNS_COUNT) { + increaseColumnCount() + getRecyclerAdapter()?.finishActMode() + } + } + } + } else { + zoomListener = null + } + } + + private fun increaseColumnCount() { + if (context.config.viewType == VIEW_TYPE_GRID) { + context!!.config.contactsGridColumnCount += 1 + columnCountChanged() + } + } + + private fun reduceColumnCount() { + if (context.config.viewType == VIEW_TYPE_GRID) { + context!!.config.contactsGridColumnCount -= 1 + columnCountChanged() } - fragment_list.layoutManager = layoutManager } fun columnCountChanged() { - (fragment_list.layoutManager as MyGridLayoutManager).spanCount = context!!.config.contactsGridColumnCount - fragment_list?.adapter?.apply { + (fragment_list.layoutManager as? MyGridLayoutManager)?.spanCount = context!!.config.contactsGridColumnCount + getRecyclerAdapter()?.apply { notifyItemRangeChanged(0, favouriteContacts.size) } } From 66f93e2ad84e455051f76fc7488d2b9c1c18fe42 Mon Sep 17 00:00:00 2001 From: merkost Date: Mon, 24 Jul 2023 13:15:13 +1000 Subject: [PATCH 21/21] Updated sortFavourites function --- .../pro/fragments/MyViewPagerFragment.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt index 66b60b8a..990a9686 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt @@ -123,7 +123,13 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) val filtered = when (this) { is GroupsFragment -> contacts is FavoritesFragment -> { - contacts.filter { it.starred == 1 }.sortFavourites(activity!!.config.isCustomOrderSelected) + val favouriteContacts = contacts.filter { it.starred == 1 } + + if (activity!!.config.isCustomOrderSelected) { + sortFavourites(favouriteContacts) + } else { + favouriteContacts + } } else -> { @@ -153,16 +159,16 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } - private fun List.sortFavourites(shouldSort: Boolean = true): List { + private fun sortFavourites(contacts: List): List { val favoritesOrder = activity?.config?.favoritesContactsOrder - if (!shouldSort || favoritesOrder.isNullOrEmpty()) { - return this + if (favoritesOrder.isNullOrEmpty()) { + return contacts } val orderList = Converters().jsonToStringList(favoritesOrder) val map = orderList.withIndex().associate { it.value to it.index } - return sortedBy { contact -> + return contacts.sortedBy { contact -> map[contact.id.toString()] } }