Skip to content

Commit

Permalink
Support triggerAfterValidation attr
Browse files Browse the repository at this point in the history
  • Loading branch information
konifar committed Mar 21, 2018
1 parent b812bf1 commit 2d09f52
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 36 deletions.
4 changes: 2 additions & 2 deletions example/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,8 @@
<co.kyash.vtl.ValidatableTextInputLayout
android:id="@+id/email"
style="@style/InputRow"
app:trigger="text_changed">
app:trigger="text_changed"
app:triggerAfterValidation="true">

<EditText
style="@style/BaseEditText"
Expand Down Expand Up @@ -200,7 +201,6 @@
android:paddingStart="@dimen/space_16dp"
android:paddingTop="@dimen/space_8dp">

<!-- Email -->
<co.kyash.vtl.ValidatableTextInputLayout
android:id="@+id/colors"
style="@style/InputRow"
Expand Down
75 changes: 43 additions & 32 deletions library/src/main/java/co/kyash/vtl/ValidatableTextInputLayout.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import io.reactivex.Flowable
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.functions.Consumer
import io.reactivex.internal.functions.Functions
import io.reactivex.processors.FlowableProcessor
import io.reactivex.processors.PublishProcessor
import io.reactivex.schedulers.Schedulers
import java.util.concurrent.TimeUnit
Expand All @@ -29,37 +28,42 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
defStyleAttr: Int = 0
) : TextInputLayout(context, attrs, defStyleAttr), ValidatableView {

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

companion object {
private val NONE = -1
private val FOCUS_CHANGED = 1
private val TEXT_CHANGED = 1 shl 1
}

private var shouldValidateOnFocusChanged: Boolean = false
private var shouldValidateOnTextChanged: Boolean = false
private var shouldValidateOnTextChangedOnce: Boolean = false
private var validationInterval: Long = 300L
private var shouldValidateOnFocusChanged = false
private var shouldValidateOnTextChanged = false
private var shouldValidateOnTextChangedOnce = false
private var triggerAfterValidation = false
private var validationInterval = 300L

init {
val a = context.theme.obtainStyledAttributes(attrs, R.styleable.ValidatableTextInputLayout, 0, 0)

val trigger = a.getInt(R.styleable.ValidatableTextInputLayout_trigger, FOCUS_CHANGED)
shouldValidateOnFocusChanged = trigger and FOCUS_CHANGED != 0
shouldValidateOnTextChanged = trigger and TEXT_CHANGED != 0
val trigger = a.getInt(R.styleable.ValidatableTextInputLayout_trigger, NONE)
if (trigger > 0) {
shouldValidateOnFocusChanged = trigger and FOCUS_CHANGED != 0
shouldValidateOnTextChanged = trigger and TEXT_CHANGED != 0
}

triggerAfterValidation = a.getBoolean(R.styleable.ValidatableTextInputLayout_triggerAfterValidation, false)
validationInterval = a.getInteger(R.styleable.ValidatableTextInputLayout_interval, 300).toLong()

a.recycle()
}

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

private val compositeDisposable: CompositeDisposable = CompositeDisposable()
private val compositeDisposable = CompositeDisposable()

private val validators: ArrayList<VtlValidator> = ArrayList()
private val validators = ArrayList<VtlValidator>()

private val mainHandler: Handler = HandlerProvider.createMainHandler()
private val mainHandler = HandlerProvider.createMainHandler()

private val textWatcher = object : TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
Expand All @@ -71,30 +75,36 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
}

override fun afterTextChanged(s: Editable) {
textProcessor.onNext(s.toString())
if (!triggerAfterValidation) {
textProcessor.onNext(s.toString())
}
}
}

private val onCustomFocusChangeListener = OnFocusChangeListener { _, hasFocus ->
if (hasFocus) {
if (shouldValidateOnTextChanged || shouldValidateOnTextChangedOnce) {
shouldValidateOnTextChangedOnce = false
compositeDisposable.clear()
compositeDisposable.add(
Flowable.zip(validationFlowables) { Any() }
.doOnError({ this.showErrorMessage(it) })
.retry() // non-terminated stream
.subscribeOn(Schedulers.computation())
.subscribe({ clearErrorMessage() }, {})
)
}
} else {
if (shouldValidateOnFocusChanged) {
compositeDisposable.clear()
compositeDisposable.add(
validateAsCompletable().subscribe(Functions.EMPTY_ACTION, Consumer<Throwable> {})
)
if (!triggerAfterValidation) {

if (hasFocus) {
if (shouldValidateOnTextChanged || shouldValidateOnTextChangedOnce) {
shouldValidateOnTextChangedOnce = false
compositeDisposable.clear()
compositeDisposable.add(
Flowable.zip(validationFlowables) { Any() }
.doOnError({ this.showErrorMessage(it) })
.retry() // non-terminated stream
.subscribeOn(Schedulers.computation())
.subscribe({ clearErrorMessage() }, {})
)
}
} else {
if (shouldValidateOnFocusChanged) {
compositeDisposable.clear()
compositeDisposable.add(
validateAsCompletable().subscribe(Functions.EMPTY_ACTION, Consumer<Throwable> {})
)
}
}

}
}

Expand Down Expand Up @@ -221,6 +231,7 @@ class ValidatableTextInputLayout @JvmOverloads constructor(
mainHandler.post {
error = errorMessage
isErrorEnabled = true
triggerAfterValidation = false
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion library/src/main/res/values/attrs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
<flag name="focus_changed" value="1" />
<flag name="text_changed" value="2" />
</attr>
<attr name="enable_floating_label" format="boolean" />
<attr name="interval" format="integer" />
<attr name="triggerAfterValidation" format="boolean" />
</declare-styleable>

</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ class AsciiOnlyValidatorTest(
arrayOf("a", true, null),
arrayOf("-", true, null),
arrayOf("@", true, null),
arrayOf("*", true, null)
arrayOf("*", true, null),
arrayOf("1", true, null)
)
}
}
Expand Down

0 comments on commit 2d09f52

Please sign in to comment.