diff options
Diffstat (limited to 'android/app/src')
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()) } } |
