ViewModles
ViewModel
class UserViewModel(private val dataSource: UserDao) : ViewModel() {
fun userName(): Flowable<String> {
return dataSource.getUserById(USER_ID)
.map { user -> user.userName }
}
fun updateUserName(userName: String): Completable {
return Completable.fromAction {
val user = User(USER_ID, userName)
dataSource.insertUser(user)
}
}
companion object {
const val USER_ID = "1"
}
}
ViewModelFactory
class ViewModelFactory(private val dataSource: UserDao) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(UserViewModel::class.java)) {
return UserViewModel(dataSource) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
class UserActivity : AppCompatActivity() {
private lateinit var viewModelFactory: ViewModelFactory
private lateinit var viewModel: UserViewModel
private val disposable = CompositeDisposable()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_user)
viewModelFactory = Injection.provideViewModelFactory(this)
viewModel = ViewModelProviders.of(this, viewModelFactory).get(UserViewModel::class.java)
update_user_button.setOnClickListener { updateUserName() }
}
override fun onStart() {
super.onStart()
disposable.add(viewModel.userName()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ this.user_name.text = it },
{ error -> Log.e(TAG, "Unable to get username", error) }))
}
override fun onStop() {
super.onStop()
disposable.clear()
}
private fun updateUserName() {
val userName = user_name_input.text.toString()
update_user_button.isEnabled = false
disposable.add(viewModel.updateUserName(userName)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ update_user_button.isEnabled = true },
{ error -> Log.e(TAG, "Unable to update username", error) }))
}
companion object {
private val TAG = UserActivity::class.java.simpleName
}
}