From d807df4f976d4ef94c48a9bdb77f230f0c78cc7a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 30 Dec 2017 13:22:18 +0100 Subject: [PATCH] show a list of contacts for managing favorites at FAB press --- .../contacts/adapters/AddFavoritesAdapter.kt | 110 ++++++++++++++++++ .../contacts/dialogs/AddFavoritesDialog.kt | 38 ++++++ .../contacts/fragments/FavoritesFragment.kt | 3 + .../main/res/layout/dialog_add_favorites.xml | 11 ++ .../layout/item_add_favorite_with_number.xml | 63 ++++++++++ .../item_add_favorite_without_number.xml | 52 +++++++++ 6 files changed, 277 insertions(+) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/adapters/AddFavoritesAdapter.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt create mode 100644 app/src/main/res/layout/dialog_add_favorites.xml create mode 100644 app/src/main/res/layout/item_add_favorite_with_number.xml create mode 100644 app/src/main/res/layout/item_add_favorite_without_number.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/AddFavoritesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/AddFavoritesAdapter.kt new file mode 100644 index 00000000..244c0a96 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/AddFavoritesAdapter.kt @@ -0,0 +1,110 @@ +package com.simplemobiletools.contacts.adapters + +import android.graphics.drawable.Drawable +import android.support.v7.widget.RecyclerView +import android.util.SparseArray +import android.view.View +import android.view.ViewGroup +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.bumptech.glide.signature.ObjectKey +import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor +import com.simplemobiletools.commons.interfaces.MyAdapterListener +import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.helpers.Config +import com.simplemobiletools.contacts.models.Contact +import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.* +import java.util.* + +class AddFavoritesAdapter(val activity: SimpleActivity, val contacts: List) : RecyclerView.Adapter() { + private val itemViews = SparseArray() + private val selectedPositions = HashSet() + 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 itemLayout = if (config.showPhoneNumbers) R.layout.item_add_favorite_with_number else R.layout.item_add_favorite_without_number + + private fun toggleItemSelection(select: Boolean, pos: Int) { + if (select) { + if (itemViews[pos] != null) { + selectedPositions.add(pos) + } + } else { + selectedPositions.remove(pos) + } + + itemViews[pos]?.contact_checkbox?.isChecked = select + } + + private val adapterListener = object : MyAdapterListener { + override fun toggleItemSelectionAdapter(select: Boolean, position: Int) { + toggleItemSelection(select, position) + } + + override fun getSelectedPositions() = selectedPositions + + override fun itemLongClicked(position: Int) {} + } + + fun getSelectedItemsSet(): HashSet { + val selectedItemsSet = HashSet(selectedPositions.size) + selectedPositions.forEach { selectedItemsSet.add(contacts[it].id.toString()) } + return selectedItemsSet + } + + override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { + val view = activity.layoutInflater.inflate(itemLayout, parent, false) + return ViewHolder(view, adapterListener, activity) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val eventType = contacts[position] + itemViews.put(position, holder.bindView(eventType, startNameWithSurname, contactDrawable, config)) + toggleItemSelection(selectedPositions.contains(position), position) + } + + override fun getItemCount() = contacts.size + + class ViewHolder(view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity) : RecyclerView.ViewHolder(view) { + fun bindView(contact: Contact, startNameWithSurname: Boolean, contactDrawable: Drawable, config: Config): View { + itemView.apply { + contact_checkbox.setColors(config.textColor, config.primaryColor, config.backgroundColor) + val textColor = config.textColor + + contact_name.text = contact.getFullName(startNameWithSurname) + contact_name.setTextColor(textColor) + contact_number?.text = contact.phoneNumbers.firstOrNull()?.value ?: "" + contact_number?.setTextColor(textColor) + contact_frame.setOnClickListener { viewClicked(!contact_checkbox.isChecked) } + + if (contact.photoUri.isNotEmpty()) { + val options = RequestOptions() + .signature(ObjectKey(contact.photoUri)) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .error(contactDrawable) + .centerCrop() + + Glide.with(activity).load(contact.photoUri).transition(DrawableTransitionOptions.withCrossFade()).apply(options).into(contact_tmb) + } else { + contact_tmb.setImageDrawable(contactDrawable) + } + } + + return itemView + } + + private fun viewClicked(select: Boolean) { + adapterListener.toggleItemSelectionAdapter(select, adapterPosition) + } + } + + override fun onViewRecycled(holder: ViewHolder?) { + super.onViewRecycled(holder) + Glide.with(activity).clear(holder?.itemView?.contact_tmb) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt new file mode 100644 index 00000000..62b25097 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/AddFavoritesDialog.kt @@ -0,0 +1,38 @@ +package com.simplemobiletools.contacts.dialogs + +import android.support.v7.app.AlertDialog +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.adapters.AddFavoritesAdapter +import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.models.Contact +import kotlinx.android.synthetic.main.dialog_add_favorites.view.* + +class AddFavoritesDialog(val activity: SimpleActivity, val callback: () -> Unit) { + var dialog: AlertDialog? = null + private var view = activity.layoutInflater.inflate(R.layout.dialog_add_favorites, null) + + init { + ContactsHelper(activity).getContacts { + Contact.sorting = activity.config.sorting + it.sort() + view.add_favorites_list.adapter = AddFavoritesAdapter(activity, it) + + activity.runOnUiThread { + dialog = AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() }) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this) + } + } + } + } + + private fun dialogConfirmed() { + val selectedItems = (view.add_favorites_list.adapter as AddFavoritesAdapter).getSelectedItemsSet() + dialog?.dismiss() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt index 7828a604..30c0652f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/FavoritesFragment.kt @@ -3,6 +3,7 @@ package com.simplemobiletools.contacts.fragments import android.content.Context import android.util.AttributeSet import com.simplemobiletools.contacts.activities.MainActivity +import com.simplemobiletools.contacts.dialogs.AddFavoritesDialog import kotlinx.android.synthetic.main.fragment_favorites.view.* class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { @@ -29,6 +30,8 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } private fun addNewFavorites() { + AddFavoritesDialog(activity!!) { + } } } diff --git a/app/src/main/res/layout/dialog_add_favorites.xml b/app/src/main/res/layout/dialog_add_favorites.xml new file mode 100644 index 00000000..87b08db0 --- /dev/null +++ b/app/src/main/res/layout/dialog_add_favorites.xml @@ -0,0 +1,11 @@ + + diff --git a/app/src/main/res/layout/item_add_favorite_with_number.xml b/app/src/main/res/layout/item_add_favorite_with_number.xml new file mode 100644 index 00000000..b146c91b --- /dev/null +++ b/app/src/main/res/layout/item_add_favorite_with_number.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_add_favorite_without_number.xml b/app/src/main/res/layout/item_add_favorite_without_number.xml new file mode 100644 index 00000000..753183f0 --- /dev/null +++ b/app/src/main/res/layout/item_add_favorite_without_number.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + +