From 4003246483ac3d70cc7586fb99fed4cf6326b2ba Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 5 May 2023 14:02:11 +0530 Subject: [PATCH 1/8] Use Autofill in name text fields --- .../pro/activities/EditContactActivity.kt | 34 +++++- .../adapters/AutoCompleteTextViewAdapter.kt | 102 ++++++++++++++++++ .../main/res/layout/activity_edit_contact.xml | 12 ++- .../layout/item_autocomplete_name_number.xml | 57 ++++++++++ 4 files changed, 197 insertions(+), 8 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt create mode 100644 app/src/main/res/layout/item_autocomplete_name_number.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 10c475fd..7622c2ae 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -17,10 +17,7 @@ import android.telephony.PhoneNumberUtils import android.view.View import android.view.ViewGroup import android.view.WindowManager -import android.widget.EditText -import android.widget.ImageView -import android.widget.RelativeLayout -import android.widget.TextView +import android.widget.* import androidx.core.content.ContextCompat import com.simplemobiletools.commons.dialogs.ConfirmationAdvancedDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog @@ -33,7 +30,9 @@ import com.simplemobiletools.commons.models.contacts.* import com.simplemobiletools.commons.models.contacts.Email import com.simplemobiletools.commons.models.contacts.Event import com.simplemobiletools.commons.models.contacts.Organization +import com.simplemobiletools.commons.views.MyAutoCompleteTextView import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.adapters.AutoCompleteTextViewAdapter import com.simplemobiletools.contacts.pro.dialogs.CustomLabelDialog import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleFieldsDialog import com.simplemobiletools.contacts.pro.dialogs.MyDatePickerDialog @@ -254,6 +253,11 @@ class EditContactActivity : ContactActivity() { setOnLongClickListener { toast(R.string.toggle_favorite); true; } } + val nameTextViews = arrayOf(contact_first_name, contact_middle_name, contact_surname).filter { it.isVisible() } + if (nameTextViews.isNotEmpty()) { + setupAutofill(nameTextViews) + } + updateTextColors(contact_scrollview) numberViewToColor?.setTextColor(properPrimaryColor) emailViewToColor?.setTextColor(properPrimaryColor) @@ -1526,4 +1530,26 @@ class EditContactActivity : ContactActivity() { getString(R.string.jabber) -> Im.PROTOCOL_JABBER else -> Im.PROTOCOL_CUSTOM } + + private fun setupAutofill(nameTextViews: List) { + ContactsHelper(this).getContacts { contacts -> + val adapter = AutoCompleteTextViewAdapter(this, contacts) + nameTextViews.forEach { view -> + view.setAdapter(adapter) + view.setOnItemClickListener { _, _, position, _ -> + val selectedContact = adapter.resultList[position] + + if (contact_first_name.isVisible()) { + contact_first_name.setText(selectedContact.firstName) + } + if (contact_middle_name.isVisible()) { + contact_middle_name.setText(selectedContact.middleName) + } + if (contact_surname.isVisible()) { + contact_surname.setText(selectedContact.surname) + } + } + } + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt new file mode 100644 index 00000000..0374f651 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt @@ -0,0 +1,102 @@ +package com.simplemobiletools.contacts.pro.adapters + +import android.graphics.drawable.BitmapDrawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import android.widget.Filter +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestOptions +import com.simplemobiletools.commons.extensions.getProperBackgroundColor +import com.simplemobiletools.commons.extensions.getProperTextColor +import com.simplemobiletools.commons.extensions.normalizeString +import com.simplemobiletools.commons.helpers.SimpleContactsHelper +import com.simplemobiletools.commons.models.contacts.Contact +import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_image +import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_name +import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_number + +class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : ArrayAdapter(activity, 0, contacts) { + var resultList = ArrayList() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val contact = resultList[position] + var listItem = convertView + if (listItem == null || listItem.tag != contact.name.isNotEmpty()) { + listItem = LayoutInflater.from(activity).inflate(R.layout.item_autocomplete_name_number, parent, false) + } + + val nameToUse = contact.name + + val placeholder = BitmapDrawable(activity.resources, SimpleContactsHelper(context).getContactLetterIcon(nameToUse)) + listItem!!.apply { + setBackgroundColor(context.getProperBackgroundColor()) + item_autocomplete_name.setTextColor(context.getProperTextColor()) + item_autocomplete_number.setTextColor(context.getProperTextColor()) + + tag = contact.name.isNotEmpty() + item_autocomplete_name.text = contact.name + item_autocomplete_number.text = contact.phoneNumbers.run { + firstOrNull { it.isPrimary }?.normalizedNumber ?: firstOrNull()?.normalizedNumber + } + + val options = RequestOptions() + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .error(placeholder) + .centerCrop() + + Glide.with(context) + .load(contact.photoUri) + .transition(DrawableTransitionOptions.withCrossFade()) + .placeholder(placeholder) + .apply(options) + .apply(RequestOptions.circleCropTransform()) + .into(item_autocomplete_image) + } + + return listItem + } + + override fun getFilter() = object : Filter() { + override fun performFiltering(constraint: CharSequence?): FilterResults { + val filterResults = FilterResults() + if (constraint != null) { + resultList.clear() + val searchString = constraint.toString().normalizeString() + contacts.forEach { + if (it.name.contains(searchString, true)) { + resultList.add(it) + } + } + + resultList.sortWith(compareBy + { it.name.startsWith(searchString, true) }.thenBy + { it.name.contains(searchString, true) }) + resultList.reverse() + + filterResults.values = resultList + filterResults.count = resultList.size + } + return filterResults + } + + override fun publishResults(constraint: CharSequence?, results: FilterResults?) { + if ((results?.count ?: -1) > 0) { + notifyDataSetChanged() + } else { + notifyDataSetInvalidated() + } + } + + override fun convertResultToString(resultValue: Any?) = (resultValue as? Contact)?.name + } + + override fun getItem(index: Int) = resultList[index] + + override fun getCount() = resultList.size +} diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml index b6f57568..217017ce 100644 --- a/app/src/main/res/layout/activity_edit_contact.xml +++ b/app/src/main/res/layout/activity_edit_contact.xml @@ -11,7 +11,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none" - android:visibility="gone"> + android:visibility="gone" + tools:visibility="visible"> - - - + + + + + + + + + From 01c771da918fb0030c10ae8c11ad99c82a9b38be Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 5 May 2023 14:12:35 +0530 Subject: [PATCH 2/8] Delay Autofill by 5 seconds --- .../pro/activities/EditContactActivity.kt | 11 ++++++++ .../adapters/AutoCompleteTextViewAdapter.kt | 28 ++++++++++--------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 7622c2ae..34d6bf31 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -10,6 +10,7 @@ import android.media.AudioManager import android.media.RingtoneManager import android.net.Uri import android.os.Bundle +import android.os.Handler import android.provider.ContactsContract.CommonDataKinds import android.provider.ContactsContract.CommonDataKinds.* import android.provider.MediaStore @@ -19,6 +20,7 @@ import android.view.ViewGroup import android.view.WindowManager import android.widget.* import androidx.core.content.ContextCompat +import androidx.core.widget.doAfterTextChanged import com.simplemobiletools.commons.dialogs.ConfirmationAdvancedDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.SelectAlarmSoundDialog @@ -57,6 +59,8 @@ class EditContactActivity : ContactActivity() { private val CHOOSE_PHOTO = 2 private val REMOVE_PHOTO = 3 + private val AUTO_FILL_DELAY = 5000L + private var mLastSavePromptTS = 0L private var wasActivityInitialized = false private var lastPhotoIntentUri: Uri? = null @@ -1534,6 +1538,7 @@ class EditContactActivity : ContactActivity() { private fun setupAutofill(nameTextViews: List) { ContactsHelper(this).getContacts { contacts -> val adapter = AutoCompleteTextViewAdapter(this, contacts) + val handler = Handler(mainLooper) nameTextViews.forEach { view -> view.setAdapter(adapter) view.setOnItemClickListener { _, _, position, _ -> @@ -1549,6 +1554,12 @@ class EditContactActivity : ContactActivity() { contact_surname.setText(selectedContact.surname) } } + view.doAfterTextChanged { + handler.postDelayed({ + adapter.enableAutoFill = true + adapter.filter.filter(it) + }, AUTO_FILL_DELAY) + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt index 0374f651..5354e75b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt @@ -21,7 +21,7 @@ import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_au import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_name import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_number -class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : ArrayAdapter(activity, 0, contacts) { +class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList, var enableAutoFill: Boolean = false) : ArrayAdapter(activity, 0, contacts) { var resultList = ArrayList() override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { @@ -67,20 +67,22 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar val filterResults = FilterResults() if (constraint != null) { resultList.clear() - val searchString = constraint.toString().normalizeString() - contacts.forEach { - if (it.name.contains(searchString, true)) { - resultList.add(it) + if (enableAutoFill) { + val searchString = constraint.toString().normalizeString() + contacts.forEach { + if (it.name.contains(searchString, true)) { + resultList.add(it) + } } + + resultList.sortWith(compareBy + { it.name.startsWith(searchString, true) }.thenBy + { it.name.contains(searchString, true) }) + resultList.reverse() + + filterResults.values = resultList + filterResults.count = resultList.size } - - resultList.sortWith(compareBy - { it.name.startsWith(searchString, true) }.thenBy - { it.name.contains(searchString, true) }) - resultList.reverse() - - filterResults.values = resultList - filterResults.count = resultList.size } return filterResults } From ea5adfcf9143d064fcf7f64171ec88f19ba17b4a Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 5 May 2023 22:38:50 +0530 Subject: [PATCH 3/8] Always use Contact.getNameToDisplay() Because Contact.name is empty on some android versions --- .../pro/activities/EditContactActivity.kt | 2 +- .../pro/adapters/AutoCompleteTextViewAdapter.kt | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 34d6bf31..e912fcb6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -1536,7 +1536,7 @@ class EditContactActivity : ContactActivity() { } private fun setupAutofill(nameTextViews: List) { - ContactsHelper(this).getContacts { contacts -> + ContactsHelper(this).getContacts(getAll = true) { contacts -> val adapter = AutoCompleteTextViewAdapter(this, contacts) val handler = Handler(mainLooper) nameTextViews.forEach { view -> diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt index 5354e75b..99562474 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt @@ -21,26 +21,29 @@ import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_au import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_name import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_autocomplete_number -class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList, var enableAutoFill: Boolean = false) : ArrayAdapter(activity, 0, contacts) { +class AutoCompleteTextViewAdapter( + val activity: SimpleActivity, + val contacts: ArrayList, + var enableAutoFill: Boolean = false +) : ArrayAdapter(activity, 0, contacts) { var resultList = ArrayList() override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val contact = resultList[position] var listItem = convertView - if (listItem == null || listItem.tag != contact.name.isNotEmpty()) { + val nameToUse = contact.getNameToDisplay() + if (listItem == null || listItem.tag != nameToUse.isNotEmpty()) { listItem = LayoutInflater.from(activity).inflate(R.layout.item_autocomplete_name_number, parent, false) } - val nameToUse = contact.name - val placeholder = BitmapDrawable(activity.resources, SimpleContactsHelper(context).getContactLetterIcon(nameToUse)) listItem!!.apply { setBackgroundColor(context.getProperBackgroundColor()) item_autocomplete_name.setTextColor(context.getProperTextColor()) item_autocomplete_number.setTextColor(context.getProperTextColor()) - tag = contact.name.isNotEmpty() - item_autocomplete_name.text = contact.name + tag = nameToUse.isNotEmpty() + item_autocomplete_name.text = nameToUse item_autocomplete_number.text = contact.phoneNumbers.run { firstOrNull { it.isPrimary }?.normalizedNumber ?: firstOrNull()?.normalizedNumber } @@ -70,7 +73,7 @@ class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: Ar if (enableAutoFill) { val searchString = constraint.toString().normalizeString() contacts.forEach { - if (it.name.contains(searchString, true)) { + if (it.getNameToDisplay().contains(searchString, true)) { resultList.add(it) } } From 5c6500d45eebfe09807ce55b7ac671630875cdac Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 5 May 2023 22:45:46 +0530 Subject: [PATCH 4/8] Hide phone number field when there is none --- .../pro/adapters/AutoCompleteTextViewAdapter.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt index 99562474..b98b2d54 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt @@ -10,6 +10,7 @@ import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions +import com.simplemobiletools.commons.extensions.beGone import com.simplemobiletools.commons.extensions.getProperBackgroundColor import com.simplemobiletools.commons.extensions.getProperTextColor import com.simplemobiletools.commons.extensions.normalizeString @@ -44,8 +45,13 @@ class AutoCompleteTextViewAdapter( tag = nameToUse.isNotEmpty() item_autocomplete_name.text = nameToUse - item_autocomplete_number.text = contact.phoneNumbers.run { - firstOrNull { it.isPrimary }?.normalizedNumber ?: firstOrNull()?.normalizedNumber + contact.phoneNumbers.apply { + val phoneNumber = firstOrNull { it.isPrimary }?.normalizedNumber ?: firstOrNull()?.normalizedNumber + if (phoneNumber.isNullOrEmpty()) { + item_autocomplete_number.beGone() + } else { + item_autocomplete_number.text = phoneNumber + } } val options = RequestOptions() From 45bb46f4338f61df69b65cc3bd0fdecc2aa10bee Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 5 May 2023 22:50:15 +0530 Subject: [PATCH 5/8] Set getAll to false --- .../contacts/pro/activities/EditContactActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index e912fcb6..34d6bf31 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -1536,7 +1536,7 @@ class EditContactActivity : ContactActivity() { } private fun setupAutofill(nameTextViews: List) { - ContactsHelper(this).getContacts(getAll = true) { contacts -> + ContactsHelper(this).getContacts { contacts -> val adapter = AutoCompleteTextViewAdapter(this, contacts) val handler = Handler(mainLooper) nameTextViews.forEach { view -> From b5d760aa54823b779dad18e70a2b0ecdb8d95c53 Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 5 May 2023 22:55:14 +0530 Subject: [PATCH 6/8] Rename `AutoFill` to `AutoComplete` --- .../contacts/pro/activities/EditContactActivity.kt | 6 +++--- .../contacts/pro/adapters/AutoCompleteTextViewAdapter.kt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 34d6bf31..f1762c63 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -259,7 +259,7 @@ class EditContactActivity : ContactActivity() { val nameTextViews = arrayOf(contact_first_name, contact_middle_name, contact_surname).filter { it.isVisible() } if (nameTextViews.isNotEmpty()) { - setupAutofill(nameTextViews) + setupAutoComplete(nameTextViews) } updateTextColors(contact_scrollview) @@ -1535,7 +1535,7 @@ class EditContactActivity : ContactActivity() { else -> Im.PROTOCOL_CUSTOM } - private fun setupAutofill(nameTextViews: List) { + private fun setupAutoComplete(nameTextViews: List) { ContactsHelper(this).getContacts { contacts -> val adapter = AutoCompleteTextViewAdapter(this, contacts) val handler = Handler(mainLooper) @@ -1556,7 +1556,7 @@ class EditContactActivity : ContactActivity() { } view.doAfterTextChanged { handler.postDelayed({ - adapter.enableAutoFill = true + adapter.autoComplete = true adapter.filter.filter(it) }, AUTO_FILL_DELAY) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt index b98b2d54..fcb2ef1b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt @@ -25,7 +25,7 @@ import kotlinx.android.synthetic.main.item_autocomplete_name_number.view.item_au class AutoCompleteTextViewAdapter( val activity: SimpleActivity, val contacts: ArrayList, - var enableAutoFill: Boolean = false + var autoComplete: Boolean = false ) : ArrayAdapter(activity, 0, contacts) { var resultList = ArrayList() @@ -76,7 +76,7 @@ class AutoCompleteTextViewAdapter( val filterResults = FilterResults() if (constraint != null) { resultList.clear() - if (enableAutoFill) { + if (autoComplete) { val searchString = constraint.toString().normalizeString() contacts.forEach { if (it.getNameToDisplay().contains(searchString, true)) { From a02bb12eaf622ceddd073c4d4a546c118675ed29 Mon Sep 17 00:00:00 2001 From: Naveen Date: Fri, 5 May 2023 23:04:43 +0530 Subject: [PATCH 7/8] Rename `AUTO_FILL_DELAY` to `AUTO_COMPLETE_DELAY` --- .../contacts/pro/activities/EditContactActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index f1762c63..caecc090 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -59,7 +59,7 @@ class EditContactActivity : ContactActivity() { private val CHOOSE_PHOTO = 2 private val REMOVE_PHOTO = 3 - private val AUTO_FILL_DELAY = 5000L + private val AUTO_COMPLETE_DELAY = 5000L private var mLastSavePromptTS = 0L private var wasActivityInitialized = false @@ -1558,7 +1558,7 @@ class EditContactActivity : ContactActivity() { handler.postDelayed({ adapter.autoComplete = true adapter.filter.filter(it) - }, AUTO_FILL_DELAY) + }, AUTO_COMPLETE_DELAY) } } } From e69b05c32e114f55f7ef61c610d12238dfedd0ac Mon Sep 17 00:00:00 2001 From: Naveen Date: Sat, 13 May 2023 17:39:49 +0530 Subject: [PATCH 8/8] Avoid modifying adapter on a background thread --- .../adapters/AutoCompleteTextViewAdapter.kt | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt index fcb2ef1b..d630502b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/AutoCompleteTextViewAdapter.kt @@ -74,30 +74,31 @@ class AutoCompleteTextViewAdapter( override fun getFilter() = object : Filter() { override fun performFiltering(constraint: CharSequence?): FilterResults { val filterResults = FilterResults() - if (constraint != null) { - resultList.clear() - if (autoComplete) { - val searchString = constraint.toString().normalizeString() - contacts.forEach { - if (it.getNameToDisplay().contains(searchString, true)) { - resultList.add(it) - } + if (constraint != null && autoComplete) { + val searchString = constraint.toString().normalizeString() + val results = mutableListOf() + contacts.forEach { + if (it.getNameToDisplay().contains(searchString, true)) { + results.add(it) } - - resultList.sortWith(compareBy - { it.name.startsWith(searchString, true) }.thenBy - { it.name.contains(searchString, true) }) - resultList.reverse() - - filterResults.values = resultList - filterResults.count = resultList.size } + + results.sortWith(compareBy + { it.name.startsWith(searchString, true) }.thenBy + { it.name.contains(searchString, true) }) + results.reverse() + + filterResults.values = results + filterResults.count = results.size } return filterResults } override fun publishResults(constraint: CharSequence?, results: FilterResults?) { - if ((results?.count ?: -1) > 0) { + if (results != null && results.count > 0) { + resultList.clear() + @Suppress("UNCHECKED_CAST") + resultList.addAll(results.values as List) notifyDataSetChanged() } else { notifyDataSetInvalidated()