From e436073156119f978b82e97fa1ccad2836168b61 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 17 Nov 2021 10:47:21 +0100 Subject: [PATCH] use the letter fastscroller at SelectContact activity and dialog --- .../pro/activities/SelectContactActivity.kt | 46 ++++++---- .../pro/adapters/SelectContactsAdapter.kt | 13 +-- .../pro/dialogs/SelectContactsDialog.kt | 83 ++++++++++++------- .../pro/fragments/MyViewPagerFragment.kt | 7 +- .../res/layout/activity_select_contact.xml | 23 +++-- .../main/res/layout/layout_select_contact.xml | 24 ++++-- 6 files changed, 126 insertions(+), 70 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt index c094bc5c..2bd5dd11 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt @@ -12,9 +12,9 @@ import android.view.Menu import android.view.MenuItem import androidx.appcompat.widget.SearchView import androidx.core.view.MenuItemCompat +import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS -import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS +import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.SelectContactsAdapter import com.simplemobiletools.contacts.pro.dialogs.ChangeSortingDialog @@ -26,6 +26,8 @@ import com.simplemobiletools.contacts.pro.helpers.ContactsHelper import com.simplemobiletools.contacts.pro.helpers.getProperText import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.activity_select_contact.* +import java.util.* +import kotlin.collections.ArrayList class SelectContactActivity : SimpleActivity() { private var specialMimeType: String? = null @@ -41,7 +43,7 @@ class SelectContactActivity : SimpleActivity() { return } - setupPlaceholders() + setupViews() handlePermission(PERMISSION_READ_CONTACTS) { if (it) { @@ -195,7 +197,7 @@ class SelectContactActivity : SimpleActivity() { runOnUiThread { updatePlaceholderVisibility(contacts) - SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list, select_contact_fastscroller) { + SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list) { confirmSelection(it) }.apply { select_contact_list.adapter = this @@ -205,9 +207,15 @@ class SelectContactActivity : SimpleActivity() { select_contact_list.scheduleLayoutAnimation() } - select_contact_fastscroller.setViews(select_contact_list) { - select_contact_fastscroller.updateBubbleText(contacts[it].getBubbleText()) - } + letter_fastscroller.setupWithRecyclerView(select_contact_list, { position -> + try { + val name = contacts[position].getNameToDisplay() + val character = if (name.isNotEmpty()) name.substring(0, 1) else "" + FastScrollItemIndicator.Text(character.normalizeString().toUpperCase(Locale.getDefault())) + } catch (e: Exception) { + FastScrollItemIndicator.Text("") + } + }) } } } @@ -231,25 +239,35 @@ class SelectContactActivity : SimpleActivity() { } } - private fun setupPlaceholders() { + private fun setupViews() { + val adjustedPrimaryColor = getAdjustedPrimaryColor() select_contact_placeholder.setTextColor(config.textColor) - select_contact_placeholder_2.setTextColor(getAdjustedPrimaryColor()) + select_contact_placeholder_2.setTextColor(adjustedPrimaryColor) select_contact_placeholder_2.underlineText() select_contact_placeholder_2.setOnClickListener { FilterContactSourcesDialog(this) { initContacts() } } + + letter_fastscroller?.textColor = config.textColor.getColorStateList() + letter_fastscroller?.pressedTextColor = adjustedPrimaryColor + letter_fastscroller_thumb?.fontSize = getTextSize() + letter_fastscroller_thumb?.textColor = adjustedPrimaryColor.getContrastColor() + letter_fastscroller_thumb?.thumbColor = adjustedPrimaryColor.getColorStateList() + letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) } private fun updatePlaceholderVisibility(contacts: ArrayList) { select_contact_list.beVisibleIf(contacts.isNotEmpty()) select_contact_placeholder_2.beVisibleIf(contacts.isEmpty()) select_contact_placeholder.beVisibleIf(contacts.isEmpty()) - select_contact_placeholder.setText(when (specialMimeType) { - Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails - Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers - else -> R.string.no_contacts_found - }) + select_contact_placeholder.setText( + when (specialMimeType) { + Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails + Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers + else -> R.string.no_contacts_found + } + ) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt index 451cdb68..64caebb5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt @@ -12,7 +12,6 @@ import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.SimpleContactsHelper -import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity @@ -21,9 +20,11 @@ import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.* import java.util.* -class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayList, private val selectedContacts: ArrayList, private val allowPickMultiple: Boolean, - recyclerView: MyRecyclerView, val fastScroller: FastScroller, private val itemClick: ((Contact) -> Unit)? = null) : - RecyclerView.Adapter() { +class SelectContactsAdapter( + val activity: SimpleActivity, var contacts: ArrayList, private val selectedContacts: ArrayList, private val allowPickMultiple: Boolean, + recyclerView: MyRecyclerView, private val itemClick: ((Contact) -> Unit)? = null +) : + RecyclerView.Adapter() { private val itemViews = SparseArray() private val selectedPositions = HashSet() private val config = activity.config @@ -87,7 +88,6 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis textToHighlight = highlightText notifyDataSetChanged() } - fastScroller.measureRecyclerView() } override fun onViewRecycled(holder: ViewHolder) { @@ -124,7 +124,8 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis } val numberText = phoneNumberToUse?.value ?: "" - contact_number.text = if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, adjustedPrimaryColor, false, true) + contact_number.text = + if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, adjustedPrimaryColor, false, true) contact_number.setTextColor(textColor) contact_number.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt index 9ec82e84..914d6175 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt @@ -1,18 +1,23 @@ package com.simplemobiletools.contacts.pro.dialogs import androidx.appcompat.app.AlertDialog -import com.simplemobiletools.commons.extensions.areSystemAnimationsEnabled -import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.reddit.indicatorfastscroll.FastScrollItemIndicator +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.SelectContactsAdapter +import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.layout_select_contact.view.* +import java.util.* +import kotlin.collections.ArrayList -class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayList, val allowSelectMultiple: Boolean, val showOnlyContactsWithNumber: Boolean, - selectContacts: ArrayList? = null, val callback: (addedContacts: ArrayList, removedContacts: ArrayList) -> Unit) { +class SelectContactsDialog( + val activity: SimpleActivity, initialContacts: ArrayList, val allowSelectMultiple: Boolean, val showOnlyContactsWithNumber: Boolean, + selectContacts: ArrayList? = null, val callback: (addedContacts: ArrayList, removedContacts: ArrayList) -> Unit +) { private var dialog: AlertDialog? = null private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null) private var initiallySelectedContacts = ArrayList() @@ -32,35 +37,33 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL initiallySelectedContacts = selectContacts } - activity.runOnUiThread { - // if selecting multiple contacts is disabled, react on first contact click and dismiss the dialog - val contactClickCallback: ((Contact) -> Unit)? = if (allowSelectMultiple) null else { contact -> - callback(arrayListOf(contact), arrayListOf()) - dialog!!.dismiss() + // if selecting multiple contacts is disabled, react on first contact click and dismiss the dialog + val contactClickCallback: ((Contact) -> Unit)? = if (allowSelectMultiple) null else { contact -> + callback(arrayListOf(contact), arrayListOf()) + dialog!!.dismiss() + } + + view.apply { + select_contact_list.adapter = SelectContactsAdapter( + activity, allContacts, initiallySelectedContacts, allowSelectMultiple, + select_contact_list, contactClickCallback + ) + + if (context.areSystemAnimationsEnabled) { + select_contact_list.scheduleLayoutAnimation() } + } - view.apply { - select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, allowSelectMultiple, - select_contact_list, select_contact_fastscroller, contactClickCallback) + setupFastscroller(allContacts) - if (context.areSystemAnimationsEnabled) { - select_contact_list.scheduleLayoutAnimation() - } + val builder = AlertDialog.Builder(activity) + if (allowSelectMultiple) { + builder.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } + } + builder.setNegativeButton(R.string.cancel, null) - select_contact_fastscroller.setViews(select_contact_list) { - select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText()) - } - } - - val builder = AlertDialog.Builder(activity) - if (allowSelectMultiple) { - builder.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } - } - builder.setNegativeButton(R.string.cancel, null) - - dialog = builder.create().apply { - activity.setupDialogStuff(view, this) - } + dialog = builder.create().apply { + activity.setupDialogStuff(view, this) } } @@ -74,4 +77,26 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL callback(newlySelectedContacts, unselectedContacts) } } + + private fun setupFastscroller(allContacts: ArrayList) { + val adjustedPrimaryColor = activity.getAdjustedPrimaryColor() + view.apply { + letter_fastscroller?.textColor = context.config.textColor.getColorStateList() + letter_fastscroller?.pressedTextColor = adjustedPrimaryColor + letter_fastscroller_thumb?.fontSize = context.getTextSize() + letter_fastscroller_thumb?.textColor = adjustedPrimaryColor.getContrastColor() + letter_fastscroller_thumb?.thumbColor = adjustedPrimaryColor.getColorStateList() + letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) + } + + view.letter_fastscroller.setupWithRecyclerView(view.select_contact_list, { position -> + try { + val name = allContacts[position].getNameToDisplay() + val character = if (name.isNotEmpty()) name.substring(0, 1) else "" + FastScrollItemIndicator.Text(character.normalizeString().toUpperCase(Locale.getDefault())) + } catch (e: Exception) { + FastScrollItemIndicator.Text("") + } + }) + } } 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 2da9f23e..9d6e2abe 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 @@ -243,14 +243,15 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } private fun setupLetterFastscroller(contacts: ArrayList) { + val sorting = context.config.sorting letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> try { val contact = contacts[position] var name = when { contact.isABusinessContact() -> contact.getFullCompany() - context.config.sorting and SORT_BY_SURNAME != 0 && contact.surname.isNotEmpty() -> contact.surname - context.config.sorting and SORT_BY_MIDDLE_NAME != 0 && contact.middleName.isNotEmpty() -> contact.middleName - context.config.sorting and SORT_BY_FIRST_NAME != 0 && contact.firstName.isNotEmpty() -> contact.firstName + sorting and SORT_BY_SURNAME != 0 && contact.surname.isNotEmpty() -> contact.surname + sorting and SORT_BY_MIDDLE_NAME != 0 && contact.middleName.isNotEmpty() -> contact.middleName + sorting and SORT_BY_FIRST_NAME != 0 && contact.firstName.isNotEmpty() -> contact.firstName context.config.startNameWithSurname -> contact.surname else -> contact.firstName } diff --git a/app/src/main/res/layout/activity_select_contact.xml b/app/src/main/res/layout/activity_select_contact.xml index a0cad591..b122536a 100644 --- a/app/src/main/res/layout/activity_select_contact.xml +++ b/app/src/main/res/layout/activity_select_contact.xml @@ -42,16 +42,21 @@ android:scrollbars="none" app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" /> - + android:paddingTop="@dimen/big_margin" + android:paddingBottom="@dimen/big_margin" /> - + - diff --git a/app/src/main/res/layout/layout_select_contact.xml b/app/src/main/res/layout/layout_select_contact.xml index c0b20909..166ecd1d 100644 --- a/app/src/main/res/layout/layout_select_contact.xml +++ b/app/src/main/res/layout/layout_select_contact.xml @@ -11,19 +11,25 @@ android:layout_height="wrap_content" android:clipToPadding="false" android:layoutAnimation="@anim/layout_animation" + android:paddingEnd="@dimen/big_margin" android:scrollbars="none" app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" /> - + android:paddingTop="@dimen/big_margin" + android:paddingBottom="@dimen/big_margin" /> - + -