class EmailSignInViewModel : GuestRxViewModel(), EmailSignInContract.ViewModel { override fun onEmailUpdate(input: Editable) { val email = input.toString() if (InputUtils.isValidEmail(email)) { emailError.set("") } else { emailError.set(getApplicationString(R.string.auth_error_invalid_email)) } emailSubject.onNext(email) } override fun onPasswordUpdate(input: Editable) { val password = input.toString() if (InputUtils.isValidPassword(password)) { passwordError.set("") } else { passwordError.set(getApplicationString(R.string.auth_error_invalid_password)) } passwordSubject.onNext(password) } override val emailError: ObservableField = ObservableField("") override val passwordError: ObservableField = ObservableField("") override val submitEnable = ObservableField(false) override fun email(): String = emailSubject.value override fun password(): String = passwordSubject.value protected val emailSubject: BehaviorSubject = BehaviorSubject.create() protected val passwordSubject: BehaviorSubject = BehaviorSubject.create() open fun init() { addDisposables( Observable .combineLatest(emailSubject, passwordSubject, BiFunction> { email, password -> return@BiFunction Pair(email, password) }) .subscribe({ (email, password) -> submitEnable.set(InputUtils.isValidEmail(email) && InputUtils.isValidPassword(password)) }) ) } }