summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'android/app/src')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt28
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/DeviceListFragment.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt17
4 files changed, 40 insertions, 9 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt
index 8f939487e5..4f29198652 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt
@@ -38,7 +38,7 @@ val uiModule = module {
single { ServiceConnectionManager(androidContext()) }
single { DeviceRepository(get()) }
- viewModel { LoginViewModel(get()) }
+ viewModel { LoginViewModel(get(), get()) }
viewModel { DeviceRevokedViewModel(get()) }
viewModel { DeviceListViewModel(get()) }
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt
index 51b31635cf..de240c765c 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LoginFragment.kt
@@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.ui.fragments.ACCOUNT_TOKEN_ARGUMENT_KEY
+import net.mullvad.mullvadvpn.ui.fragments.DeviceListFragment
import net.mullvad.mullvadvpn.ui.widget.AccountLogin
import net.mullvad.mullvadvpn.ui.widget.HeaderBar
import net.mullvad.mullvadvpn.viewmodel.LoginViewModel
@@ -153,8 +154,11 @@ class LoginFragment :
}
is LoginViewModel.LoginUiState.TooManyDevicesError -> {
- // TODO: Switch to TooManyDevicesFragment
- loginFailure("Too many devices!")
+ openDeviceListFragment(uiState.accountToken)
+ }
+
+ is LoginViewModel.LoginUiState.TooManyDevicesMissingListError -> {
+ loginFailure(context?.getString(R.string.failed_to_fetch_devices))
}
is LoginViewModel.LoginUiState.UnableToCreateAccountError -> {
@@ -174,6 +178,24 @@ class LoginFragment :
}
}
+ private fun openDeviceListFragment(accountToken: String) {
+ val deviceFragment = DeviceListFragment().apply {
+ arguments = Bundle().apply { putString(ACCOUNT_TOKEN_ARGUMENT_KEY, accountToken) }
+ }
+
+ parentFragmentManager.beginTransaction().apply {
+ setCustomAnimations(
+ R.anim.fragment_enter_from_right,
+ R.anim.fragment_exit_to_left,
+ R.anim.fragment_half_enter_from_left,
+ R.anim.fragment_exit_to_right
+ )
+ replace(R.id.main_fragment, deviceFragment)
+ addToBackStack(null)
+ commit()
+ }
+ }
+
private fun showDefault() {
accountLogin.state = LoginState.Initial
headerBar.tunnelState = null
@@ -210,7 +232,7 @@ class LoginFragment :
scrollToShow(loggingInStatus)
}
- private fun loginFailure(description: String) {
+ private fun loginFailure(description: String? = "") {
title.setText(R.string.login_fail_title)
subtitle.setText(description)
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/DeviceListFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/DeviceListFragment.kt
index 11ef615ad8..6d5e47f8dd 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/DeviceListFragment.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragments/DeviceListFragment.kt
@@ -47,6 +47,7 @@ class DeviceListFragment : Fragment() {
}
private fun openLoginView() {
+ parentActivity()?.clearBackStack()
val loginFragment = LoginFragment().apply {
if (deviceListViewModel.accountToken != null) {
arguments = Bundle().apply {
@@ -59,7 +60,6 @@ class DeviceListFragment : Fragment() {
}
parentFragmentManager.beginTransaction().apply {
replace(R.id.main_fragment, loginFragment)
- addToBackStack(null)
commit()
}
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt
index 84e794df6e..5b80bbe3fd 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt
@@ -19,10 +19,12 @@ import net.mullvad.mullvadvpn.model.AccountCreationResult
import net.mullvad.mullvadvpn.model.AccountHistory
import net.mullvad.mullvadvpn.model.LoginResult
import net.mullvad.mullvadvpn.ui.serviceconnection.AccountCache
+import net.mullvad.mullvadvpn.ui.serviceconnection.DeviceRepository
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionState
class LoginViewModel(
+ private val deviceRepository: DeviceRepository,
private val serviceConnectionManager: ServiceConnectionManager,
private val dispatcher: CoroutineDispatcher = Dispatchers.IO
) : ViewModel() {
@@ -62,7 +64,8 @@ class LoginViewModel(
object AccountCreated : LoginUiState()
object UnableToCreateAccountError : LoginUiState()
object InvalidAccountError : LoginUiState()
- object TooManyDevicesError : LoginUiState()
+ data class TooManyDevicesError(val accountToken: String) : LoginUiState()
+ object TooManyDevicesMissingListError : LoginUiState()
data class OtherError(val errorMessage: String) : LoginUiState()
}
@@ -101,7 +104,7 @@ class LoginViewModel(
viewModelScope.launch(dispatcher) {
_uiState.value = cache.loginEvents
.onStart { cache.login(accountToken) }
- .map { it.result.mapToUiState() }
+ .map { it.result.mapToUiState(accountToken) }
.first()
}
}
@@ -126,11 +129,17 @@ class LoginViewModel(
}
}
- private fun LoginResult.mapToUiState(): LoginUiState {
+ private suspend fun LoginResult.mapToUiState(accountToken: String): LoginUiState {
return when (this) {
LoginResult.Ok -> LoginUiState.Success(false)
LoginResult.InvalidAccount -> LoginUiState.InvalidAccountError
- LoginResult.MaxDevicesReached -> LoginUiState.TooManyDevicesError
+ LoginResult.MaxDevicesReached -> {
+ if (deviceRepository.getDeviceList(accountToken).isAvailable()) {
+ LoginUiState.TooManyDevicesError(accountToken)
+ } else {
+ LoginUiState.TooManyDevicesMissingListError
+ }
+ }
else -> LoginUiState.OtherError(errorMessage = this.toString())
}
}