From 8736473b35388d32f89de8875579f185fd4fc493 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 6 Apr 2020 19:20:17 +0200 Subject: [PATCH] fill the Suggestions list with contacts --- app/build.gradle | 2 +- .../activities/NewMessageActivity.kt | 26 +++--- .../adapters/AutoCompleteTextViewAdapter.kt | 84 ----------------- .../smsmessenger/adapters/ContactsAdapter.kt | 90 +++++++++++++++++++ .../smsmessenger/models/Contact.kt | 3 +- .../contact_circular_background.xml | 16 ---- .../drawable-xxhdpi/ic_business_vector.xml | 9 ++ .../main/res/layout/activity_new_message.xml | 9 +- ...ocomplete_contact.xml => item_contact.xml} | 0 .../res/layout/item_contact_with_number.xml | 43 +++++++++ 10 files changed, 161 insertions(+), 121 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt delete mode 100644 app/src/main/res/drawable-xxhdpi/contact_circular_background.xml create mode 100644 app/src/main/res/drawable-xxhdpi/ic_business_vector.xml rename app/src/main/res/layout/{item_autocomplete_contact.xml => item_contact.xml} (100%) create mode 100644 app/src/main/res/layout/item_contact_with_number.xml diff --git a/app/build.gradle b/app/build.gradle index 6bc04e5f..70c6b07e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,7 +36,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.24.17' + implementation 'com.simplemobiletools:commons:5.24.18' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4' implementation 'org.greenrobot:eventbus:3.2.0' } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewMessageActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewMessageActivity.kt index 8b3197d5..38f54638 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewMessageActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/NewMessageActivity.kt @@ -8,14 +8,13 @@ import android.text.TextUtils import android.view.Gravity import android.view.View import android.view.WindowManager -import android.view.inputmethod.EditorInfo import android.widget.LinearLayout import android.widget.LinearLayout.LayoutParams import android.widget.RelativeLayout import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.smsmessenger.R -import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter +import com.simplemobiletools.smsmessenger.adapters.ContactsAdapter import com.simplemobiletools.smsmessenger.extensions.getThreadId import com.simplemobiletools.smsmessenger.extensions.launchThreadActivity import com.simplemobiletools.smsmessenger.models.Contact @@ -56,21 +55,22 @@ class NewMessageActivity : SimpleActivity() { if (photoUri != null) { it.photoUri = photoUri } + + it.isOrganization = contact?.isOrganization ?: false } - contacts = contacts.distinctBy { + contacts = contacts.filter { it.name.isNotEmpty() }.distinctBy { val startIndex = Math.max(0, it.phoneNumber.length - 9) it.phoneNumber.substring(startIndex) }.toMutableList() as ArrayList - val adapter = AutoCompleteTextViewAdapter(this, contacts) - new_message_to.setAdapter(adapter) - new_message_to.imeOptions = EditorInfo.IME_ACTION_NEXT - new_message_to.setOnItemClickListener { parent, view, position, id -> - val currContacts = (new_message_to.adapter as AutoCompleteTextViewAdapter).resultList - val selectedContact = currContacts[position] + contacts.sortBy { it.name.normalizeString().toLowerCase() } + + ContactsAdapter(this, contacts, suggestions_list, null) { hideKeyboard() - launchThreadActivity(getThreadId(selectedContact.phoneNumber).toInt()) + launchThreadActivity(getThreadId((it as Contact).phoneNumber).toInt()) + }.apply { + suggestions_list.adapter = this } } @@ -194,7 +194,7 @@ class NewMessageActivity : SimpleActivity() { if (firstName.isNotEmpty() || middleName.isNotEmpty() || familyName.isNotEmpty()) { val names = arrayOf(prefix, firstName, middleName, familyName, suffix).filter { it.isNotEmpty() } val fullName = TextUtils.join(" ", names) - val contact = Contact(id, fullName, photoUri, "") + val contact = Contact(id, fullName, photoUri, "", false) contacts.add(contact) } } @@ -205,7 +205,7 @@ class NewMessageActivity : SimpleActivity() { val jobTitle = cursor.getStringValue(CommonDataKinds.Organization.TITLE) ?: "" if (company.isNotEmpty() || jobTitle.isNotEmpty()) { val fullName = "$company $jobTitle".trim() - val contact = Contact(id, fullName, photoUri, "") + val contact = Contact(id, fullName, photoUri, "", true) contacts.add(contact) } } @@ -233,7 +233,7 @@ class NewMessageActivity : SimpleActivity() { do { val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) val phoneNumber = cursor.getStringValue(CommonDataKinds.Phone.NORMALIZED_NUMBER) ?: continue - val contact = Contact(id, "", "", phoneNumber) + val contact = Contact(id, "", "", phoneNumber, false) contacts.add(contact) } while (cursor.moveToNext()) } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt deleted file mode 100644 index 4a6ea604..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/AutoCompleteTextViewAdapter.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.simplemobiletools.smsmessenger.adapters - -import android.graphics.drawable.LayerDrawable -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.ArrayAdapter -import android.widget.Filter -import com.simplemobiletools.commons.extensions.applyColorFilter -import com.simplemobiletools.commons.extensions.normalizeString -import com.simplemobiletools.smsmessenger.R -import com.simplemobiletools.smsmessenger.activities.SimpleActivity -import com.simplemobiletools.smsmessenger.extensions.config -import com.simplemobiletools.smsmessenger.models.Contact -import kotlinx.android.synthetic.main.item_autocomplete_contact.view.* - -class AutoCompleteTextViewAdapter(val activity: SimpleActivity, val contacts: ArrayList) : - ArrayAdapter(activity, 0, contacts) { - var resultList = ArrayList() - private var placeholder = activity.resources.getDrawable(R.drawable.contact_circular_background) - - init { - (placeholder as LayerDrawable).findDrawableByLayerId(R.id.attendee_circular_background) - .applyColorFilter(activity.config.primaryColor) - } - - 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_contact, parent, false) - } - - listItem!!.apply { - tag = contact.name.isNotEmpty() - item_autocomplete_name.text = contact.name - item_autocomplete_number.text = contact.phoneNumber - - contact.updateImage(context, item_autocomplete_image, placeholder) - } - - 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.phoneNumber.contains(searchString, true) || it.name.contains(searchString, true)) { - resultList.add(it) - } - } - - resultList.sortWith(compareBy - { it.name.startsWith(searchString, true) }.thenBy - { it.phoneNumber.startsWith(searchString, true) }.thenBy - { it.name.contains(searchString, true) }.thenBy - { it.phoneNumber.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/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt new file mode 100644 index 00000000..9235b0cc --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/adapters/ContactsAdapter.kt @@ -0,0 +1,90 @@ +package com.simplemobiletools.smsmessenger.adapters + +import android.graphics.drawable.Drawable +import android.view.Menu +import android.view.View +import android.view.ViewGroup +import com.bumptech.glide.Glide +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter +import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor +import com.simplemobiletools.commons.views.FastScroller +import com.simplemobiletools.commons.views.MyRecyclerView +import com.simplemobiletools.smsmessenger.R +import com.simplemobiletools.smsmessenger.activities.SimpleActivity +import com.simplemobiletools.smsmessenger.models.Contact +import kotlinx.android.synthetic.main.item_contact_with_number.view.* +import java.util.* + +class ContactsAdapter( + activity: SimpleActivity, var contacts: ArrayList, recyclerView: MyRecyclerView, + fastScroller: FastScroller?, itemClick: (Any) -> Unit +) : + MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { + + private lateinit var contactDrawable: Drawable + private lateinit var businessContactDrawable: Drawable + + init { + initDrawables() + } + + override fun getActionMenuId() = 0 + + override fun prepareActionMode(menu: Menu) {} + + override fun actionItemPressed(id: Int) {} + + override fun getSelectableItemCount() = contacts.size + + override fun getIsItemSelectable(position: Int) = true + + override fun getItemSelectionKey(position: Int) = contacts.getOrNull(position)?.id + + override fun getItemKeyPosition(key: Int) = contacts.indexOfFirst { it.id == key } + + override fun onActionModeCreated() {} + + override fun onActionModeDestroyed() {} + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_contact_with_number, parent) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val contact = contacts[position] + holder.bindView(contact, true, false) { itemView, layoutPosition -> + setupView(itemView, contact) + } + bindViewHolder(holder) + } + + override fun getItemCount() = contacts.size + + private fun initDrawables() { + contactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_person_vector, textColor) + businessContactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_business_vector, textColor) + } + + override fun onViewRecycled(holder: ViewHolder) { + super.onViewRecycled(holder) + if (!activity.isDestroyed && !activity.isFinishing) { + Glide.with(activity).clear(holder.itemView.contact_tmb) + } + } + + private fun setupView(view: View, contact: Contact) { + view.apply { + contact_name.text = contact.name + contact_name.setTextColor(textColor) + + contact_number.text = contact.phoneNumber + contact_number.setTextColor(textColor) + + val placeholder = if (contact.isOrganization) { + businessContactDrawable + } else { + contactDrawable + } + + contact.updateImage(context, contact_tmb, placeholder) + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt index 3da2aa22..a3cf46e2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/models/Contact.kt @@ -12,7 +12,8 @@ data class Contact( val id: Int, var name: String, var photoUri: String, - var phoneNumber: String + var phoneNumber: String, + var isOrganization: Boolean ) { fun updateImage(context: Context, imageView: ImageView, placeholder: Drawable) { if (photoUri.isEmpty()) { diff --git a/app/src/main/res/drawable-xxhdpi/contact_circular_background.xml b/app/src/main/res/drawable-xxhdpi/contact_circular_background.xml deleted file mode 100644 index 7378e493..00000000 --- a/app/src/main/res/drawable-xxhdpi/contact_circular_background.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/drawable-xxhdpi/ic_business_vector.xml b/app/src/main/res/drawable-xxhdpi/ic_business_vector.xml new file mode 100644 index 00000000..9da2fe87 --- /dev/null +++ b/app/src/main/res/drawable-xxhdpi/ic_business_vector.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_new_message.xml b/app/src/main/res/layout/activity_new_message.xml index 0caaa0a2..fe28b080 100644 --- a/app/src/main/res/layout/activity_new_message.xml +++ b/app/src/main/res/layout/activity_new_message.xml @@ -22,7 +22,7 @@ android:importantForAccessibility="no" android:visibility="gone" /> - + app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" /> diff --git a/app/src/main/res/layout/item_autocomplete_contact.xml b/app/src/main/res/layout/item_contact.xml similarity index 100% rename from app/src/main/res/layout/item_autocomplete_contact.xml rename to app/src/main/res/layout/item_contact.xml diff --git a/app/src/main/res/layout/item_contact_with_number.xml b/app/src/main/res/layout/item_contact_with_number.xml new file mode 100644 index 00000000..aae30363 --- /dev/null +++ b/app/src/main/res/layout/item_contact_with_number.xml @@ -0,0 +1,43 @@ + + + + + + + + + +