summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-03-12 13:53:15 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-03-13 12:39:45 +0000
commit2fc8e2b5af1c77bd3a9af300bf321f4312b03ca8 (patch)
treec492e8a6f03b3d98166b679f6c9f41abe5b6c951 /android/src
parent4a348edae0de2eeb88395e03adad06303244cfed (diff)
downloadmullvadvpn-2fc8e2b5af1c77bd3a9af300bf321f4312b03ca8.tar.xz
mullvadvpn-2fc8e2b5af1c77bd3a9af300bf321f4312b03ca8.zip
Refactor to separate account input state handling
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/AccountInput.kt110
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/LoginFragment.kt106
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/LoginState.kt8
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,
+}