summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/main
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-06-04 15:50:18 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-06-11 09:54:58 +0200
commitd7b21615b40c69ccd01a27cb490e1a480eec7ac3 (patch)
tree9793c26b440991f2d1c5d015d39cdfe3d592d701 /android/app/src/main
parentf6e490f7bedb0b4f4102623288c77ef54f7fe469 (diff)
downloadmullvadvpn-d7b21615b40c69ccd01a27cb490e1a480eec7ac3.tar.xz
mullvadvpn-d7b21615b40c69ccd01a27cb490e1a480eec7ac3.zip
Prevent loading when logging out
Diffstat (limited to 'android/app/src/main')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt8
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt25
2 files changed, 26 insertions, 7 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
index 4d19095a6e..d78592775b 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
@@ -55,6 +55,7 @@ import net.mullvad.mullvadvpn.compose.transitions.SlideInFromBottomTransition
import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect
import net.mullvad.mullvadvpn.compose.util.SecureScreenWhileInView
import net.mullvad.mullvadvpn.compose.util.createCopyToClipboardHandle
+import net.mullvad.mullvadvpn.lib.model.AccountNumber
import net.mullvad.mullvadvpn.lib.payment.model.PaymentProduct
import net.mullvad.mullvadvpn.lib.payment.model.PaymentStatus
import net.mullvad.mullvadvpn.lib.payment.model.ProductId
@@ -76,7 +77,7 @@ private fun PreviewAccountScreen() {
state =
AccountUiState(
deviceName = "Test Name",
- accountNumber = "1234123412341234",
+ accountNumber = AccountNumber("1234123412341234"),
accountExpiry = null,
showSitePayment = true,
billingPaymentState =
@@ -201,7 +202,10 @@ fun AccountScreen(
onInfoClick = navigateToDeviceInfo
)
- AccountNumberRow(accountNumber = state.accountNumber ?: "", onCopyAccountNumber)
+ AccountNumberRow(
+ accountNumber = state.accountNumber?.value ?: "",
+ onCopyAccountNumber
+ )
PaidUntilRow(accountExpiry = state.accountExpiry)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt
index 0a497c22f6..a42003d6e2 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt
@@ -4,13 +4,21 @@ import android.app.Activity
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.filterIsInstance
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.compose.state.PaymentState
+import net.mullvad.mullvadvpn.lib.model.AccountData
+import net.mullvad.mullvadvpn.lib.model.AccountNumber
+import net.mullvad.mullvadvpn.lib.model.DeviceState
import net.mullvad.mullvadvpn.lib.model.WebsiteAuthToken
import net.mullvad.mullvadvpn.lib.payment.model.ProductId
import net.mullvad.mullvadvpn.lib.shared.AccountRepository
@@ -30,13 +38,13 @@ class AccountViewModel(
val uiState: StateFlow<AccountUiState> =
combine(
- deviceRepository.deviceState,
- accountRepository.accountData,
+ deviceRepository.deviceState.filterIsInstance<DeviceState.LoggedIn>(),
+ accountData(),
paymentUseCase.paymentAvailability
) { deviceState, accountData, paymentAvailability ->
AccountUiState(
- deviceName = deviceState?.displayName() ?: "",
- accountNumber = deviceState?.token()?.value ?: "",
+ deviceName = deviceState.device.displayName(),
+ accountNumber = deviceState.accountNumber,
accountExpiry = accountData?.expiryDate,
showSitePayment = !isPlayBuild,
billingPaymentState = paymentAvailability?.toPaymentState()
@@ -50,6 +58,13 @@ class AccountViewModel(
fetchPaymentAvailability()
}
+ private fun accountData(): Flow<AccountData?> =
+ // Ignore nulls expect first, to avoid loading when logging out.
+ accountRepository.accountData
+ .filterNotNull()
+ .onStart<AccountData?> { emit(accountRepository.accountData.value) }
+ .distinctUntilChanged()
+
fun onManageAccountClick() {
viewModelScope.launch {
accountRepository.getWebsiteAuthToken()?.let { wwwAuthToken ->
@@ -115,7 +130,7 @@ class AccountViewModel(
data class AccountUiState(
val deviceName: String?,
- val accountNumber: String?,
+ val accountNumber: AccountNumber?,
val accountExpiry: DateTime?,
val showSitePayment: Boolean,
val billingPaymentState: PaymentState? = null,