summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2022-04-27 10:39:40 +0200
committerAlbin <albin@mullvad.net>2022-05-17 15:06:04 +0200
commit26cb06ead245f9bab564be3960973870970f10d7 (patch)
treea069814f442df0dd08046b7faf8fcbe8482ba085 /android
parentdca2d61be24a65e662036dc0a4bb38b4c76688d6 (diff)
downloadmullvadvpn-26cb06ead245f9bab564be3960973870970f10d7.tar.xz
mullvadvpn-26cb06ead245f9bab564be3960973870970f10d7.zip
Add Android login event
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/LoginStatus.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/AccountCache.kt12
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/AccountCache.kt10
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt45
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())
}
}