Last active
April 25, 2018 09:28
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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