@@ -2,11 +2,91 @@ package com.freeankit.rxbinding
2
2
3
3
import android.support.v7.app.AppCompatActivity
4
4
import android.os.Bundle
5
+ import android.util.Patterns
6
+ import com.jakewharton.rxbinding2.widget.RxTextView
7
+ import io.reactivex.Observable
8
+ import io.reactivex.ObservableTransformer
9
+ import io.reactivex.Single
10
+ import io.reactivex.android.schedulers.AndroidSchedulers
11
+ import kotlinx.android.synthetic.main.activity_main.*
12
+ import java.util.concurrent.TimeUnit
5
13
6
14
class MainActivity : AppCompatActivity () {
7
15
8
16
override fun onCreate (savedInstanceState : Bundle ? ) {
9
17
super .onCreate(savedInstanceState)
10
18
setContentView(R .layout.activity_main)
19
+
20
+ RxTextView .afterTextChangeEvents(editTextEmail)
21
+ .skipInitialValue()
22
+ .map {
23
+ emailWrapper.error = null
24
+ it.view().text.toString()
25
+ }
26
+ .debounce(1 , TimeUnit .SECONDS ).observeOn(AndroidSchedulers .mainThread())
27
+ .compose(lengthGreaterThanSix)
28
+ .compose(verifyEmailPattern)
29
+ .compose(retryWhenError {
30
+ emailWrapper.error = it.message
31
+ })
32
+ .subscribe()
33
+
34
+ RxTextView .afterTextChangeEvents(editTextPassword)
35
+ .skipInitialValue()
36
+ .map {
37
+ passwordWrapper.error = null
38
+ it.view().text.toString()
39
+ }
40
+ .debounce(1 , TimeUnit .SECONDS ).observeOn(AndroidSchedulers .mainThread())
41
+ .compose(lengthGreaterThanSix)
42
+ .compose(retryWhenError {
43
+ passwordWrapper.error = it.message
44
+ })
45
+ .subscribe()
46
+ }
47
+ private inline fun retryWhenError (crossinline onError : (ex: Throwable ) -> Unit ): ObservableTransformer <String , String > = ObservableTransformer { observable ->
48
+ observable.retryWhen { errors ->
49
+ errors.flatMap {
50
+ onError(it)
51
+ Observable .just(" " )
52
+ }
53
+ }
54
+ }
55
+
56
+ private val lengthGreaterThanSix = ObservableTransformer <String , String > { observable ->
57
+ observable.flatMap {
58
+ Observable .just(it).map { it.trim() } // - abcdefg - |
59
+ .filter { it.length > 6 }
60
+ .singleOrError()
61
+ .onErrorResumeNext {
62
+ if (it is NoSuchElementException ) {
63
+ Single .error(Exception (" Length should be greater than 6" ))
64
+ } else {
65
+ Single .error(it)
66
+ }
67
+ }
68
+ .toObservable()
69
+ }
11
70
}
71
+
72
+ private val verifyEmailPattern = ObservableTransformer <String , String > { observable ->
73
+ observable.flatMap {
74
+ Observable .just(it).map { it.trim() }
75
+ .filter {
76
+ Patterns .EMAIL_ADDRESS .matcher(it).matches()
77
+ }
78
+ .singleOrError()
79
+ .onErrorResumeNext {
80
+ if (it is NoSuchElementException ) {
81
+ Single .error(Exception (" Email not valid" ))
82
+ } else {
83
+ Single .error(it)
84
+ }
85
+ }
86
+ .toObservable()
87
+ }
88
+ }
89
+
90
+
91
+
12
92
}
0 commit comments