Skip to content

Instantly share code, notes, and snippets.

View dcampogiani's full-sized avatar

Daniele Campogiani dcampogiani

View GitHub Profile
@dcampogiani
dcampogiani / SpacesItemDecoration.java
Last active May 12, 2017 08:01
Simple RecyclerView.ItemDecoration with fluent api
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.View;
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
private final int leftSpace;
private final int topSpace;
private final int rightSpace;
data class Data(val mail: String, val phone: String)
val VALID_EMAIL_ADDRESS_REGEX = Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE)!!
val VALID_PHONE_NUMBER_ADDRESS_REGEX = Pattern.compile("\\d{10}|(?:\\d{3}-){2}\\d{4}|\\(\\d{3}\\)\\d{3}-?\\d{4}", Pattern.CASE_INSENSITIVE)!!
fun validMail(input: String): Boolean {
val matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(input)
return matcher.find()
}
fun validNumber(input: String): Boolean {
@dcampogiani
dcampogiani / activity_input.xml
Last active December 24, 2017 18:12
Shared UI
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/primary_light"
tools:context="com.danielecampogiani.androidfunctionalvalidation.MainActivity">
fun String.optionMail(): Option<String> =
when {
validMail(this) -> this.some()
else -> Option.None
}
fun String.optionPhoneNumber(): Option<String> =
when {
validNumber(this) -> this.some()
else -> Option.None
class OptionViewModel : ViewModel() {
private val mutableValidation: MutableLiveData<Option<Data>> = MutableLiveData()
val validation: LiveData<Option<Data>>
get() = mutableValidation
fun validate(mail: String, phoneNumber: String) {
val validationResult : Option<Data> = validateData(mail, phoneNumber)
class OptionActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_input)
val viewModel = ViewModelProviders.of(this)[OptionViewModel::class.java]
signup_button.setOnClickListener {
viewModel.validate(email.text.toString(), number.text.toString())
private fun handleNone() {
val message = getString(R.string.option_wrong)
showMessage(message)
}
private fun handleSome(data: Data) {
val message = "Mail: ${data.mail} Phone: ${data.phone}"
showMessage(message)
}
fun String.eitherMail(): Either<String, String> =
when {
validMail(this) -> this.right()
else -> "Invalid email".left()
}
fun String.eitherPhoneNumber(): Either<String, String> =
when {
validNumber(this) -> this.right()
else -> "Invalid phone number".left()