diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-08-08 16:44:24 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-09-30 14:19:34 +0200 |
| commit | 2c3f0c3c91b4e750c557f7e89015dd493a7cd4bf (patch) | |
| tree | 86b8264577274b2503e1209a1f5cdfd486cc16b3 /android/app/src | |
| parent | 7221f569af139c76d0848af2eb064ef3859cb94b (diff) | |
| download | mullvadvpn-2c3f0c3c91b4e750c557f7e89015dd493a7cd4bf.tar.xz mullvadvpn-2c3f0c3c91b4e750c557f7e89015dd493a7cd4bf.zip | |
Improve account data fetching
Add a new account data fetch every time a user enters the connect screen
This is limited to at a maximum one fetch every minute.
Add a check that the user is still logged in to the same account
before updating the account data cache.
Change account fetching behavior in the account screen to
fetch on every enter instead of init.
Diffstat (limited to 'android/app/src')
7 files changed, 19 insertions, 11 deletions
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 08a99a8aef..ba7e843c6d 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 @@ -54,10 +54,10 @@ class AccountViewModel( ) .toLc<Unit, AccountUiState>() } - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), Lc.Loading(Unit)) + .onStart { viewModelScope.launch { updateAccountExpiry() } } + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), Lc.Loading(Unit)) init { - updateAccountExpiry() verifyPurchases() } @@ -88,7 +88,7 @@ class AccountViewModel( } private fun updateAccountExpiry() { - viewModelScope.launch { accountRepository.getAccountData() } + viewModelScope.launch { accountRepository.refreshAccountData() } } private fun verifyPurchases() { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AddTimeViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AddTimeViewModel.kt index 36e6864a80..e96162c858 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AddTimeViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AddTimeViewModel.kt @@ -105,7 +105,7 @@ class AddTimeViewModel( } private fun updateAccountExpiry() { - viewModelScope.launch { accountRepository.getAccountData() } + viewModelScope.launch { accountRepository.refreshAccountData() } } private fun PurchaseResult.toPurchaseState() = diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt index e836acb844..4ed52d4c63 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch @@ -110,12 +111,17 @@ class ConnectViewModel( isPlayBuild = isPlayBuild, ) } - .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), ConnectUiState.INITIAL) + .onStart { + viewModelScope.launch { + accountRepository.refreshAccountData(ignoreTimeout = false) + } + } + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_0000), ConnectUiState.INITIAL) init { viewModelScope.launch { if (paymentUseCase.verifyPurchases().isSuccess()) { - accountRepository.getAccountData() + accountRepository.refreshAccountData() } } viewModelScope.launch { deviceRepository.updateDevice() } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt index ace068304d..1ac414e725 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt @@ -84,7 +84,7 @@ class OutOfTimeViewModel( } private suspend fun updateAccountExpiry() { - accountRepository.getAccountData() + accountRepository.refreshAccountData() } private fun notOutOfTimeEffect() = diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt index 334a360cfd..d8ea161787 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt @@ -105,7 +105,7 @@ class WelcomeViewModel( } private suspend fun updateAccountExpiry() { - accountRepository.getAccountData() + accountRepository.refreshAccountData() } sealed interface UiSideEffect { diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModelTest.kt index 7a6b756bf5..26fc228729 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModelTest.kt @@ -2,9 +2,11 @@ package net.mullvad.mullvadvpn.viewmodel import app.cash.turbine.test import arrow.core.right +import io.mockk.Runs import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every +import io.mockk.just import io.mockk.mockk import io.mockk.unmockkAll import java.time.ZonedDateTime @@ -61,7 +63,7 @@ class AccountViewModelTest { every { mockAccountRepository.accountData } returns accountExpiryState every { mockDeviceRepository.deviceState } returns deviceState coEvery { mockPaymentUseCase.paymentAvailability } returns paymentAvailability - coEvery { mockAccountRepository.getAccountData() } returns null + coEvery { mockAccountRepository.refreshAccountData(any()) } just Runs viewModel = AccountViewModel( diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AddTimeViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AddTimeViewModelTest.kt index 7e3f966dbb..d3c95690bf 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AddTimeViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AddTimeViewModelTest.kt @@ -56,7 +56,7 @@ class AddTimeViewModelTest { VerificationResult.NothingToVerify.right() coEvery { mockPaymentUseCase.queryPaymentAvailability() } just Runs coEvery { mockPaymentUseCase.resetPurchaseResult() } just Runs - coEvery { mockAccountRepository.getAccountData() } returns null + coEvery { mockAccountRepository.refreshAccountData(any()) } just Runs viewModel = AddTimeViewModel( @@ -151,7 +151,7 @@ class AddTimeViewModelTest { purchaseResult.emit(purchaseResultData) // Assert - coVerify { mockAccountRepository.getAccountData() } + coVerify { mockAccountRepository.refreshAccountData(ignoreTimeout = true) } } @Test |
