add a dialog for filtering contacts by source

This commit is contained in:
tibbi 2017-12-12 18:39:14 +01:00
parent 7373cad71c
commit d22e27ae40
10 changed files with 191 additions and 1 deletions

View File

@ -32,5 +32,5 @@ android {
}
dependencies {
implementation 'com.simplemobiletools:commons:3.2.15'
implementation 'com.simplemobiletools:commons:3.2.16'
}

View File

@ -16,6 +16,7 @@ import com.simplemobiletools.contacts.BuildConfig
import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.adapters.ContactsAdapter
import com.simplemobiletools.contacts.dialogs.ChangeSortingDialog
import com.simplemobiletools.contacts.dialogs.FilterContactSourcesDialog
import com.simplemobiletools.contacts.extensions.config
import com.simplemobiletools.contacts.extensions.openContact
import com.simplemobiletools.contacts.extensions.startCallIntent
@ -83,6 +84,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.sort -> showSortingDialog()
R.id.filter -> showFilterDialog()
R.id.settings -> startActivity(Intent(applicationContext, SettingsActivity::class.java))
R.id.about -> launchAbout()
else -> return super.onOptionsItemSelected(item)
@ -96,6 +98,12 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
}
}
private fun showFilterDialog() {
FilterContactSourcesDialog(this) {
initContacts()
}
}
private fun launchAbout() {
startAboutActivity(R.string.app_name, LICENSE_KOTLIN or LICENSE_MULTISELECT, BuildConfig.VERSION_NAME)
}

View File

@ -0,0 +1,83 @@
package com.simplemobiletools.contacts.adapters
import android.support.v7.widget.RecyclerView
import android.util.SparseArray
import android.view.View
import android.view.ViewGroup
import com.simplemobiletools.commons.interfaces.MyAdapterListener
import com.simplemobiletools.contacts.R
import com.simplemobiletools.contacts.activities.SimpleActivity
import com.simplemobiletools.contacts.extensions.config
import kotlinx.android.synthetic.main.filter_contact_source_view.view.*
import java.util.*
class FilterContactSourcesAdapter(val activity: SimpleActivity, val contactSources: List<String>, val displayContactSources: Set<String>) :
RecyclerView.Adapter<FilterContactSourcesAdapter.ViewHolder>() {
private val itemViews = SparseArray<View>()
private val selectedPositions = HashSet<Int>()
init {
contactSources.forEachIndexed { index, value ->
if ((displayContactSources.size == 1 && displayContactSources.first() == "-1") || displayContactSources.contains(value)) {
selectedPositions.add(index)
}
}
}
private fun toggleItemSelection(select: Boolean, pos: Int) {
if (select) {
if (itemViews[pos] != null) {
selectedPositions.add(pos)
}
} else {
selectedPositions.remove(pos)
}
itemViews[pos]?.filter_contact_source_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<String> {
val selectedItemsSet = HashSet<String>(selectedPositions.size)
selectedPositions.forEach { selectedItemsSet.add(contactSources[it]) }
return selectedItemsSet
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val view = activity.layoutInflater.inflate(R.layout.filter_contact_source_view, parent, false)
return ViewHolder(view, adapterListener, activity)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val contactSource = contactSources[position]
itemViews.put(position, holder.bindView(contactSource))
toggleItemSelection(selectedPositions.contains(position), position)
}
override fun getItemCount() = contactSources.size
class ViewHolder(view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity) : RecyclerView.ViewHolder(view) {
fun bindView(contactSource: String): View {
itemView.apply {
filter_contact_source_checkbox.setColors(activity.config.textColor, activity.config.primaryColor, activity.config.backgroundColor)
filter_contact_source_checkbox.text = contactSource
filter_contact_source_holder.setOnClickListener { viewClicked(!filter_contact_source_checkbox.isChecked) }
}
return itemView
}
private fun viewClicked(select: Boolean) {
adapterListener.toggleItemSelectionAdapter(select, adapterPosition)
}
}
}

View File

@ -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.FilterContactSourcesAdapter
import com.simplemobiletools.contacts.extensions.config
import com.simplemobiletools.contacts.helpers.ContactsHelper
import kotlinx.android.synthetic.main.dialog_filter_contact_sources.view.*
class FilterContactSourcesDialog(val activity: SimpleActivity, val callback: () -> Unit) {
var dialog: AlertDialog
val view = activity.layoutInflater.inflate(R.layout.dialog_filter_contact_sources, null)
init {
ContactsHelper(activity).getContactSources {
val selectedSources = activity.config.displayContactSources
view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, it, selectedSources)
}
dialog = AlertDialog.Builder(activity)
.setPositiveButton(R.string.ok, { dialogInterface, i -> confirmEventTypes() })
.setNegativeButton(R.string.cancel, null)
.create().apply {
activity.setupDialogStuff(view, this)
}
}
private fun confirmEventTypes() {
val selectedItems = (view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedItemsSet()
if (activity.config.displayContactSources != selectedItems) {
activity.config.displayContactSources = selectedItems
callback()
}
dialog.dismiss()
}
}

View File

@ -16,4 +16,8 @@ class Config(context: Context) : BaseConfig(context) {
var callContact: Boolean
get() = prefs.getBoolean(CALL_CONTACT_ON_CLICK, false)
set(callContact) = prefs.edit().putBoolean(CALL_CONTACT_ON_CLICK, callContact).apply()
var displayContactSources: Set<String>
get() = prefs.getStringSet(DISPLAY_CONTACT_SOURCES, hashSetOf("-1"))
set(displayContactSources) = prefs.edit().remove(DISPLAY_CONTACT_SOURCES).putStringSet(DISPLAY_CONTACT_SOURCES, displayContactSources).apply()
}

View File

@ -2,6 +2,7 @@ package com.simplemobiletools.contacts.helpers
// shared prefs
val CALL_CONTACT_ON_CLICK = "call_contact_on_click"
val DISPLAY_CONTACT_SOURCES = "display_contact_sources"
val SORTING = "sorting"
val CONTACT_ID = "contact_id"

View File

@ -10,8 +10,30 @@ import com.simplemobiletools.commons.helpers.SORT_DESCENDING
import com.simplemobiletools.contacts.activities.SimpleActivity
import com.simplemobiletools.contacts.extensions.config
import com.simplemobiletools.contacts.models.Contact
import java.util.*
class ContactsHelper(val activity: SimpleActivity) {
fun getContactSources(callback: (ArrayList<String>) -> Unit) {
val accounts = HashSet<String>()
Thread {
val uri = ContactsContract.RawContacts.CONTENT_URI
val projection = arrayOf(ContactsContract.RawContacts.ACCOUNT_NAME)
var cursor: Cursor? = null
try {
cursor = activity.contentResolver.query(uri, projection, null, null, null)
if (cursor?.moveToFirst() == true) {
do {
accounts.add(cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME))
} while (cursor.moveToNext())
}
} finally {
cursor?.close()
}
callback(ArrayList<String>(accounts))
}.start()
}
fun getContacts(callback: (ArrayList<Contact>) -> Unit) {
val contacts = HashMap<Int, Contact>()
Thread {

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/filter_contact_sources_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:overScrollMode="never"
android:paddingTop="@dimen/medium_margin"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"/>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/filter_contact_source_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/normal_margin">
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/filter_contact_source_checkbox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/medium_margin"
android:clickable="false"
android:paddingLeft="@dimen/small_margin"/>
</RelativeLayout>

View File

@ -6,6 +6,11 @@
android:icon="@drawable/ic_sort"
android:title="@string/sort_by"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/filter"
android:icon="@drawable/ic_filter"
android:title="@string/filter"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/settings"
android:title="@string/settings"