diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-01-14 22:03:50 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-03-31 14:36:30 +0000 |
| commit | ae9c235e317b019befa69c31b915d5afe9ebcdc9 (patch) | |
| tree | 5f3c93683227013f8750d2de8fc2f4e641aa1978 /android/src/main | |
| parent | e33ac60aad018ddae0b79d81b085712438acafca (diff) | |
| download | mullvadvpn-ae9c235e317b019befa69c31b915d5afe9ebcdc9.tar.xz mullvadvpn-ae9c235e317b019befa69c31b915d5afe9ebcdc9.zip | |
Refactor `LoginFragment` to use `LoginStatus`
Diffstat (limited to 'android/src/main')
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt | 142 |
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 - } - } } |
