Skip to content

Instantly share code, notes, and snippets.

@jimdc
Last active April 25, 2018 09:28
Show Gist options
  • Save jimdc/6294998a303ffc4dee9376a50c808bf2 to your computer and use it in GitHub Desktop.
Save jimdc/6294998a303ffc4dee9376a50c808bf2 to your computer and use it in GitHub Desktop.
Real-time feedback about user input using regex and RxKotlin 2.x for "set it and forget it" in onCreate
import android.graphics.Color
import android.text.Editable
import android.text.TextWatcher
import android.widget.EditText
import io.reactivex.subjects.PublishSubject
import io.reactivex.Observable
import io.reactivex.rxkotlin.Observables
class InputActivity {
private lateinit var tickerName: EditText
private lateinit var tickerPrice: EditText
private lateinit var tickerObservable: Observable<String>
private lateinit var targetObservable: Observable<String>
private lateinit var isUserInputNotEmpty: Observable<Boolean>
private lateinit var tickerHelper: TextView
private lateinit var targetHelper: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.input_activity)
tickerName = findViewById(R.id.tickerName)
tickerPrice = findViewById(R.id.tickerPrice)
tickerHelper = findViewById(R.id.tickerHelper)
targetHelper = findViewById(R.id.targetHelper)
tickerObservable = getTextWatcherObservable(tickerName)
targetObservable = getTextWatcherObservable(tickerPrice)
fun onNextTickerValidate(t: String) {
if (t.isEmpty()) {
tickerHelper.text = "Empty"
tickerHelper.setTextColor(Color.MAGENTA)
} else {
if (!t.isValidTickerSymbol()) {
tickerHelper.text = "Malformed"
tickerHelper.setTextColor(Color.RED)
} else {
tickerHelper.text = "OK"
tickerHelper.setTextColor(Color.GREEN)
}
}
}
fun onNextTargetBetterNotBeEmpty(p: String) {
if (p.isEmpty()) {
targetHelper.text = "Empty"
targetHelper.setTextColor(Color.RED)
} else {
targetHelper.text = "OK"
targetHelper.setTextColor(Color.GREEN)
}
}
tickerObservable.subscribe({ t -> onNextTickerValidate(t) })
targetObservable.subscribe({ p -> onNextTargetBetterNotBeEmpty(p) })
}
private fun getTextWatcherObservable(editText: EditText): Observable<String> {
val subject = PublishSubject.create<String>()
editText.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { }
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { }
override fun afterTextChanged(s: Editable) {
subject.onNext(s.toString())
}
})
return subject
}
fun String.isValidTickerSymbol(): Boolean {
val validTickerFormat =
Regex("^(([a-z]{2,4}):(?![a-z\\d]+\\.))?([a-z]{1,4}|\\d{1,3}(?=\\.)|\\d{4,})(\\.([a-z]{2}))?$",
RegexOption.IGNORE_CASE)
val results = validTickerFormat.matchEntire(this)?.groupValues
return (results != null)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment