Add PIN and Pin Confirmation validations to CreateAccountFragment using RxBindings with debounce, also add functionality to the 'CANCEL' button.
This commit is contained in:
parent
14a4f79cb2
commit
9236e374bc
1 changed files with 64 additions and 0 deletions
|
@ -5,17 +5,22 @@ import android.util.Log
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.jakewharton.rxbinding3.widget.textChanges
|
||||||
import cy.agorise.bitsybitshareswallet.R
|
import cy.agorise.bitsybitshareswallet.R
|
||||||
|
import cy.agorise.bitsybitshareswallet.utils.Constants
|
||||||
import cy.agorise.bitsybitshareswallet.utils.toast
|
import cy.agorise.bitsybitshareswallet.utils.toast
|
||||||
import cy.agorise.graphenej.Address
|
import cy.agorise.graphenej.Address
|
||||||
import cy.agorise.graphenej.BrainKey
|
import cy.agorise.graphenej.BrainKey
|
||||||
import cy.agorise.graphenej.api.ConnectionStatusUpdate
|
import cy.agorise.graphenej.api.ConnectionStatusUpdate
|
||||||
import cy.agorise.graphenej.models.JsonRpcResponse
|
import cy.agorise.graphenej.models.JsonRpcResponse
|
||||||
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||||
import kotlinx.android.synthetic.main.fragment_create_account.*
|
import kotlinx.android.synthetic.main.fragment_create_account.*
|
||||||
import org.bitcoinj.core.ECKey
|
import org.bitcoinj.core.ECKey
|
||||||
import java.io.BufferedReader
|
import java.io.BufferedReader
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.io.InputStreamReader
|
import java.io.InputStreamReader
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
class CreateAccountFragment : ConnectedFragment() {
|
class CreateAccountFragment : ConnectedFragment() {
|
||||||
|
|
||||||
|
@ -28,6 +33,11 @@ class CreateAccountFragment : ConnectedFragment() {
|
||||||
private lateinit var mBrainKey: BrainKey
|
private lateinit var mBrainKey: BrainKey
|
||||||
private lateinit var mAddress: String
|
private lateinit var mAddress: String
|
||||||
|
|
||||||
|
/** Variables used to store the validation status of the form fields */
|
||||||
|
private var isPINValid = false
|
||||||
|
private var isPINConfirmationValid = false
|
||||||
|
private var isAccountValid = true // TODO make false
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
setHasOptionsMenu(true)
|
setHasOptionsMenu(true)
|
||||||
|
|
||||||
|
@ -37,10 +47,64 @@ class CreateAccountFragment : ConnectedFragment() {
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
// Use RxJava Debounce to update the PIN error only after the user stops writing for > 500 ms
|
||||||
|
mDisposables.add(
|
||||||
|
tietPin.textChanges()
|
||||||
|
.skipInitialValue()
|
||||||
|
.debounce(500, TimeUnit.MILLISECONDS)
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe { validatePIN() }
|
||||||
|
)
|
||||||
|
|
||||||
|
// Use RxJava Debounce to update the PIN Confirmation error only after the user stops writing for > 500 ms
|
||||||
|
mDisposables.add(
|
||||||
|
tietPinConfirmation.textChanges()
|
||||||
|
.skipInitialValue()
|
||||||
|
.debounce(500, TimeUnit.MILLISECONDS)
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe { validatePINConfirmation() }
|
||||||
|
)
|
||||||
|
|
||||||
|
btnCancel.setOnClickListener { findNavController().navigateUp() }
|
||||||
|
|
||||||
|
btnCreate.isEnabled = false
|
||||||
|
|
||||||
// Generating BrainKey
|
// Generating BrainKey
|
||||||
generateKeys()
|
generateKeys()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun validatePIN() {
|
||||||
|
val pin = tietPin.text.toString()
|
||||||
|
|
||||||
|
if (pin.length < Constants.MIN_PIN_LENGTH) {
|
||||||
|
tilPin.error = getString(R.string.error__pin_too_short)
|
||||||
|
isPINValid = false
|
||||||
|
} else {
|
||||||
|
tilPin.isErrorEnabled = false
|
||||||
|
isPINValid = true
|
||||||
|
}
|
||||||
|
|
||||||
|
validatePINConfirmation()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun validatePINConfirmation() {
|
||||||
|
val pinConfirmation = tietPinConfirmation.text.toString()
|
||||||
|
|
||||||
|
if (pinConfirmation != tietPin.text.toString()) {
|
||||||
|
tilPinConfirmation.error = getString(R.string.error__pin_mismatch)
|
||||||
|
isPINConfirmationValid = false
|
||||||
|
} else {
|
||||||
|
tilPinConfirmation.isErrorEnabled = false
|
||||||
|
isPINConfirmationValid = true
|
||||||
|
}
|
||||||
|
|
||||||
|
enableDisableCreateButton()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun enableDisableCreateButton() {
|
||||||
|
btnCreate.isEnabled = (isPINValid && isPINConfirmationValid && isAccountValid)
|
||||||
|
}
|
||||||
|
|
||||||
override fun handleJsonRpcResponse(response: JsonRpcResponse<*>) {
|
override fun handleJsonRpcResponse(response: JsonRpcResponse<*>) {
|
||||||
// TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
// TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue