191 lines
8.1 KiB
Kotlin
191 lines
8.1 KiB
Kotlin
package com.simplemobiletools.dialer.fragments
|
|
|
|
import android.content.Context
|
|
import android.util.AttributeSet
|
|
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.dialer.R
|
|
import com.simplemobiletools.dialer.activities.MainActivity
|
|
import com.simplemobiletools.dialer.activities.SimpleActivity
|
|
import com.simplemobiletools.dialer.adapters.ContactsAdapter
|
|
import com.simplemobiletools.dialer.databinding.FragmentContactsBinding
|
|
import com.simplemobiletools.dialer.databinding.FragmentLettersLayoutBinding
|
|
import com.simplemobiletools.dialer.extensions.launchCreateNewContactIntent
|
|
import com.simplemobiletools.dialer.extensions.startContactDetailsIntent
|
|
import com.simplemobiletools.dialer.interfaces.RefreshItemsListener
|
|
import java.util.Locale
|
|
|
|
class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment<MyViewPagerFragment.LettersInnerBinding>(context, attributeSet),
|
|
RefreshItemsListener {
|
|
private lateinit var binding: FragmentLettersLayoutBinding
|
|
private var allContacts = ArrayList<Contact>()
|
|
|
|
override fun onFinishInflate() {
|
|
super.onFinishInflate()
|
|
binding = FragmentLettersLayoutBinding.bind(FragmentContactsBinding.bind(this).contactsFragment)
|
|
innerBinding = LettersInnerBinding(binding)
|
|
}
|
|
|
|
override fun setupFragment() {
|
|
val placeholderResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) {
|
|
R.string.no_contacts_found
|
|
} else {
|
|
R.string.could_not_access_contacts
|
|
}
|
|
|
|
binding.fragmentPlaceholder.text = context.getString(placeholderResId)
|
|
|
|
val placeholderActionResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) {
|
|
R.string.create_new_contact
|
|
} else {
|
|
R.string.request_access
|
|
}
|
|
|
|
binding.fragmentPlaceholder2.apply {
|
|
text = context.getString(placeholderActionResId)
|
|
underlineText()
|
|
setOnClickListener {
|
|
if (context.hasPermission(PERMISSION_READ_CONTACTS)) {
|
|
activity?.launchCreateNewContactIntent()
|
|
} else {
|
|
requestReadContactsPermission()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
override fun setupColors(textColor: Int, primaryColor: Int, properPrimaryColor: Int) {
|
|
binding.apply {
|
|
(fragmentList?.adapter as? MyRecyclerViewAdapter)?.updateTextColor(textColor)
|
|
fragmentPlaceholder.setTextColor(textColor)
|
|
fragmentPlaceholder2.setTextColor(properPrimaryColor)
|
|
|
|
letterFastscroller.textColor = textColor.getColorStateList()
|
|
letterFastscroller.pressedTextColor = properPrimaryColor
|
|
letterFastscrollerThumb.setupWithFastScroller(letterFastscroller)
|
|
letterFastscrollerThumb.textColor = properPrimaryColor.getContrastColor()
|
|
letterFastscrollerThumb.thumbColor = properPrimaryColor.getColorStateList()
|
|
}
|
|
}
|
|
|
|
override fun refreshItems(callback: (() -> Unit)?) {
|
|
val privateCursor = context?.getMyContactsCursor(false, true)
|
|
ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
|
|
allContacts = contacts
|
|
|
|
if (SMT_PRIVATE !in context.baseConfig.ignoredContactSources) {
|
|
val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor)
|
|
if (privateContacts.isNotEmpty()) {
|
|
allContacts.addAll(privateContacts)
|
|
allContacts.sort()
|
|
}
|
|
}
|
|
(activity as MainActivity).cacheContacts(allContacts)
|
|
|
|
activity?.runOnUiThread {
|
|
gotContacts(contacts)
|
|
callback?.invoke()
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun gotContacts(contacts: ArrayList<Contact>) {
|
|
setupLetterFastScroller(contacts)
|
|
if (contacts.isEmpty()) {
|
|
binding.apply {
|
|
fragmentPlaceholder.beVisible()
|
|
fragmentPlaceholder2.beVisible()
|
|
fragmentList.beGone()
|
|
}
|
|
} else {
|
|
binding.apply {
|
|
fragmentPlaceholder.beGone()
|
|
fragmentPlaceholder2.beGone()
|
|
fragmentList.beVisible()
|
|
}
|
|
|
|
if (binding.fragmentList.adapter == null) {
|
|
ContactsAdapter(
|
|
activity = activity as SimpleActivity,
|
|
contacts = contacts,
|
|
recyclerView = binding.fragmentList,
|
|
refreshItemsListener = this
|
|
) {
|
|
val contact = it as Contact
|
|
activity?.startContactDetailsIntent(contact)
|
|
}.apply {
|
|
binding.fragmentList.adapter = this
|
|
}
|
|
|
|
if (context.areSystemAnimationsEnabled) {
|
|
binding.fragmentList.scheduleLayoutAnimation()
|
|
}
|
|
} else {
|
|
(binding.fragmentList.adapter as ContactsAdapter).updateItems(contacts)
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun setupLetterFastScroller(contacts: ArrayList<Contact>) {
|
|
binding.letterFastscroller.setupWithRecyclerView(binding.fragmentList, { position ->
|
|
try {
|
|
val name = contacts[position].getNameToDisplay()
|
|
val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
|
|
FastScrollItemIndicator.Text(character.uppercase(Locale.getDefault()).normalizeString())
|
|
} catch (e: Exception) {
|
|
FastScrollItemIndicator.Text("")
|
|
}
|
|
})
|
|
}
|
|
|
|
override fun onSearchClosed() {
|
|
binding.fragmentPlaceholder.beVisibleIf(allContacts.isEmpty())
|
|
(binding.fragmentList.adapter as? ContactsAdapter)?.updateItems(allContacts)
|
|
setupLetterFastScroller(allContacts)
|
|
}
|
|
|
|
override fun onSearchQueryChanged(text: String) {
|
|
val shouldNormalize = text.normalizeString() == text
|
|
val filtered = allContacts.filter {
|
|
getProperText(it.getNameToDisplay(), shouldNormalize).contains(text, true) ||
|
|
getProperText(it.nickname, shouldNormalize).contains(text, true) ||
|
|
it.phoneNumbers.any {
|
|
text.normalizePhoneNumber().isNotEmpty() && it.normalizedNumber.contains(text.normalizePhoneNumber(), true)
|
|
} ||
|
|
it.emails.any { it.value.contains(text, true) } ||
|
|
it.addresses.any { getProperText(it.value, shouldNormalize).contains(text, true) } ||
|
|
it.IMs.any { it.value.contains(text, true) } ||
|
|
getProperText(it.notes, shouldNormalize).contains(text, true) ||
|
|
getProperText(it.organization.company, shouldNormalize).contains(text, true) ||
|
|
getProperText(it.organization.jobPosition, shouldNormalize).contains(text, true) ||
|
|
it.websites.any { it.contains(text, true) }
|
|
} as ArrayList
|
|
|
|
filtered.sortBy {
|
|
val nameToDisplay = it.getNameToDisplay()
|
|
!getProperText(nameToDisplay, shouldNormalize).startsWith(text, true) && !nameToDisplay.contains(text, true)
|
|
}
|
|
|
|
binding.fragmentPlaceholder.beVisibleIf(filtered.isEmpty())
|
|
(binding.fragmentList.adapter as? ContactsAdapter)?.updateItems(filtered, text)
|
|
setupLetterFastScroller(filtered)
|
|
}
|
|
|
|
private fun requestReadContactsPermission() {
|
|
activity?.handlePermission(PERMISSION_READ_CONTACTS) {
|
|
if (it) {
|
|
binding.fragmentPlaceholder.text = context.getString(R.string.no_contacts_found)
|
|
binding.fragmentPlaceholder2.text = context.getString(R.string.create_new_contact)
|
|
ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
|
|
activity?.runOnUiThread {
|
|
gotContacts(contacts)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|