Skip to content

Commit d54ab03

Browse files
authored
Merge pull request #24 from Kyash/create_sample
Added example
2 parents 94d0678 + a933427 commit d54ab03

File tree

7 files changed

+115
-11
lines changed

7 files changed

+115
-11
lines changed

example/src/main/java/co/kyash/vtl/example/MainActivity.kt

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.facebook.stetho.okhttp3.StethoInterceptor
1919
import com.squareup.moshi.Moshi
2020
import io.fabric.sdk.android.Fabric
2121
import io.reactivex.Completable
22+
import io.reactivex.Flowable
2223
import io.reactivex.android.schedulers.AndroidSchedulers
2324
import io.reactivex.disposables.CompositeDisposable
2425
import io.reactivex.schedulers.Schedulers
@@ -30,14 +31,14 @@ import retrofit2.converter.moshi.MoshiConverterFactory
3031

3132
class 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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item android:color="@color/grey500" android:state_enabled="false" />
4+
<item android:color="@color/accent" />
5+
</selector>

example/src/main/res/layout/activity_main.xml

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,8 @@
120120
android:layout_width="match_parent"
121121
android:layout_height="wrap_content"
122122
android:layout_marginTop="@dimen/space_16dp"
123-
android:background="@color/accent"
124123
android:text="@string/submit"
125-
android:textColor="@color/white" />
124+
android:theme="@style/AccentButton" />
126125

127126
</LinearLayout>
128127

@@ -167,9 +166,8 @@
167166
android:layout_width="match_parent"
168167
android:layout_height="wrap_content"
169168
android:layout_marginTop="@dimen/space_16dp"
170-
android:background="@color/accent"
171169
android:text="@string/submit"
172-
android:textColor="@color/white" />
170+
android:theme="@style/AccentButton" />
173171

174172
</LinearLayout>
175173

@@ -219,6 +217,71 @@
219217

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

220+
<TextView
221+
style="@style/Title"
222+
android:layout_marginTop="@dimen/space_32dp"
223+
android:text="@string/change_button_enabled" />
224+
225+
<TextView
226+
style="@style/Description"
227+
android:layout_marginTop="@dimen/space_8dp"
228+
android:text="@string/change_button_enabled_description" />
229+
230+
<android.support.v7.widget.CardView
231+
android:layout_width="match_parent"
232+
android:layout_height="wrap_content"
233+
android:layout_marginTop="@dimen/space_16dp">
234+
235+
<LinearLayout
236+
android:layout_width="match_parent"
237+
android:layout_height="match_parent"
238+
android:orientation="vertical"
239+
android:paddingBottom="@dimen/space_16dp"
240+
android:paddingEnd="@dimen/space_16dp"
241+
android:paddingLeft="@dimen/space_16dp"
242+
android:paddingRight="@dimen/space_16dp"
243+
android:paddingStart="@dimen/space_16dp"
244+
android:paddingTop="@dimen/space_8dp">
245+
246+
<!-- Email -->
247+
<co.kyash.vtl.ValidatableTextInputLayout
248+
android:id="@+id/first_name_2"
249+
style="@style/InputRow"
250+
app:trigger="text_changed">
251+
252+
<EditText
253+
style="@style/BaseEditText"
254+
android:hint="@string/first_name"
255+
android:inputType="textPersonName" />
256+
257+
</co.kyash.vtl.ValidatableTextInputLayout>
258+
259+
<!-- Last name -->
260+
<co.kyash.vtl.ValidatableTextInputLayout
261+
android:id="@+id/last_name_2"
262+
style="@style/InputRow"
263+
app:trigger="text_changed">
264+
265+
<EditText
266+
style="@style/BaseEditText"
267+
android:hint="@string/last_name"
268+
android:inputType="textPersonName" />
269+
270+
</co.kyash.vtl.ValidatableTextInputLayout>
271+
272+
<Button
273+
android:id="@+id/submit_3"
274+
android:layout_width="match_parent"
275+
android:layout_height="wrap_content"
276+
android:layout_marginTop="@dimen/space_16dp"
277+
android:enabled="false"
278+
android:text="@string/submit"
279+
android:theme="@style/AccentButton" />
280+
281+
</LinearLayout>
282+
283+
</android.support.v7.widget.CardView>
284+
222285
</LinearLayout>
223286

224287
</ScrollView>

example/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,7 @@
2525

2626
<string name="validation_error_occurred">Error occurred</string>
2727
<string name="validation_success">Success</string>
28+
29+
<string name="change_button_enabled">Change button enable</string>
30+
<string name="change_button_enabled_description">Validation with changing button enable</string>
2831
</resources>

example/src/main/res/values/themes.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,9 @@
77
<item name="android:windowBackground">@color/grey200</item>
88
</style>
99

10+
<style name="AccentButton" parent="Base.Widget.AppCompat.Button">
11+
<item name="colorButtonNormal">@drawable/btn_accent</item>
12+
<item name="android:textColor">@color/white</item>
13+
</style>
14+
1015
</resources>

library/src/main/java/co/kyash/vtl/ValidatableTextInputLayout.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
2929
defStyleAttr: Int = 0
3030
) : TextInputLayout(context, attrs, defStyleAttr), ValidatableView {
3131

32+
override val validationFlowables: ArrayList<Flowable<Any>> = ArrayList()
33+
3234
companion object {
3335
private val FOCUS_CHANGED = 1
3436
private val TEXT_CHANGED = 1 shl 1
@@ -51,8 +53,6 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
5153
a.recycle()
5254
}
5355

54-
val textInputAwareValidationFlowables: ArrayList<Flowable<Any>> = ArrayList()
55-
5656
private val textProcessor: FlowableProcessor<String> = PublishProcessor.create()
5757

5858
private val compositeDisposable: CompositeDisposable = CompositeDisposable()
@@ -81,7 +81,7 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
8181
shouldValidateOnTextChangedOnce = false
8282
compositeDisposable.clear()
8383
compositeDisposable.add(
84-
Flowable.zip(textInputAwareValidationFlowables) { Any() }
84+
Flowable.zip(validationFlowables) { Any() }
8585
.doOnError({ this.showErrorMessage(it) })
8686
.retry() // non-terminated stream
8787
.subscribeOn(Schedulers.computation())
@@ -183,7 +183,7 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
183183

184184
this.validators.addAll(validators)
185185

186-
this.validators.mapTo(textInputAwareValidationFlowables) {
186+
this.validators.mapTo(validationFlowables) {
187187
textProcessor.onBackpressureDrop()
188188
.throttleLast(validationInterval, TimeUnit.MILLISECONDS)
189189
// hack to emit an event to `onNext` when completable is completed.

library/src/main/java/co/kyash/vtl/ValidatableView.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package co.kyash.vtl
22

33
import co.kyash.vtl.validators.VtlValidator
44
import io.reactivex.Completable
5+
import io.reactivex.Flowable
56

67
interface ValidatableView {
78

9+
val validationFlowables: ArrayList<Flowable<Any>>
10+
811
fun validate(): Boolean
912

1013
fun validateAsCompletable(): Completable

0 commit comments

Comments
 (0)