use the letter fastscroller at SelectContact activity and dialog

This commit is contained in:
tibbi 2021-11-17 10:47:21 +01:00
parent 390084a719
commit e436073156
6 changed files with 126 additions and 70 deletions

View File

@ -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<Contact>) {
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
}
)
}
}

View File

@ -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<Contact>, private val selectedContacts: ArrayList<Contact>, private val allowPickMultiple: Boolean,
recyclerView: MyRecyclerView, val fastScroller: FastScroller, private val itemClick: ((Contact) -> Unit)? = null) :
RecyclerView.Adapter<SelectContactsAdapter.ViewHolder>() {
class SelectContactsAdapter(
val activity: SimpleActivity, var contacts: ArrayList<Contact>, private val selectedContacts: ArrayList<Contact>, private val allowPickMultiple: Boolean,
recyclerView: MyRecyclerView, private val itemClick: ((Contact) -> Unit)? = null
) :
RecyclerView.Adapter<SelectContactsAdapter.ViewHolder>() {
private val itemViews = SparseArray<View>()
private val selectedPositions = HashSet<Int>()
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)
}

View File

@ -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<Contact>, val allowSelectMultiple: Boolean, val showOnlyContactsWithNumber: Boolean,
selectContacts: ArrayList<Contact>? = null, val callback: (addedContacts: ArrayList<Contact>, removedContacts: ArrayList<Contact>) -> Unit) {
class SelectContactsDialog(
val activity: SimpleActivity, initialContacts: ArrayList<Contact>, val allowSelectMultiple: Boolean, val showOnlyContactsWithNumber: Boolean,
selectContacts: ArrayList<Contact>? = null, val callback: (addedContacts: ArrayList<Contact>, removedContacts: ArrayList<Contact>) -> Unit
) {
private var dialog: AlertDialog? = null
private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null)
private var initiallySelectedContacts = ArrayList<Contact>()
@ -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<Contact>) {
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("")
}
})
}
}

View File

@ -243,14 +243,15 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
}
private fun setupLetterFastscroller(contacts: ArrayList<Contact>) {
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
}

View File

@ -42,16 +42,21 @@
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/select_contact_fastscroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignTop="@+id/select_contact_list"
android:layout_alignBottom="@+id/select_contact_list"
<com.reddit.indicatorfastscroll.FastScrollerView
android:id="@+id/letter_fastscroller"
android:layout_width="32dp"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin">
android:paddingTop="@dimen/big_margin"
android:paddingBottom="@dimen/big_margin" />
<include layout="@layout/fastscroller_handle_vertical" />
<com.reddit.indicatorfastscroll.FastScrollerThumbView
android:id="@+id/letter_fastscroller_thumb"
android:layout_width="@dimen/fab_size"
android:layout_height="match_parent"
android:layout_alignTop="@+id/letter_fastscroller"
android:layout_alignBottom="@+id/letter_fastscroller"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_toStartOf="@+id/letter_fastscroller" />
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>

View File

@ -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" />
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/select_contact_fastscroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignTop="@+id/select_contact_list"
android:layout_alignBottom="@+id/select_contact_list"
<com.reddit.indicatorfastscroll.FastScrollerView
android:id="@+id/letter_fastscroller"
android:layout_width="32dp"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin">
android:paddingTop="@dimen/big_margin"
android:paddingBottom="@dimen/big_margin" />
<include layout="@layout/fastscroller_handle_vertical" />
<com.reddit.indicatorfastscroll.FastScrollerThumbView
android:id="@+id/letter_fastscroller_thumb"
android:layout_width="@dimen/fab_size"
android:layout_height="match_parent"
android:layout_alignTop="@+id/letter_fastscroller"
android:layout_alignBottom="@+id/letter_fastscroller"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_toStartOf="@+id/letter_fastscroller" />
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout>