Skip to content

Instantly share code, notes, and snippets.

@nectarine
Created July 3, 2017 09:13
Show Gist options
  • Save nectarine/ca15a5cb0eddbefd4b1fa70a06c8c2c8 to your computer and use it in GitHub Desktop.
Save nectarine/ca15a5cb0eddbefd4b1fa70a06c8c2c8 to your computer and use it in GitHub Desktop.

Revisions

  1. nectarine created this gist Jul 3, 2017.
    44 changes: 44 additions & 0 deletions EmailSignInViewModel.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,44 @@
    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))
    })
    )
    }
    }
    20 changes: 20 additions & 0 deletions dark_plain_border_button.xml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,20 @@
    <?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>
    94 changes: 94 additions & 0 deletions fragment_email_sign_in.xml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,94 @@
    <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>