diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-03-12 13:53:15 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-03-13 12:39:45 +0000 |
| commit | 2fc8e2b5af1c77bd3a9af300bf321f4312b03ca8 (patch) | |
| tree | c492e8a6f03b3d98166b679f6c9f41abe5b6c951 /android/src | |
| parent | 4a348edae0de2eeb88395e03adad06303244cfed (diff) | |
| download | mullvadvpn-2fc8e2b5af1c77bd3a9af300bf321f4312b03ca8.tar.xz mullvadvpn-2fc8e2b5af1c77bd3a9af300bf321f4312b03ca8.zip | |
Refactor to separate account input state handling
Diffstat (limited to 'android/src')
3 files changed, 139 insertions, 85 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/AccountInput.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/AccountInput.kt new file mode 100644 index 0000000000..246ed57e11 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/AccountInput.kt @@ -0,0 +1,110 @@ +package net.mullvad.mullvadvpn + +import android.content.Context +import android.view.View +import android.text.Editable +import android.text.TextWatcher +import android.widget.EditText +import android.widget.ImageButton + +const val MIN_ACCOUNT_TOKEN_LENGTH = 10 + +class AccountInput(val parentView: View, val context: Context) { + private val disabledBackgroundColor = context.getColor(R.color.white20) + private val disabledTextColor = context.getColor(R.color.white) + private val enabledBackgroundColor = context.getColor(R.color.white) + private val enabledTextColor = context.getColor(R.color.blue) + private val errorTextColor = context.getColor(R.color.red) + + private var usingErrorColor = false + + var state = LoginState.Initial + set(value) { + when (value) { + LoginState.Initial -> initialState() + LoginState.InProgress -> loggingInState() + LoginState.Success -> successState() + LoginState.Failure -> failureState() + } + } + + val input: EditText = parentView.findViewById(R.id.account_input) + val button: ImageButton = parentView.findViewById(R.id.login_button) + + var onLogin: ((String) -> Unit)? = null + + init { + input.addTextChangedListener(InputWatcher()) + button.setOnClickListener { onLogin?.invoke(input.text.toString()) } + setButtonEnabled(false) + } + + private fun initialState() { + setButtonEnabled(input.text.length >= MIN_ACCOUNT_TOKEN_LENGTH) + button.visibility = View.VISIBLE + + input.apply { + setBackgroundColor(enabledBackgroundColor) + setTextColor(enabledTextColor) + setEnabled(true) + visibility = View.VISIBLE + } + } + + private fun loggingInState() { + setButtonEnabled(false) + button.visibility = View.GONE + + input.apply { + setBackgroundColor(disabledBackgroundColor) + setTextColor(disabledTextColor) + setEnabled(false) + visibility = View.VISIBLE + } + } + + private fun successState() { + setButtonEnabled(false) + button.visibility = View.GONE + input.visibility = View.GONE + } + + private fun failureState() { + setButtonEnabled(false) + button.visibility = View.VISIBLE + + input.apply { + setBackgroundColor(enabledBackgroundColor) + setTextColor(errorTextColor) + setEnabled(true) + visibility = View.VISIBLE + } + + usingErrorColor = true + } + + private fun setButtonEnabled(enabled: Boolean) { + button.apply { + if (enabled != isEnabled()) { + setEnabled(enabled) + setClickable(enabled) + setFocusable(enabled) + } + } + } + + inner class InputWatcher : TextWatcher { + override fun beforeTextChanged(text: CharSequence, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(text: CharSequence, start: Int, before: Int, count: Int) {} + + override fun afterTextChanged(text: Editable) { + setButtonEnabled(text.length >= MIN_ACCOUNT_TOKEN_LENGTH) + + if (usingErrorColor) { + input.setTextColor(enabledTextColor) + usingErrorColor = false + } + } + } +} diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/LoginFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/LoginFragment.kt index 7ff367596f..d5a06a9d75 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/LoginFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/LoginFragment.kt @@ -1,35 +1,20 @@ package net.mullvad.mullvadvpn -import android.content.Context import android.os.Bundle import android.os.Handler import android.support.v4.app.Fragment -import android.text.Editable -import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.EditText -import android.widget.ImageButton import android.widget.TextView -const val MIN_ACCOUNT_TOKEN_LENGTH = 10 - class LoginFragment : Fragment() { private lateinit var title: TextView private lateinit var subtitle: TextView private lateinit var loggingInStatus: View private lateinit var loggedInStatus: View private lateinit var loginFailStatus: View - private lateinit var accountInput: EditText - private lateinit var loginButton: ImageButton - - private var accountInputDisabledBackgroundColor: Int = 0 - private var accountInputDisabledTextColor: Int = 0 - private var accountInputEnabledBackgroundColor: Int = 0 - private var accountInputEnabledTextColor: Int = 0 - private var accountInputErrorTextColor: Int = 0 - private var accountInputError = false + private lateinit var accountInput: AccountInput override fun onCreateView( inflater: LayoutInflater, @@ -43,46 +28,25 @@ class LoginFragment : Fragment() { loggingInStatus = view.findViewById(R.id.logging_in_status) loggedInStatus = view.findViewById(R.id.logged_in_status) loginFailStatus = view.findViewById(R.id.login_fail_status) - accountInput = view.findViewById(R.id.account_input) - loginButton = view.findViewById(R.id.login_button) - accountInput.addTextChangedListener(AccountInputWatcher()) - loginButton.setOnClickListener { login() } - setLoginButtonEnabled(false) + accountInput = AccountInput(view, context!!) + accountInput.onLogin = { accountToken -> login(accountToken) } return view } - override fun onAttach(context: Context) { - super.onAttach(context) - - accountInputDisabledBackgroundColor = context.getColor(R.color.white20) - accountInputDisabledTextColor = context.getColor(R.color.white) - accountInputEnabledBackgroundColor = context.getColor(R.color.white) - accountInputEnabledTextColor = context.getColor(R.color.blue) - accountInputErrorTextColor = context.getColor(R.color.red) - } - - private fun setLoginButtonEnabled(enabled: Boolean) { - loginButton.apply { - if (enabled != isEnabled()) { - setEnabled(enabled) - setClickable(enabled) - setFocusable(enabled) - } - } - } - - private fun login() { + private fun login(accountToken: String) { title.setText(R.string.logging_in_title) subtitle.setText(R.string.logging_in_description) - loggingInStatus.setVisibility(View.VISIBLE) - loginFailStatus.setVisibility(View.GONE) - loginButton.setVisibility(View.GONE) - disableAccountInput() + + loggingInStatus.visibility = View.VISIBLE + loginFailStatus.visibility = View.GONE + loggedInStatus.visibility = View.GONE + + accountInput.state = LoginState.InProgress // TODO: Actually log in - if ("1234567890".equals(accountInput.text.toString())) { + if ("1234567890".equals(accountToken)) { Handler().postDelayed(Runnable { loggedIn() }, 1000) } else { Handler().postDelayed(Runnable { loginFailure() }, 1000) @@ -92,50 +56,22 @@ class LoginFragment : Fragment() { private fun loggedIn() { title.setText(R.string.logged_in_title) subtitle.setText("") - loggingInStatus.setVisibility(View.GONE) - loggedInStatus.setVisibility(View.VISIBLE) - accountInput.setVisibility(View.GONE) + + loggingInStatus.visibility = View.GONE + loginFailStatus.visibility = View.GONE + loggedInStatus.visibility = View.VISIBLE + + accountInput.state = LoginState.Success } private fun loginFailure() { title.setText(R.string.login_fail_title) subtitle.setText(R.string.login_fail_description) - loggingInStatus.setVisibility(View.GONE) - loginFailStatus.setVisibility(View.VISIBLE) - loginButton.setVisibility(View.VISIBLE) - loginButton.setEnabled(false) - setAccountInputToErrorState() - } - - private fun setAccountInputToErrorState() { - accountInput.apply { - setEnabled(true) - setBackgroundColor(accountInputEnabledBackgroundColor) - setTextColor(accountInputErrorTextColor) - } - accountInputError = true - } + loggingInStatus.visibility = View.GONE + loginFailStatus.visibility = View.VISIBLE + loggedInStatus.visibility = View.GONE - private fun disableAccountInput() { - accountInput.apply { - setEnabled(false) - setBackgroundColor(accountInputDisabledBackgroundColor) - setTextColor(accountInputDisabledTextColor) - } - } - - inner class AccountInputWatcher : TextWatcher { - override fun beforeTextChanged(text: CharSequence, start: Int, count: Int, after: Int) {} - - override fun onTextChanged(text: CharSequence, start: Int, before: Int, count: Int) {} - - override fun afterTextChanged(text: Editable) { - setLoginButtonEnabled(text.length >= MIN_ACCOUNT_TOKEN_LENGTH) - - if (accountInputError) { - accountInput.setTextColor(accountInputEnabledTextColor) - } - } + accountInput.state = LoginState.Failure } } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/LoginState.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/LoginState.kt new file mode 100644 index 0000000000..df8cc94642 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/LoginState.kt @@ -0,0 +1,8 @@ +package net.mullvad.mullvadvpn + +enum class LoginState { + Initial, + InProgress, + Success, + Failure, +} |
