Skip to content

Instantly share code, notes, and snippets.

@nectarine
Created July 3, 2017 09:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nectarine/ca15a5cb0eddbefd4b1fa70a06c8c2c8 to your computer and use it in GitHub Desktop.
Save nectarine/ca15a5cb0eddbefd4b1fa70a06c8c2c8 to your computer and use it in GitHub Desktop.
Android MVVM
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true">
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?colorControlHighlight">
<item>
<shape android:shape="rectangle">
<stroke android:width="1dp" android:color="@color/white" />
<solid android:color="?android:windowBackground" />
</shape>
</item>
</ripple>
</item>
<item>
<shape android:shape="rectangle">
<stroke android:width="1dp" android:color="@color/grey_disabled" />
<solid android:color="?android:windowBackground" />
</shape>
</item>
</selector>
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<String> = ObservableField("")
override val passwordError: ObservableField<String> = ObservableField("")
override val submitEnable = ObservableField<Boolean>(false)
override fun email(): String = emailSubject.value
override fun password(): String = passwordSubject.value
protected val emailSubject: BehaviorSubject<String> = BehaviorSubject.create()
protected val passwordSubject: BehaviorSubject<String> = BehaviorSubject.create()
open fun init() {
addDisposables(
Observable
.combineLatest(emailSubject, passwordSubject, BiFunction<String, String, Pair<String, String>> { email, password -> return@BiFunction Pair(email, password) })
.subscribe({
(email, password) ->
submitEnable.set(InputUtils.isValidEmail(email) && InputUtils.isValidPassword(password))
})
)
}
}
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="view"
type="com.acciio.homeapp.ui.auth.sign.email.EmailSignInContract.View" />
<variable
name="vm"
type="com.acciio.homeapp.ui.auth.sign.email.EmailSignInContract.ViewModel" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="40dp"
android:paddingRight="40dp"
tools:context="com.acciio.homeapp.ui.auth.sign.email.EmailSignInFragment">
<android.support.design.widget.TextInputLayout
android:id="@+id/email_auth_text_email"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:error="@{vm.emailError}"
app:errorEnabled="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<android.support.design.widget.TextInputEditText
android:id="@+id/email_auth_edit_text_email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:afterTextChanged="@{vm::onEmailUpdate}"
android:hint="@string/auth_hint_email_address"
android:inputType="textEmailAddress" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/email_auth_text_password"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:error="@{vm.passwordError}"
app:errorEnabled="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/email_auth_text_email">
<android.support.design.widget.TextInputEditText
android:id="@+id/email_auth_edit_text_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:afterTextChanged="@{vm::onPasswordUpdate}"
android:hint="@string/auth_hint_email_password"
android:inputType="textPassword" />
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/email_auth_button"
style="@style/DarkPlainBorderButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:enabled="@{safeUnbox(vm.submitEnable)}"
android:onClick="@{(v) -> view.onEmailAuth(vm.email(), vm.password())}"
android:text="@string/auth_sign_in_email"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/email_auth_text_password" />
<Button
android:id="@+id/button6"
style="@style/DarkPlainBorderlessButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:onClick="@{(v)->view.onPasswordReset()}"
android:text="@string/auth_email_password_find"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/email_auth_button"
app:layout_constraintVertical_bias="1.0"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="566dp" />
</android.support.constraint.ConstraintLayout>
</layout>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment