summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-01-14 22:03:50 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-03-31 14:36:30 +0000
commitae9c235e317b019befa69c31b915d5afe9ebcdc9 (patch)
tree5f3c93683227013f8750d2de8fc2f4e641aa1978 /android/src
parente33ac60aad018ddae0b79d81b085712438acafca (diff)
downloadmullvadvpn-ae9c235e317b019befa69c31b915d5afe9ebcdc9.tar.xz
mullvadvpn-ae9c235e317b019befa69c31b915d5afe9ebcdc9.zip
Refactor `LoginFragment` to use `LoginStatus`
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt142
1 files changed, 68 insertions, 74 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt
index 3e9bd5b8b7..9e6935cf68 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt
@@ -8,21 +8,21 @@ import android.view.ViewGroup
import android.widget.ScrollView
import android.widget.TextView
import androidx.core.content.ContextCompat
-import androidx.fragment.app.Fragment
-import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.delay
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.model.GetAccountDataResult
-import net.mullvad.mullvadvpn.service.endpoint.AccountCache
+import net.mullvad.mullvadvpn.model.LoginStatus
import net.mullvad.mullvadvpn.ui.widget.AccountLogin
import net.mullvad.mullvadvpn.ui.widget.Button
-import org.joda.time.DateTime
class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), NavigationBarPainter {
- enum class LoginResult {
- ExistingAccountWithTime,
- ExistingAccountOutOfTime,
- NewAccount;
+ companion object {
+ private enum class State {
+ Starting,
+ Idle,
+ LoggingIn,
+ CreatingAccount,
+ }
}
private lateinit var title: TextView
@@ -34,7 +34,8 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), Na
private lateinit var scrollArea: ScrollView
private lateinit var background: View
- private val loggedIn = CompletableDeferred<LoginResult>()
+ private var loginStatus: LoginStatus? = null
+ private var state = State.Starting
override fun onSafelyCreateView(
inflater: LayoutInflater,
@@ -71,29 +72,27 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), Na
override fun onSafelyStart() {
accountLogin.state = LoginState.Initial
- jobTracker.newBackgroundJob("checkIfAlreadyLoggedIn") {
- if (accountCache.onAccountNumberChange.latestEvent != null) {
- val loginResult = if (accountCache.newlyCreatedAccount) {
- LoginResult.NewAccount
- } else {
- loginResultForExpiry(accountCache.onAccountExpiryChange.latestEvent)
- }
-
- loggedIn.complete(loginResult)
+ accountCache.onAccountHistoryChange.subscribe(this) { history ->
+ jobTracker.newUiJob("updateHistory") {
+ accountLogin.accountHistory = history
}
}
- jobTracker.newUiJob("advanceToNextScreen") {
- when (loggedIn.await()) {
- LoginResult.ExistingAccountWithTime -> openNextScreen(ConnectFragment())
- LoginResult.ExistingAccountOutOfTime -> openNextScreen(OutOfTimeFragment())
- LoginResult.NewAccount -> openNextScreen(WelcomeFragment())
- }
- }
+ accountCache.onLoginStatusChange.subscribe(this) { status ->
+ jobTracker.newUiJob("updateLoginStatus") {
+ loginStatus = status
- accountCache.onAccountHistoryChange.subscribe(this) { history ->
- jobTracker.newUiJob("updateHistory") {
- accountLogin.accountHistory = history
+ if (status == null) {
+ if (state == State.LoggingIn || state == State.CreatingAccount) {
+ loginFailure()
+ }
+ } else {
+ if (state == State.Starting) {
+ openNextScreen()
+ } else {
+ loggedIn()
+ }
+ }
}
}
@@ -105,6 +104,8 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), Na
false
}
}
+
+ state = State.Idle
}
override fun onResume() {
@@ -115,6 +116,7 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), Na
override fun onSafelyStop() {
jobTracker.cancelJob("advanceToNextScreen")
accountCache.onAccountHistoryChange.unsubscribe(this)
+ accountCache.onLoginStatusChange.unsubscribe(this)
parentActivity.backButtonHandler = null
}
@@ -125,6 +127,8 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), Na
}
private suspend fun createAccount() {
+ state = State.CreatingAccount
+
title.setText(R.string.logging_in_title)
subtitle.setText(R.string.creating_new_account)
@@ -136,18 +140,12 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), Na
scrollToShow(loggingInStatus)
- val accountToken = jobTracker.runOnBackground {
- accountCache.createNewAccount()
- }
-
- if (accountToken == null) {
- loginFailure(R.string.failed_to_create_account)
- } else {
- loggedIn(resources.getString(R.string.account_created), LoginResult.NewAccount)
- }
+ accountCache.createNewAccount()
}
private fun login(accountToken: String) {
+ state = State.LoggingIn
+
title.setText(R.string.logging_in_title)
subtitle.setText(R.string.logging_in_description)
@@ -165,39 +163,26 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), Na
}
private fun performLogin(accountToken: String) {
- jobTracker.newUiJob("login") {
- val loginResult = jobTracker.runOnBackground {
- val accountDataResult = daemon.getAccountData(accountToken)
-
- when (accountDataResult) {
- is GetAccountDataResult.Ok -> {
- accountCache.login(accountToken)
-
- val expiryString = accountDataResult.accountData.expiry
- val expiry = DateTime.parse(expiryString, AccountCache.EXPIRY_FORMAT)
+ jobTracker.newBackgroundJob("login") {
+ val accountDataResult = daemon.getAccountData(accountToken)
+ val loginSucceded = accountDataResult is GetAccountDataResult.Ok
+ || accountDataResult is GetAccountDataResult.RpcError
- loginResultForExpiry(expiry)
- }
- is GetAccountDataResult.RpcError -> {
- accountCache.login(accountToken)
- LoginResult.ExistingAccountWithTime
- }
- else -> null
- }
- }
-
- if (loginResult != null) {
- loggedIn("", loginResult)
- } else {
- loginFailure(R.string.login_fail_description)
+ if (loginSucceded) {
+ accountCache.login(accountToken)
}
}
}
- private suspend fun loggedIn(subtitleMessage: String, result: LoginResult) {
- showLoggedInMessage(subtitleMessage)
+ private suspend fun loggedIn() {
+ if (loginStatus?.isNewAccount ?: false) {
+ showLoggedInMessage(resources.getString(R.string.account_created))
+ } else {
+ showLoggedInMessage("")
+ }
+
delay(1000)
- loggedIn.complete(result)
+ openNextScreen()
}
private fun showLoggedInMessage(subtitleMessage: String) {
@@ -213,14 +198,31 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), Na
scrollToShow(loggedInStatus)
}
- private fun openNextScreen(fragment: Fragment) {
+ private fun openNextScreen() {
+ val status = loginStatus
+
+ val fragment = when {
+ status == null -> return
+ status.isNewAccount -> WelcomeFragment()
+ status.isExpired -> OutOfTimeFragment()
+ else -> ConnectFragment()
+ }
+
parentFragmentManager.beginTransaction().apply {
replace(R.id.main_fragment, fragment)
commit()
}
}
- private fun loginFailure(description: Int) {
+ private fun loginFailure() {
+ val description = when (state) {
+ State.LoggingIn -> R.string.login_fail_description
+ State.CreatingAccount -> R.string.failed_to_create_account
+ State.Idle, State.Starting -> return
+ }
+
+ state = State.Idle
+
title.setText(R.string.login_fail_title)
subtitle.setText(description)
@@ -232,12 +234,4 @@ class LoginFragment : ServiceDependentFragment(OnNoService.GoToLaunchScreen), Na
scrollToShow(accountLogin)
}
-
- private fun loginResultForExpiry(expiry: DateTime?): LoginResult {
- if (expiry == null || expiry.isAfterNow()) {
- return LoginResult.ExistingAccountWithTime
- } else {
- return LoginResult.ExistingAccountOutOfTime
- }
- }
}