Skip to content

Commit

Permalink
Merge pull request #24 from Kyash/create_sample
Browse files Browse the repository at this point in the history
Added example
  • Loading branch information
konifar authored Jan 19, 2018
2 parents 94d0678 + a933427 commit d54ab03
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 11 deletions.
31 changes: 28 additions & 3 deletions example/src/main/java/co/kyash/vtl/example/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import com.facebook.stetho.okhttp3.StethoInterceptor
import com.squareup.moshi.Moshi
import io.fabric.sdk.android.Fabric
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.schedulers.Schedulers
Expand All @@ -30,14 +31,14 @@ import retrofit2.converter.moshi.MoshiConverterFactory

class MainActivity : AppCompatActivity() {

private val binding: ActivityMainBinding by lazy {
DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
}
private lateinit var binding: ActivityMainBinding

private val validatableViewsForTriggerTextChanged: ArrayList<ValidatableView> = ArrayList()

private val validatableViewsForTriggerFocusChanged: ArrayList<ValidatableView> = ArrayList()

private val validatableViewsForButtonEnable: ArrayList<ValidatableView> = ArrayList()

private val compositeDisposable = CompositeDisposable()

private val api = Retrofit.Builder()
Expand All @@ -52,13 +53,17 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
Fabric.with(this, Crashlytics())

binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

initValidators()

binding.submit.setOnClickListener(this::onSubmitClick)
binding.submit2.setOnClickListener(this::onSubmit2Click)
binding.submit3.setOnClickListener(this::onSubmit3Click)
}

private fun initValidators() {
// Example 1
validatableViewsForTriggerTextChanged.addAll(arrayOf(
binding.firstName.register(RequiredValidator(getString(R.string.validation_error_required))),
binding.lastName.register(RequiredValidator(getString(R.string.validation_error_required))),
Expand All @@ -67,13 +72,29 @@ class MainActivity : AppCompatActivity() {
binding.asciiOnly.register(AsciiOnlyValidator(getString(R.string.validation_error_ascii_only)))
))

// Example 2
validatableViewsForTriggerFocusChanged.addAll(arrayOf(
binding.email2.register(EmailValidator(getString(R.string.validation_error_email)))
))

// Example 3
binding.colors.register(MaterialDesignColorsValidator(api, this))

// Example 4
validatableViewsForButtonEnable.addAll(arrayOf(
binding.firstName2.register(RequiredValidator(getString(R.string.validation_error_required))),
binding.lastName2.register(RequiredValidator(getString(R.string.validation_error_required)))
))
val validations: List<Flowable<Any>> = validatableViewsForButtonEnable.flatMap { it.validationFlowables }
Flowable.zip(validations) { Any() }
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.doOnError({ binding.submit3.isEnabled = false })
.retry() // non-terminated stream
.subscribe({ binding.submit3.isEnabled = true }, { })
}


private fun onSubmitClick(@Suppress("UNUSED_PARAMETER") view: View) {
val validations: List<Completable> = validatableViewsForTriggerTextChanged.map { it.validateAsCompletable() }
validate(validations)
Expand All @@ -84,6 +105,10 @@ class MainActivity : AppCompatActivity() {
validate(validations)
}

private fun onSubmit3Click(@Suppress("UNUSED_PARAMETER") view: View) {
Toast.makeText(this, R.string.validation_success, Toast.LENGTH_SHORT).show()
}

private fun validate(validations: List<Completable>) {
compositeDisposable.clear()

Expand Down
5 changes: 5 additions & 0 deletions example/src/main/res/drawable/btn_accent.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/grey500" android:state_enabled="false" />
<item android:color="@color/accent" />
</selector>
71 changes: 67 additions & 4 deletions example/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -120,9 +120,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/space_16dp"
android:background="@color/accent"
android:text="@string/submit"
android:textColor="@color/white" />
android:theme="@style/AccentButton" />

</LinearLayout>

Expand Down Expand Up @@ -167,9 +166,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/space_16dp"
android:background="@color/accent"
android:text="@string/submit"
android:textColor="@color/white" />
android:theme="@style/AccentButton" />

</LinearLayout>

Expand Down Expand Up @@ -219,6 +217,71 @@

</android.support.v7.widget.CardView>

<TextView
style="@style/Title"
android:layout_marginTop="@dimen/space_32dp"
android:text="@string/change_button_enabled" />

<TextView
style="@style/Description"
android:layout_marginTop="@dimen/space_8dp"
android:text="@string/change_button_enabled_description" />

<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/space_16dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/space_16dp"
android:paddingEnd="@dimen/space_16dp"
android:paddingLeft="@dimen/space_16dp"
android:paddingRight="@dimen/space_16dp"
android:paddingStart="@dimen/space_16dp"
android:paddingTop="@dimen/space_8dp">

<!-- Email -->
<co.kyash.vtl.ValidatableTextInputLayout
android:id="@+id/first_name_2"
style="@style/InputRow"
app:trigger="text_changed">

<EditText
style="@style/BaseEditText"
android:hint="@string/first_name"
android:inputType="textPersonName" />

</co.kyash.vtl.ValidatableTextInputLayout>

<!-- Last name -->
<co.kyash.vtl.ValidatableTextInputLayout
android:id="@+id/last_name_2"
style="@style/InputRow"
app:trigger="text_changed">

<EditText
style="@style/BaseEditText"
android:hint="@string/last_name"
android:inputType="textPersonName" />

</co.kyash.vtl.ValidatableTextInputLayout>

<Button
android:id="@+id/submit_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/space_16dp"
android:enabled="false"
android:text="@string/submit"
android:theme="@style/AccentButton" />

</LinearLayout>

</android.support.v7.widget.CardView>

</LinearLayout>

</ScrollView>
Expand Down
3 changes: 3 additions & 0 deletions example/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,7 @@

<string name="validation_error_occurred">Error occurred</string>
<string name="validation_success">Success</string>

<string name="change_button_enabled">Change button enable</string>
<string name="change_button_enabled_description">Validation with changing button enable</string>
</resources>
5 changes: 5 additions & 0 deletions example/src/main/res/values/themes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,9 @@
<item name="android:windowBackground">@color/grey200</item>
</style>

<style name="AccentButton" parent="Base.Widget.AppCompat.Button">
<item name="colorButtonNormal">@drawable/btn_accent</item>
<item name="android:textColor">@color/white</item>
</style>

</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
defStyleAttr: Int = 0
) : TextInputLayout(context, attrs, defStyleAttr), ValidatableView {

override val validationFlowables: ArrayList<Flowable<Any>> = ArrayList()

companion object {
private val FOCUS_CHANGED = 1
private val TEXT_CHANGED = 1 shl 1
Expand All @@ -51,8 +53,6 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
a.recycle()
}

val textInputAwareValidationFlowables: ArrayList<Flowable<Any>> = ArrayList()

private val textProcessor: FlowableProcessor<String> = PublishProcessor.create()

private val compositeDisposable: CompositeDisposable = CompositeDisposable()
Expand Down Expand Up @@ -81,7 +81,7 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
shouldValidateOnTextChangedOnce = false
compositeDisposable.clear()
compositeDisposable.add(
Flowable.zip(textInputAwareValidationFlowables) { Any() }
Flowable.zip(validationFlowables) { Any() }
.doOnError({ this.showErrorMessage(it) })
.retry() // non-terminated stream
.subscribeOn(Schedulers.computation())
Expand Down Expand Up @@ -183,7 +183,7 @@ class ValidatableTextInputLayout @JvmOverloads constructor(

this.validators.addAll(validators)

this.validators.mapTo(textInputAwareValidationFlowables) {
this.validators.mapTo(validationFlowables) {
textProcessor.onBackpressureDrop()
.throttleLast(validationInterval, TimeUnit.MILLISECONDS)
// hack to emit an event to `onNext` when completable is completed.
Expand Down
3 changes: 3 additions & 0 deletions library/src/main/java/co/kyash/vtl/ValidatableView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ package co.kyash.vtl

import co.kyash.vtl.validators.VtlValidator
import io.reactivex.Completable
import io.reactivex.Flowable

interface ValidatableView {

val validationFlowables: ArrayList<Flowable<Any>>

fun validate(): Boolean

fun validateAsCompletable(): Completable
Expand Down

0 comments on commit d54ab03

Please sign in to comment.