diff --git a/app/build.gradle b/app/build.gradle index 38b90ba..c5ea66d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,6 +31,7 @@ dependencies { testImplementation 'junit:junit:4.12' implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'io.kategory:kategory:0.3.11' + implementation "android.arch.lifecycle:extensions:1.0.0" } repositories { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 585c626..263c9e0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/Data.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/Data.kt new file mode 100644 index 0000000..de72c10 --- /dev/null +++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/Data.kt @@ -0,0 +1,4 @@ +package com.danielecampogiani.androidfunctionalvalidation + + +data class Data(val mail: String, val phone: String) diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt index 0611790..e3abfcd 100644 --- a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt +++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/MainActivity.kt @@ -1,12 +1,19 @@ package com.danielecampogiani.androidfunctionalvalidation -import android.support.v7.app.AppCompatActivity +import android.content.Intent import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import com.danielecampogiani.androidfunctionalvalidation.option.OptionActivity +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + option_button.setOnClickListener { + startActivity(Intent(this, OptionActivity::class.java)) + } } } diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/option/OptionActivity.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/option/OptionActivity.kt new file mode 100644 index 0000000..4e23d25 --- /dev/null +++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/option/OptionActivity.kt @@ -0,0 +1,43 @@ +package com.danielecampogiani.androidfunctionalvalidation.option + +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 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()) + } + + viewModel.validation.observe(this, Observer { + it?.fold(this::handleNone, this::handleSome) + }) + + } + + private fun handleSome(data: Data) { + val message = "Mail: ${data.mail} Phone: ${data.phone}" + showMessage(message) + } + + private fun handleNone() { + val message = getString(R.string.option_wrong) + 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/option/OptionViewModel.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/option/OptionViewModel.kt new file mode 100644 index 0000000..c8a8a90 --- /dev/null +++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/option/OptionViewModel.kt @@ -0,0 +1,23 @@ +package com.danielecampogiani.androidfunctionalvalidation.option + +import android.arch.lifecycle.LiveData +import android.arch.lifecycle.MutableLiveData +import android.arch.lifecycle.ViewModel +import com.danielecampogiani.androidfunctionalvalidation.Data +import kategory.Option + + +class OptionViewModel : ViewModel() { + + private val mutableValidation: MutableLiveData> = MutableLiveData() + + val validation: LiveData> + get() = mutableValidation + + + fun validate(mail: String, phoneNumber: String) { + val validationResult = validateData(mail, phoneNumber) + mutableValidation.value = validationResult + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/option/functions.kt b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/option/functions.kt new file mode 100644 index 0000000..2375c0d --- /dev/null +++ b/app/src/main/java/com/danielecampogiani/androidfunctionalvalidation/option/functions.kt @@ -0,0 +1,31 @@ +package com.danielecampogiani.androidfunctionalvalidation.option + +import com.danielecampogiani.androidfunctionalvalidation.Data +import com.danielecampogiani.androidfunctionalvalidation.validMail +import com.danielecampogiani.androidfunctionalvalidation.validNumber +import kategory.Option +import kategory.applicative +import kategory.ev +import kategory.some + + +fun validateData(mail: String, phoneNumber: String): Option { + + return Option.applicative().map2(mail.optionMail(), phoneNumber.optionPhoneNumber()) { + Data(it.a, it.b) + }.ev() + +} + + +private fun String.optionMail(): Option = + when { + validMail(this) -> this.some() + else -> Option.None + } + +private fun String.optionPhoneNumber(): Option = + when { + validNumber(this) -> this.some() + else -> Option.None + } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_input.xml b/app/src/main/res/layout/activity_input.xml index d4897a6..bc0ec51 100644 --- a/app/src/main/res/layout/activity_input.xml +++ b/app/src/main/res/layout/activity_input.xml @@ -50,7 +50,7 @@ - Mail Phone Number Sign Up + Option + At least one field is wrong