eveeeeef21

Pendekatan Reactive

Aug 24th, 2025 (edited)
435
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.22 KB | Source Code | 0 0
  1. package com.dicoding.myreactiveform
  2.  
  3. import android.annotation.SuppressLint
  4. import android.os.Bundle
  5. import android.util.Patterns
  6. import androidx.appcompat.app.AppCompatActivity
  7. import androidx.core.content.ContextCompat
  8. import com.dicoding.myreactiveform.databinding.ActivityMainBinding
  9. import com.jakewharton.rxbinding2.widget.RxTextView
  10. import io.reactivex.Observable
  11. import io.reactivex.functions.Function3
  12.  
  13.  
  14. class MainActivity : AppCompatActivity() {
  15.  
  16.     private lateinit var binding: ActivityMainBinding
  17.  
  18.     @SuppressLint("CheckResult")
  19.     override fun onCreate(savedInstanceState: Bundle?) {
  20.         super.onCreate(savedInstanceState)
  21.         binding = ActivityMainBinding.inflate(layoutInflater)
  22.         setContentView(binding.root)
  23.  
  24.         val emailStream = RxTextView.textChanges(binding.edEmail)
  25.             .skipInitialValue()
  26.             .map { email ->
  27.                 !Patterns.EMAIL_ADDRESS.matcher(email).matches()
  28.             }
  29.         emailStream.subscribe {
  30.             showEmailExistAlert(it)
  31.         }
  32.  
  33.         val passwordStream = RxTextView.textChanges(binding.edPassword)
  34.             .skipInitialValue()
  35.             .map { password ->
  36.                 password.length < 6
  37.             }
  38.         passwordStream.subscribe {
  39.             showPasswordMinimalAlert(it)
  40.         }
  41.  
  42.         val passwordConfirmationStream = Observable.merge(
  43.             RxTextView.textChanges(binding.edPassword)
  44.                 .map { password ->
  45.                     password.toString() != binding.edConfirmPassword.text.toString()
  46.                 },
  47.             RxTextView.textChanges(binding.edConfirmPassword)
  48.                 .map { confirmPassword ->
  49.                     confirmPassword.toString() != binding.edPassword.text.toString()
  50.                 }
  51.         )
  52.         passwordConfirmationStream.subscribe {
  53.             showPasswordConfirmationAlert(it)
  54.         }
  55.  
  56.         val invalidFieldsStream = Observable.combineLatest(
  57.             emailStream,
  58.             passwordStream,
  59.             passwordConfirmationStream,
  60.             Function3 { emailInvalid: Boolean, passwordInvalid: Boolean, passwordConfirmationInvalid: Boolean ->
  61.                 !emailInvalid && !passwordInvalid && !passwordConfirmationInvalid
  62.             })
  63.         invalidFieldsStream.subscribe { isValid ->
  64.             if (isValid) {
  65.                 binding.btnRegister.isEnabled = true
  66.                 binding.btnRegister.setBackgroundColor(ContextCompat.getColor(this, R.color.purple_500))
  67.             } else {
  68.                 binding.btnRegister.isEnabled = false
  69.                 binding.btnRegister.setBackgroundColor(ContextCompat.getColor(this, android.R.color.darker_gray))
  70.             }
  71.         }
  72.     }
  73.  
  74.     private fun showEmailExistAlert(isNotValid: Boolean) {
  75.         binding.edEmail.error = if (isNotValid) getString(R.string.email_not_valid) else null
  76.     }
  77.  
  78.     private fun showPasswordMinimalAlert(isNotValid: Boolean) {
  79.         binding.edPassword.error = if (isNotValid) getString(R.string.password_not_valid) else null
  80.     }
  81.  
  82.     private fun showPasswordConfirmationAlert(isNotValid: Boolean) {
  83.         binding.edConfirmPassword.error = if (isNotValid) getString(R.string.password_not_same) else null
  84.     }
  85. }
  86.  
Advertisement
Add Comment
Please, Sign In to add comment