From dbc78642b16ba4ae120b3a83d6541a5601079451 Mon Sep 17 00:00:00 2001 From: merkost Date: Tue, 11 Jul 2023 11:52:46 +1000 Subject: [PATCH] Adapter improving for grid view and refactoring --- .../dialer/activities/DialpadActivity.kt | 17 ++++-- .../dialer/adapters/ContactsAdapter.kt | 22 ++++--- .../dialer/fragments/ContactsFragment.kt | 60 ++++++++++--------- 3 files changed, 60 insertions(+), 39 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt index 3ec61fe3..3ee302ae 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt @@ -263,7 +263,7 @@ class DialpadActivity : SimpleActivity() { if (hasRussianLocale) { var currConvertedName = "" - convertedName.toLowerCase().forEach { char -> + convertedName.lowercase(Locale.getDefault()).forEach { char -> val convertedChar = russianCharsMap.getOrElse(char) { char } currConvertedName += convertedChar } @@ -279,13 +279,18 @@ class DialpadActivity : SimpleActivity() { try { val name = filtered[position].getNameToDisplay() val character = if (name.isNotEmpty()) name.substring(0, 1) else "" - FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault())) + FastScrollItemIndicator.Text(character.uppercase(Locale.getDefault())) } catch (e: Exception) { FastScrollItemIndicator.Text("") } }) - ContactsAdapter(this, filtered, dialpad_list, null, text) { + ContactsAdapter( + activity = this, + contacts = filtered, + recyclerView = dialpad_list, + highlightText = text + ) { val contact = it as Contact if (config.showCallConfirmation) { CallConfirmationDialog(this@DialpadActivity, contact.getNameToDisplay()) { @@ -316,7 +321,7 @@ class DialpadActivity : SimpleActivity() { CallConfirmationDialog(this, number) { callContactWithSim(number, handleIndex == 0) } - }else{ + } else { callContactWithSim(number, handleIndex == 0) } } else { @@ -324,7 +329,7 @@ class DialpadActivity : SimpleActivity() { CallConfirmationDialog(this, number) { startCallIntent(number) } - }else{ + } else { startCallIntent(number) } } @@ -406,12 +411,14 @@ class DialpadActivity : SimpleActivity() { }, longPressTimeout) } } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { stopDialpadTone(char) if (longClickable) { longPressHandler.removeCallbacksAndMessages(null) } } + MotionEvent.ACTION_MOVE -> { val viewContainsTouchEvent = if (event.rawX.isNaN() || event.rawY.isNaN()) { false diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ContactsAdapter.kt index db8c0c47..90e8b509 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ContactsAdapter.kt @@ -21,10 +21,7 @@ import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.FeatureLockedDialog import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.PERMISSION_CALL_PHONE -import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS -import com.simplemobiletools.commons.helpers.SimpleContactsHelper -import com.simplemobiletools.commons.helpers.isOreoPlus +import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.interfaces.ItemMoveCallback import com.simplemobiletools.commons.interfaces.ItemTouchHelperContract import com.simplemobiletools.commons.interfaces.StartReorderDragListener @@ -43,9 +40,10 @@ class ContactsAdapter( activity: SimpleActivity, var contacts: MutableList, recyclerView: MyRecyclerView, - val refreshItemsListener: RefreshItemsListener? = null, highlightText: String = "", - val showDeleteButton: Boolean = true, + private val refreshItemsListener: RefreshItemsListener? = null, + private val viewType: Int = VIEW_TYPE_LIST, + private val showDeleteButton: Boolean = true, private val enableDrag: Boolean = false, itemClick: (Any) -> Unit ) : MyRecyclerViewAdapter(activity, recyclerView, itemClick), ItemTouchHelperContract { @@ -123,7 +121,17 @@ class ContactsAdapter( notifyDataSetChanged() } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_contact_without_number, parent) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val layout = when (viewType) { + VIEW_TYPE_GRID -> R.layout.item_contact_grid + 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 = contacts[position] diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/ContactsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/ContactsFragment.kt index ffbd619a..de4d3bb3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/ContactsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/ContactsFragment.kt @@ -15,7 +15,7 @@ import com.simplemobiletools.dialer.extensions.launchCreateNewContactIntent import com.simplemobiletools.dialer.extensions.startContactDetailsIntent import com.simplemobiletools.dialer.interfaces.RefreshItemsListener import kotlinx.android.synthetic.main.fragment_letters_layout.view.* -import java.util.* +import java.util.Locale class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), RefreshItemsListener { private var allContacts = ArrayList() @@ -82,7 +82,7 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag } private fun gotContacts(contacts: ArrayList) { - setupLetterFastscroller(contacts) + setupLetterFastScroller(contacts) if (contacts.isEmpty()) { fragment_placeholder.beVisible() fragment_placeholder_2.beVisible() @@ -94,7 +94,12 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag val currAdapter = fragment_list.adapter if (currAdapter == null) { - ContactsAdapter(activity as SimpleActivity, contacts, fragment_list, this) { + ContactsAdapter( + activity = activity as SimpleActivity, + contacts = contacts, + recyclerView = fragment_list, + refreshItemsListener = this + ) { val contact = it as Contact activity?.startContactDetailsIntent(contact) }.apply { @@ -110,12 +115,12 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag } } - private fun setupLetterFastscroller(contacts: ArrayList) { + private fun setupLetterFastScroller(contacts: ArrayList) { letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> try { val name = contacts[position].getNameToDisplay() val character = if (name.isNotEmpty()) name.substring(0, 1) else "" - FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault()).normalizeString()) + FastScrollItemIndicator.Text(character.uppercase(Locale.getDefault()).normalizeString()) } catch (e: Exception) { FastScrollItemIndicator.Text("") } @@ -125,35 +130,36 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag override fun onSearchClosed() { fragment_placeholder.beVisibleIf(allContacts.isEmpty()) (fragment_list.adapter as? ContactsAdapter)?.updateItems(allContacts) - setupLetterFastscroller(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 + 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) - } + filtered.sortBy { + val nameToDisplay = it.getNameToDisplay() + !getProperText(nameToDisplay, shouldNormalize).startsWith(text, true) && !nameToDisplay.contains(text, true) + } fragment_placeholder.beVisibleIf(filtered.isEmpty()) (fragment_list.adapter as? ContactsAdapter)?.updateItems(filtered, text) - setupLetterFastscroller(filtered) - } + setupLetterFastScroller(filtered) + } + private fun requestReadContactsPermission() { activity?.handlePermission(PERMISSION_READ_CONTACTS) { if (it) {