@@ -19,6 +19,7 @@ import com.facebook.stetho.okhttp3.StethoInterceptor
1919import com.squareup.moshi.Moshi
2020import io.fabric.sdk.android.Fabric
2121import io.reactivex.Completable
22+ import io.reactivex.Flowable
2223import io.reactivex.android.schedulers.AndroidSchedulers
2324import io.reactivex.disposables.CompositeDisposable
2425import io.reactivex.schedulers.Schedulers
@@ -30,14 +31,14 @@ import retrofit2.converter.moshi.MoshiConverterFactory
3031
3132class MainActivity : AppCompatActivity () {
3233
33- private val binding: ActivityMainBinding by lazy {
34- DataBindingUtil .setContentView<ActivityMainBinding >(this , R .layout.activity_main)
35- }
34+ private lateinit var binding: ActivityMainBinding
3635
3736 private val validatableViewsForTriggerTextChanged: ArrayList <ValidatableView > = ArrayList ()
3837
3938 private val validatableViewsForTriggerFocusChanged: ArrayList <ValidatableView > = ArrayList ()
4039
40+ private val validatableViewsForButtonEnable: ArrayList <ValidatableView > = ArrayList ()
41+
4142 private val compositeDisposable = CompositeDisposable ()
4243
4344 private val api = Retrofit .Builder ()
@@ -52,13 +53,17 @@ class MainActivity : AppCompatActivity() {
5253 super .onCreate(savedInstanceState)
5354 Fabric .with (this , Crashlytics ())
5455
56+ binding = DataBindingUtil .setContentView(this , R .layout.activity_main)
57+
5558 initValidators()
5659
5760 binding.submit.setOnClickListener(this ::onSubmitClick)
5861 binding.submit2.setOnClickListener(this ::onSubmit2Click)
62+ binding.submit3.setOnClickListener(this ::onSubmit3Click)
5963 }
6064
6165 private fun initValidators () {
66+ // Example 1
6267 validatableViewsForTriggerTextChanged.addAll(arrayOf(
6368 binding.firstName.register(RequiredValidator (getString(R .string.validation_error_required))),
6469 binding.lastName.register(RequiredValidator (getString(R .string.validation_error_required))),
@@ -67,13 +72,29 @@ class MainActivity : AppCompatActivity() {
6772 binding.asciiOnly.register(AsciiOnlyValidator (getString(R .string.validation_error_ascii_only)))
6873 ))
6974
75+ // Example 2
7076 validatableViewsForTriggerFocusChanged.addAll(arrayOf(
7177 binding.email2.register(EmailValidator (getString(R .string.validation_error_email)))
7278 ))
7379
80+ // Example 3
7481 binding.colors.register(MaterialDesignColorsValidator (api, this ))
82+
83+ // Example 4
84+ validatableViewsForButtonEnable.addAll(arrayOf(
85+ binding.firstName2.register(RequiredValidator (getString(R .string.validation_error_required))),
86+ binding.lastName2.register(RequiredValidator (getString(R .string.validation_error_required)))
87+ ))
88+ val validations: List <Flowable <Any >> = validatableViewsForButtonEnable.flatMap { it.validationFlowables }
89+ Flowable .zip(validations) { Any () }
90+ .subscribeOn(Schedulers .computation())
91+ .observeOn(AndroidSchedulers .mainThread())
92+ .doOnError({ binding.submit3.isEnabled = false })
93+ .retry() // non-terminated stream
94+ .subscribe({ binding.submit3.isEnabled = true }, { })
7595 }
7696
97+
7798 private fun onSubmitClick (@Suppress(" UNUSED_PARAMETER" ) view : View ) {
7899 val validations: List <Completable > = validatableViewsForTriggerTextChanged.map { it.validateAsCompletable() }
79100 validate(validations)
@@ -84,6 +105,10 @@ class MainActivity : AppCompatActivity() {
84105 validate(validations)
85106 }
86107
108+ private fun onSubmit3Click (@Suppress(" UNUSED_PARAMETER" ) view : View ) {
109+ Toast .makeText(this , R .string.validation_success, Toast .LENGTH_SHORT ).show()
110+ }
111+
87112 private fun validate (validations : List <Completable >) {
88113 compositeDisposable.clear()
89114
0 commit comments