package com.example.roomdemo
import android.util.Patterns
import androidx.databinding.Bindable
import androidx.databinding.Observable
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.roomdemo.db.Subscriber
import com.example.roomdemo.db.SubscriberRepository
import kotlinx.coroutines.launch
class SubscriberViewModel(private val repository: SubscriberRepository) : ViewModel(),Observable {
val subscribers = repository.subscribers
private var isUpdateOrDelete = false
private lateinit var subscriberToUpdateOrDelete : Subscriber
@Bindable
val inputName = MutableLiveData<String>()
@Bindable
val inputEmail = MutableLiveData<String>()
@Bindable
val saveOrUpdateButtonText = MutableLiveData<String>()
@Bindable
val clearAllOrDeleteButtonText = MutableLiveData<String>()
private val statusMessage = MutableLiveData<Event<String>>()
val message : LiveData<Event<String>>
get() = statusMessage
init {
saveOrUpdateButtonText.value = "Save"
clearAllOrDeleteButtonText.value = "Clear All"
}
fun saveOrUpdate() {
if (inputName.value == null) {
statusMessage.value = Event("Please enter subscriber's name")
} else if (inputEmail.value == null) {
statusMessage.value = Event("Please enter subscriber's email")
} else if (!Patterns.EMAIL_ADDRESS.matcher(inputEmail.value!!).matches()) {
statusMessage.value = Event("Please enter a correct email address")
} else {
if (isUpdateOrDelete) {
subscriberToUpdateOrDelete.name = inputName.value!!
subscriberToUpdateOrDelete.email = inputEmail.value!!
update(subscriberToUpdateOrDelete)
} else {
val name = inputName.value!!
val email = inputEmail.value!!
insert(Subscriber(0, name, email))
inputName.value = null
inputEmail.value = null
}
}
}
fun clearAllOrDelete() {
if(isUpdateOrDelete) {
delete(subscriberToUpdateOrDelete)
}else {
clearAll()
}
}
fun insert(subscriber: Subscriber)= viewModelScope.launch {
val newRowId: Long = repository.insert(subscriber)
if(newRowId>-1) {
statusMessage.value = Event("Subscriber Inserted Successfully $newRowId")
}else{
statusMessage.value = Event("Error Occurred")
}
}
fun update(subscriber: Subscriber) = viewModelScope.launch {
val noOfRows = repository.update(subscriber)
if(noOfRows>0) {
inputName.value = null
inputEmail.value = null
isUpdateOrDelete = false
saveOrUpdateButtonText.value = "Save"
clearAllOrDeleteButtonText.value = "Clear All"
statusMessage.value = Event("$noOfRows Row Updated Successfully")
}else{
statusMessage.value = Event("Error Occurred")
}
}
fun delete(subscriber: Subscriber) = viewModelScope.launch {
val noOfRowsDeleted = repository.delete(subscriber)
if(noOfRowsDeleted>0){
inputName.value = null
inputEmail.value = null
isUpdateOrDelete = false
saveOrUpdateButtonText.value = "Save"
clearAllOrDeleteButtonText.value = "Clear All"
statusMessage.value = Event("$noOfRowsDeleted Row Deleted Successfully")
}else{
statusMessage.value = Event(
"Error Occurred"
)
}
}
fun clearAll()=viewModelScope.launch {
val noOfRowsDeleted = repository.deleteAll()
if(noOfRowsDeleted>0) {
statusMessage.value = Event("$noOfRowsDeleted Deleted Successfully")
}else{
statusMessage.value = Event("Error Occurred")
}
}
fun initUpdateAndDelete(subscriber: Subscriber) {
inputName.value = subscriber.name
inputEmail.value = subscriber.email
isUpdateOrDelete = true
subscriberToUpdateOrDelete = subscriber
saveOrUpdateButtonText.value = "Update"
clearAllOrDeleteButtonText.value = "Delete"
}
override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
}
override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
}
}
package com.example.roomdemo
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.roomdemo.databinding.ActivityMainBinding
import com.example.roomdemo.db.Subscriber
import com.example.roomdemo.db.SubscriberDatabase
import com.example.roomdemo.db.SubscriberRepository
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var subscriberViewModel: SubscriberViewModel
private lateinit var adapter: MyRecyclerViewAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
val dao = SubscriberDatabase.getInstance(application).subscriberDAO
val repository = SubscriberRepository(dao)
val factory = SubscriberViewModelFactory(repository)
subscriberViewModel = ViewModelProvider(this,factory).get(SubscriberViewModel::class.java)
binding.myViewModel = subscriberViewModel
binding.lifecycleOwner = this
initRecyclerView()
subscriberViewModel.message.observe(this, Observer {
it.getContentIfNotHandled()?.let {
Toast.makeText(this, it, Toast.LENGTH_LONG).show()
}
})
}
private fun initRecyclerView() {
binding.subscriberRecyclerView.layoutManager = LinearLayoutManager(this)
adapter = MyRecyclerViewAdapter({selecteditem:Subscriber->listItemClicked(selecteditem)})
binding.subscriberRecyclerView.adapter = adapter
displaySubscribersList()
}
private fun displaySubscribersList() {
subscriberViewModel.subscribers.observe(this, Observer {
adapter.setList(it)
adapter.notifyDataSetChanged()
})
}
private fun listItemClicked(subscriber: Subscriber) {
subscriberViewModel.initUpdateAndDelete(subscriber)
}
}
No comments:
Post a Comment