diff options
| author | Albin <albin@mullvad.net> | 2022-04-27 10:39:40 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2022-05-17 15:06:04 +0200 |
| commit | 26cb06ead245f9bab564be3960973870970f10d7 (patch) | |
| tree | a069814f442df0dd08046b7faf8fcbe8482ba085 /android | |
| parent | dca2d61be24a65e662036dc0a4bb38b4c76688d6 (diff) | |
| download | mullvadvpn-26cb06ead245f9bab564be3960973870970f10d7.tar.xz mullvadvpn-26cb06ead245f9bab564be3960973870970f10d7.zip | |
Add Android login event
Diffstat (limited to 'android')
5 files changed, 45 insertions, 29 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt index 4f2d5857fd..c09ea43164 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt @@ -8,6 +8,7 @@ import net.mullvad.mullvadvpn.model.AppVersionInfo as AppVersionInfoData import net.mullvad.mullvadvpn.model.DeviceState import net.mullvad.mullvadvpn.model.GeoIpLocation import net.mullvad.mullvadvpn.model.KeygenEvent +import net.mullvad.mullvadvpn.model.LoginResult import net.mullvad.mullvadvpn.model.LoginStatus as LoginStatusData import net.mullvad.mullvadvpn.model.RelayList import net.mullvad.mullvadvpn.model.Settings @@ -43,6 +44,9 @@ sealed class Event : Message.EventMessage() { data class LoginStatus(val status: LoginStatusData?) : Event() @Parcelize + data class LoginEvent(val result: LoginResult) : Event() + + @Parcelize data class NewLocation(val location: GeoIpLocation?) : Event() @Parcelize diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginStatus.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginStatus.kt index 8e3b8f841d..e143cc630c 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginStatus.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginStatus.kt @@ -8,8 +8,7 @@ import org.joda.time.DateTime data class LoginStatus( val account: String, val expiry: DateTime?, - val isNewAccount: Boolean, - val loginResult: LoginResult? + val isNewAccount: Boolean ) : Parcelable { val isExpired: Boolean get() = expiry != null && expiry.isAfterNow() diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt index 78ee4cb850..8ce533ca3c 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt @@ -193,7 +193,9 @@ class AccountCache(private val endpoint: ServiceEndpoint) { } private suspend fun doLogin(account: String) { - val loginResult = daemon.await().loginAccount(account) + val loginResult = daemon.await().loginAccount(account).also { result -> + endpoint.sendEvent(Event.LoginEvent(result)) + } val accountExpiryDate = loginResult .takeIf { it == LoginResult.Ok } @@ -208,8 +210,7 @@ class AccountCache(private val endpoint: ServiceEndpoint) { loginStatus = LoginStatus( account = account, expiry = accountExpiryDate, - isNewAccount = newlyCreatedAccount, - loginResult + isNewAccount = newlyCreatedAccount ) } } @@ -239,7 +240,7 @@ class AccountCache(private val endpoint: ServiceEndpoint) { accountNumber = newAccountNumber loginStatus = newAccountNumber?.let { account -> - LoginStatus(account, null, newlyCreatedAccount, null) + LoginStatus(account, null, newlyCreatedAccount) } fetchAccountExpiry() @@ -267,8 +268,7 @@ class AccountCache(private val endpoint: ServiceEndpoint) { LoginStatus( currentStatus.account, newAccountExpiry, - currentStatus.isNewAccount, - null + currentStatus.isNewAccount ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/AccountCache.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/AccountCache.kt index d74efa66ad..829c8ffeb9 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/AccountCache.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/AccountCache.kt @@ -26,6 +26,12 @@ class AccountCache(private val connection: Messenger, eventDispatcher: EventDisp ) val accountCreationEvents = _accountCreationEvents.asSharedFlow() + private val _loginEvents = MutableSharedFlow<Event.LoginEvent>( + extraBufferCapacity = 1, + onBufferOverflow = BufferOverflow.DROP_OLDEST + ) + val loginEvents = _loginEvents.asSharedFlow() + init { eventDispatcher.apply { registerHandler(Event.AccountHistory::class) { event -> @@ -40,6 +46,10 @@ class AccountCache(private val connection: Messenger, eventDispatcher: EventDisp registerHandler(Event.AccountCreationEvent::class) { event -> _accountCreationEvents.tryEmit(event.result) } + + registerHandler(Event.LoginEvent::class) { event -> + _loginEvents.tryEmit(event) + } } } 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 67662b884c..10305ea9d2 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 @@ -10,6 +10,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch +import net.mullvad.mullvadvpn.model.AccountCreationResult import net.mullvad.mullvadvpn.model.LoginResult import net.mullvad.mullvadvpn.ui.serviceconnection.AccountCache @@ -62,8 +63,15 @@ class LoginViewModel( } fun login(accountToken: String) { - _uiState.value = LoginUiState.Loading - accountCache?.login(accountToken) + accountCache?.apply { + _uiState.value = LoginUiState.Loading + + viewModelScope.launch { + _uiState.value = loginEvents.first().result.mapToUiState() + } + + login(accountToken) + } } @RestrictTo(RestrictTo.Scope.TESTS) @@ -75,26 +83,21 @@ class LoginViewModel( onAccountHistoryChange.subscribe(this) { history -> _accountHistory.value = history } + } - onLoginStatusChange.subscribe(this, startWithLatestEvent = false) { status -> - _uiState.value = when { - status == null -> { - LoginUiState.Default - } - status.isNewAccount -> { - LoginUiState.AccountCreated - } - else -> { - when (status.loginResult) { - LoginResult.Ok -> LoginUiState.Success(false) - LoginResult.InvalidAccount -> LoginUiState.InvalidAccountError - LoginResult.MaxDevicesReached -> LoginUiState.TooManyDevicesError - else -> LoginUiState.OtherError( - errorMessage = status.loginResult?.toString() ?: "" - ) - } - } - } + private fun AccountCreationResult.mapToUiState(): LoginUiState { + return when (this) { + is AccountCreationResult.Success -> LoginUiState.AccountCreated + AccountCreationResult.Failure -> LoginUiState.UnableToCreateAccountError + } + } + + private fun LoginResult.mapToUiState(): LoginUiState { + return when (this) { + LoginResult.Ok -> LoginUiState.Success(false) + LoginResult.InvalidAccount -> LoginUiState.InvalidAccountError + LoginResult.MaxDevicesReached -> LoginUiState.TooManyDevicesError + else -> LoginUiState.OtherError(errorMessage = this.toString()) } } |
