fix sorting in case of same first name
This commit is contained in:
parent
4fde91ae47
commit
2c7f651191
|
@ -236,7 +236,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
|
|||
|
||||
private fun setupView(view: View, contact: Contact) {
|
||||
view.apply {
|
||||
contact_name.text = contact.getFullName(startNameWithSurname)
|
||||
contact_name.text = contact.getFullName()
|
||||
contact_name.setTextColor(textColor)
|
||||
contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0)
|
||||
|
||||
|
|
|
@ -30,7 +30,6 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
|
|||
private val config = activity.config
|
||||
private val textColor = config.textColor
|
||||
private val contactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_person, textColor)
|
||||
private val startNameWithSurname = config.startNameWithSurname
|
||||
private val showContactThumbnails = config.showContactThumbnails
|
||||
private val itemLayout = if (config.showPhoneNumbers) R.layout.item_add_favorite_with_number else R.layout.item_add_favorite_without_number
|
||||
|
||||
|
@ -80,7 +79,7 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
|
|||
|
||||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||
val eventType = contacts[position]
|
||||
itemViews.put(position, holder.bindView(eventType, startNameWithSurname, contactDrawable, config, showContactThumbnails, smallPadding, bigPadding))
|
||||
itemViews.put(position, holder.bindView(eventType, contactDrawable, config, showContactThumbnails, smallPadding, bigPadding))
|
||||
toggleItemSelection(selectedPositions.contains(position), position)
|
||||
}
|
||||
|
||||
|
@ -88,14 +87,14 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
|
|||
|
||||
class ViewHolder(view: View, private val adapterListener: MyAdapterListener, val activity: SimpleActivity, private val showCheckbox: Boolean,
|
||||
private val itemClick: ((Contact) -> Unit)?) : RecyclerView.ViewHolder(view) {
|
||||
fun bindView(contact: Contact, startNameWithSurname: Boolean, contactDrawable: Drawable, config: Config, showContactThumbnails: Boolean,
|
||||
fun bindView(contact: Contact, contactDrawable: Drawable, config: Config, showContactThumbnails: Boolean,
|
||||
smallPadding: Int, bigPadding: Int): View {
|
||||
itemView.apply {
|
||||
contact_checkbox.beVisibleIf(showCheckbox)
|
||||
contact_checkbox.setColors(config.textColor, context.getAdjustedPrimaryColor(), config.backgroundColor)
|
||||
val textColor = config.textColor
|
||||
|
||||
contact_name.text = contact.getFullName(startNameWithSurname)
|
||||
contact_name.text = contact.getFullName()
|
||||
contact_name.setTextColor(textColor)
|
||||
contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0)
|
||||
|
||||
|
|
|
@ -233,7 +233,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
|
|||
fun onSearchQueryChanged(text: String) {
|
||||
(fragment_list.adapter as? ContactsAdapter)?.apply {
|
||||
val filtered = contactsIgnoringSearch.filter {
|
||||
it.getFullName(startNameWithSurname).contains(text, true) ||
|
||||
it.getFullName().contains(text, true) ||
|
||||
it.phoneNumbers.any { it.value.contains(text, true) } ||
|
||||
it.emails.any { it.value.contains(text, true) } ||
|
||||
it.addresses.any { it.value.contains(text, true) } ||
|
||||
|
@ -243,8 +243,9 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
|
|||
} as ArrayList
|
||||
|
||||
Contact.sorting = config.sorting
|
||||
Contact.startWithSurname = config.startNameWithSurname
|
||||
filtered.sort()
|
||||
filtered.sortBy { !it.getFullName(startNameWithSurname).startsWith(text, true) }
|
||||
filtered.sortBy { !it.getFullName().startsWith(text, true) }
|
||||
|
||||
if (filtered.isEmpty() && this@MyViewPagerFragment is FavoritesFragment) {
|
||||
fragment_placeholder.text = activity.getString(R.string.no_items_found)
|
||||
|
|
|
@ -11,13 +11,44 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
|
|||
var groups: ArrayList<Group>, var organization: Organization) : Comparable<Contact> {
|
||||
companion object {
|
||||
var sorting = 0
|
||||
var startWithSurname = false
|
||||
}
|
||||
|
||||
override fun compareTo(other: Contact): Int {
|
||||
var result = when {
|
||||
sorting and SORT_BY_FIRST_NAME != 0 -> compareStrings(firstName, other.firstName)
|
||||
sorting and SORT_BY_MIDDLE_NAME != 0 -> compareStrings(middleName, other.middleName)
|
||||
else -> compareStrings(surname, other.surname)
|
||||
val firstString: String
|
||||
val secondString: String
|
||||
|
||||
when {
|
||||
sorting and SORT_BY_FIRST_NAME != 0 -> {
|
||||
firstString = firstName
|
||||
secondString = other.firstName
|
||||
}
|
||||
sorting and SORT_BY_MIDDLE_NAME != 0 -> {
|
||||
firstString = middleName
|
||||
secondString = other.middleName
|
||||
}
|
||||
else -> {
|
||||
firstString = surname
|
||||
secondString = other.surname
|
||||
}
|
||||
}
|
||||
|
||||
var result = if (firstString.firstOrNull()?.isLetter() == true && secondString.firstOrNull()?.isLetter() == false) {
|
||||
-1
|
||||
} else if (firstString.firstOrNull()?.isLetter() == false && secondString.firstOrNull()?.isLetter() == true) {
|
||||
1
|
||||
} else {
|
||||
if (firstString.isEmpty() && secondString.isNotEmpty()) {
|
||||
1
|
||||
} else if (firstString.isNotEmpty() && secondString.isEmpty()) {
|
||||
-1
|
||||
} else {
|
||||
if (firstString.toLowerCase() == secondString.toLowerCase()) {
|
||||
getFullName().compareTo(other.getFullName())
|
||||
} else {
|
||||
firstString.toLowerCase().compareTo(secondString.toLowerCase())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sorting and SORT_DESCENDING != 0) {
|
||||
|
@ -33,7 +64,7 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
|
|||
else -> surname
|
||||
}
|
||||
|
||||
fun getFullName(startWithSurname: Boolean): String {
|
||||
fun getFullName(): String {
|
||||
var firstPart = if (startWithSurname) surname else firstName
|
||||
if (middleName.isNotEmpty()) {
|
||||
firstPart += " $middleName"
|
||||
|
@ -43,20 +74,4 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
|
|||
val suffixComma = if (suffix.isEmpty()) "" else ", $suffix"
|
||||
return "$prefix $firstPart $lastPart$suffixComma".trim()
|
||||
}
|
||||
|
||||
private fun compareStrings(first: String, second: String): Int {
|
||||
return if (first.firstOrNull()?.isLetter() == true && second.firstOrNull()?.isLetter() == false) {
|
||||
-1
|
||||
} else if (first.firstOrNull()?.isLetter() == false && second.firstOrNull()?.isLetter() == true) {
|
||||
1
|
||||
} else {
|
||||
if (first.isEmpty() && second.isNotEmpty()) {
|
||||
1
|
||||
} else if (first.isNotEmpty() && second.isEmpty()) {
|
||||
-1
|
||||
} else {
|
||||
first.toLowerCase().compareTo(second.toLowerCase())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue