Skip to content

Commit 956104b

Browse files
committed
triggering an initial enabled state when using associateContentStateWith and extracts the resetting of errors on content change to an extension
1 parent 7c0d340 commit 956104b

File tree

5 files changed

+23
-23
lines changed

5 files changed

+23
-23
lines changed

vector/src/main/java/im/vector/app/core/extensions/TextInputLayout.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@ package im.vector.app.core.extensions
1919
import android.text.Editable
2020
import android.view.View
2121
import android.view.inputmethod.EditorInfo
22+
import androidx.lifecycle.LifecycleOwner
23+
import androidx.lifecycle.lifecycleScope
2224
import com.google.android.material.textfield.TextInputLayout
2325
import im.vector.app.core.platform.SimpleTextWatcher
26+
import kotlinx.coroutines.flow.launchIn
2427
import kotlinx.coroutines.flow.map
28+
import kotlinx.coroutines.flow.onEach
2529
import reactivecircus.flowbinding.android.widget.textChanges
2630

2731
fun TextInputLayout.editText() = this.editText!!
@@ -37,11 +41,18 @@ fun TextInputLayout.content() = editText().text.toString()
3741

3842
fun TextInputLayout.hasContent() = !editText().text.isNullOrEmpty()
3943

40-
fun TextInputLayout.associateContentStateWith(button: View) {
44+
fun TextInputLayout.clearErrorOnChange(lifecycleOwner: LifecycleOwner) {
45+
editText().textChanges()
46+
.onEach { error = null }
47+
.launchIn(lifecycleOwner.lifecycleScope)
48+
}
49+
50+
fun TextInputLayout.associateContentStateWith(button: View, enabledPredicate: (String) -> Boolean = { it.isNotEmpty() }) {
51+
button.isEnabled = enabledPredicate(content())
4152
editText().addTextChangedListener(object : SimpleTextWatcher() {
4253
override fun afterTextChanged(s: Editable) {
4354
val newContent = s.toString()
44-
button.isEnabled = newContent.isNotEmpty()
55+
button.isEnabled = enabledPredicate(newContent)
4556
}
4657
})
4758
}

vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedServerSelectionFragment.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import android.view.ViewGroup
2323
import android.view.inputmethod.EditorInfo
2424
import androidx.lifecycle.lifecycleScope
2525
import im.vector.app.R
26+
import im.vector.app.core.extensions.clearErrorOnChange
2627
import im.vector.app.core.extensions.content
2728
import im.vector.app.core.extensions.editText
2829
import im.vector.app.core.extensions.realignPercentagesToParent
@@ -66,9 +67,7 @@ class FtueAuthCombinedServerSelectionFragment @Inject constructor() : AbstractFt
6667
}
6768
views.chooseServerGetInTouch.debouncedClicks { openUrlInExternalBrowser(requireContext(), getString(R.string.ftue_ems_url)) }
6869
views.chooseServerSubmit.debouncedClicks { updateServerUrl() }
69-
views.chooseServerInput.editText().textChanges()
70-
.onEach { views.chooseServerInput.error = null }
71-
.launchIn(viewLifecycleOwner.lifecycleScope)
70+
views.chooseServerInput.clearErrorOnChange(viewLifecycleOwner)
7271
}
7372

7473
private fun updateServerUrl() {

vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthEmailEntryFragment.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import android.view.View
2222
import android.view.ViewGroup
2323
import androidx.lifecycle.lifecycleScope
2424
import im.vector.app.core.extensions.associateContentStateWith
25+
import im.vector.app.core.extensions.clearErrorOnChange
2526
import im.vector.app.core.extensions.content
2627
import im.vector.app.core.extensions.editText
2728
import im.vector.app.core.extensions.isEmail
@@ -47,16 +48,10 @@ class FtueAuthEmailEntryFragment @Inject constructor() : AbstractFtueAuthFragmen
4748
}
4849

4950
private fun setupViews() {
50-
views.emailEntryInput.associateContentStateWith(button = views.emailEntrySubmit)
51+
views.emailEntryInput.associateContentStateWith(button = views.emailEntrySubmit, enabledPredicate = { it.isEmail() })
5152
views.emailEntryInput.setOnImeDoneListener { updateEmail() }
53+
views.emailEntryInput.clearErrorOnChange(viewLifecycleOwner)
5254
views.emailEntrySubmit.debouncedClicks { updateEmail() }
53-
54-
views.emailEntryInput.editText().textChanges()
55-
.onEach {
56-
views.emailEntryInput.error = null
57-
views.emailEntrySubmit.isEnabled = it.isEmail()
58-
}
59-
.launchIn(viewLifecycleOwner.lifecycleScope)
6055
}
6156

6257
private fun updateEmail() {

vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordEmailEntryFragment.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import android.view.ViewGroup
2323
import androidx.lifecycle.lifecycleScope
2424
import dagger.hilt.android.AndroidEntryPoint
2525
import im.vector.app.core.extensions.associateContentStateWith
26+
import im.vector.app.core.extensions.clearErrorOnChange
2627
import im.vector.app.core.extensions.content
2728
import im.vector.app.core.extensions.editText
2829
import im.vector.app.core.extensions.isEmail
@@ -46,14 +47,9 @@ class FtueAuthResetPasswordEmailEntryFragment : AbstractFtueAuthFragment<Fragmen
4647
}
4748

4849
private fun setupViews() {
49-
views.emailEntryInput.associateContentStateWith(button = views.emailEntrySubmit)
50+
views.emailEntryInput.associateContentStateWith(button = views.emailEntrySubmit, enabledPredicate = { it.isEmail() })
5051
views.emailEntryInput.setOnImeDoneListener { startPasswordReset() }
51-
views.emailEntryInput.editText().textChanges()
52-
.onEach {
53-
views.emailEntryInput.error = null
54-
views.emailEntrySubmit.isEnabled = it.isEmail()
55-
}
56-
.launchIn(viewLifecycleOwner.lifecycleScope)
52+
views.emailEntryInput.clearErrorOnChange(viewLifecycleOwner)
5753
views.emailEntrySubmit.debouncedClicks { startPasswordReset() }
5854
}
5955

vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthResetPasswordEntryFragment.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import androidx.core.view.isVisible
2424
import androidx.lifecycle.lifecycleScope
2525
import dagger.hilt.android.AndroidEntryPoint
2626
import im.vector.app.core.extensions.associateContentStateWith
27+
import im.vector.app.core.extensions.clearErrorOnChange
2728
import im.vector.app.core.extensions.content
2829
import im.vector.app.core.extensions.editText
2930
import im.vector.app.core.extensions.hidePassword
@@ -51,9 +52,7 @@ class FtueAuthResetPasswordEntryFragment : AbstractFtueAuthFragment<FragmentFtue
5152
private fun setupViews() {
5253
views.newPasswordInput.associateContentStateWith(button = views.newPasswordSubmit)
5354
views.newPasswordInput.setOnImeDoneListener { resetPassword() }
54-
views.newPasswordInput.editText().textChanges()
55-
.onEach { views.newPasswordInput.error = null }
56-
.launchIn(viewLifecycleOwner.lifecycleScope)
55+
views.newPasswordInput.clearErrorOnChange(viewLifecycleOwner)
5756
views.newPasswordSubmit.debouncedClicks { resetPassword() }
5857
}
5958

0 commit comments

Comments
 (0)