diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 263c9e0..026b0d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt index e3abfcd..98a2c8d 100644 --- a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt +++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt @@ -3,6 +3,7 @@ package com.danielecampogiani.androidfunctionalvalidation import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity +import com.danielecampogiani.androidfunctionalvalidation.either.EitherActivity import com.danielecampogiani.androidfunctionalvalidation.option.OptionActivity import kotlinx.android.synthetic.main.activity_main.* @@ -13,7 +14,15 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) option_button.setOnClickListener { - startActivity(Intent(this, OptionActivity::class.java)) + start() } + + either_button.setOnClickListener({ + start() + }) + } + + private inline fun start() { + startActivity(Intent(this, T::class.java)) } } diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherActivity.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherActivity.kt new file mode 100644 index 0000000..cfe2294 --- /dev/null +++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherActivity.kt @@ -0,0 +1,41 @@ +package com.danielecampogiani.androidfunctionalvalidation.either + +import android.arch.lifecycle.Observer +import android.arch.lifecycle.ViewModelProviders +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.widget.Toast +import com.danielecampogiani.androidfunctionalvalidation.Data +import com.danielecampogiani.androidfunctionalvalidation.R +import kotlinx.android.synthetic.main.activity_input.* + +class EitherActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_input) + + val viewModel = ViewModelProviders.of(this)[EitherViewModel::class.java] + + signup_button.setOnClickListener { + viewModel.validate(email.text.toString(), number.text.toString()) + } + + viewModel.validation.observe(this, Observer { + it?.fold(this::handleLeft, this::handleRight) + }) + } + + private fun handleLeft(error: String) { + showMessage(error) + } + + private fun handleRight(data: Data) { + val message = "Mail: ${data.mail} Phone: ${data.phone}" + showMessage(message) + } + + private fun showMessage(message: String) { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherViewModel.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherViewModel.kt new file mode 100644 index 0000000..e8284ac --- /dev/null +++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/EitherViewModel.kt @@ -0,0 +1,21 @@ +package com.danielecampogiani.androidfunctionalvalidation.either + +import android.arch.lifecycle.LiveData +import android.arch.lifecycle.MutableLiveData +import android.arch.lifecycle.ViewModel +import com.danielecampogiani.androidfunctionalvalidation.Data +import kategory.Either + +class EitherViewModel : ViewModel() { + + private val mutableValidation: MutableLiveData> = MutableLiveData() + + val validation: LiveData> + get() = mutableValidation + + + fun validate(mail: String, phoneNumber: String) { + mutableValidation.value = validateData(mail, phoneNumber) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/functions.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/functions.kt new file mode 100644 index 0000000..e4834e9 --- /dev/null +++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/either/functions.kt @@ -0,0 +1,26 @@ +package com.danielecampogiani.androidfunctionalvalidation.either + +import com.danielecampogiani.androidfunctionalvalidation.Data +import com.danielecampogiani.androidfunctionalvalidation.validMail +import com.danielecampogiani.androidfunctionalvalidation.validNumber +import kategory.* + +fun validateData(mail: String, phoneNumber: String): Either { + + return Either.applicative().map2(mail.optionMail(), phoneNumber.optionPhoneNumber()) { + Data(it.a, it.b) + }.ev() + +} + +private fun String.optionMail(): Either = + when { + validMail(this) -> this.right() + else -> "Invalid email".left() + } + +private fun String.optionPhoneNumber(): Either = + when { + validNumber(this) -> this.right() + else -> "Invalid phone number".left() + } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2917e10..a1bbbb4 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -18,4 +18,16 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 35ef0bb..55301fb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,4 +5,5 @@ Sign Up Option At least one field is wrong + Either