Content provider implementation with livedata and viewmodel
ViewModelProvider(this)
.get(ContactViewModel::class.java)
.contacts.observe(this, Observer { contacts ->
with(contacts) {
tvNoContacts.visibility = if (isNotEmpty()) View.GONE else View.VISIBLE
contactAdapter.contacts = this
}
})
class ContactViewModel(
application: Application
) : AndroidViewModel(application) {
val contacts = ContactsLiveData(application.applicationContext)
}
class ContactsLiveData(
private val context: Context
) : ContentProviderLiveData<List<Contact>>(context, URI) {
companion object {
val URI: Uri = ContactsContract.Contacts.CONTENT_URI
const val ID = ContactsContract.Contacts._ID
const val DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME
}
override fun getContentProviderValue(): List<Contact> {
val projection = arrayOf(ID, DISPLAY_NAME)
return context.contentResolver
.query(URI, projection, null, null, DISPLAY_NAME)
.use {
it!!
generateSequence {
it.moveToNext()
Contact(it.getLong(0), it.getString(1))
}.take(it.count).toList()
}
}
}
original repo: absolute-z3ro/Contacts