diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-06-19 17:04:24 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-06-24 23:55:50 +0200 |
| commit | 7f04e9a8e5775967e7aed950cf3bdfb8e2f37b3f (patch) | |
| tree | 565e616737effcd4437a1f68dfd679c7f366f85b | |
| parent | 6ffbd8725beaeffcb143c158636391681269aabf (diff) | |
| download | mullvadvpn-7f04e9a8e5775967e7aed950cf3bdfb8e2f37b3f.tar.xz mullvadvpn-7f04e9a8e5775967e7aed950cf3bdfb8e2f37b3f.zip | |
Add delay at least wrapper and apply to test api method
4 files changed, 28 insertions, 11 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/Delay.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/Delay.kt new file mode 100644 index 0000000000..3449ee23bf --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/Delay.kt @@ -0,0 +1,11 @@ +package net.mullvad.mullvadvpn.util + +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.delay + +suspend fun <T> delayAtLeast(duration: Long, f: suspend () -> T): T = coroutineScope { + val result = async { f() } + delay(timeMillis = duration) + result.await() +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ApiAccessMethodDetailsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ApiAccessMethodDetailsViewModel.kt index a6ba01e81c..fc52cb7eee 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ApiAccessMethodDetailsViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ApiAccessMethodDetailsViewModel.kt @@ -14,10 +14,12 @@ import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.compose.state.ApiAccessMethodDetailsUiState +import net.mullvad.mullvadvpn.constant.MINIMUM_LOADING_TIME_MILLIS import net.mullvad.mullvadvpn.lib.model.ApiAccessMethod import net.mullvad.mullvadvpn.lib.model.ApiAccessMethodId import net.mullvad.mullvadvpn.lib.model.TestApiAccessMethodError import net.mullvad.mullvadvpn.repository.ApiAccessRepository +import net.mullvad.mullvadvpn.util.delayAtLeast class ApiAccessMethodDetailsViewModel( private val apiAccessMethodId: ApiAccessMethodId, @@ -107,8 +109,9 @@ class ApiAccessMethodDetailsViewModel( private suspend fun testMethodById(): Either<TestApiAccessMethodError, Unit> { isTestingApiAccessMethodState.value = true - return apiAccessRepository - .testApiAccessMethodById(apiAccessMethodId) + return delayAtLeast(MINIMUM_LOADING_TIME_MILLIS) { + apiAccessRepository.testApiAccessMethodById(apiAccessMethodId) + } .onLeft { isTestingApiAccessMethodState.value = false } .onRight { isTestingApiAccessMethodState.value = false } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/EditApiAccessMethodViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/EditApiAccessMethodViewModel.kt index 87316e90e2..043c503792 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/EditApiAccessMethodViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/EditApiAccessMethodViewModel.kt @@ -23,6 +23,7 @@ import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.compose.state.ApiAccessMethodTypes import net.mullvad.mullvadvpn.compose.state.EditApiAccessFormData import net.mullvad.mullvadvpn.compose.state.EditApiAccessMethodUiState +import net.mullvad.mullvadvpn.constant.MINIMUM_LOADING_TIME_MILLIS import net.mullvad.mullvadvpn.lib.model.ApiAccessMethod import net.mullvad.mullvadvpn.lib.model.ApiAccessMethodId import net.mullvad.mullvadvpn.lib.model.ApiAccessMethodName @@ -32,6 +33,7 @@ import net.mullvad.mullvadvpn.lib.model.ParsePortError import net.mullvad.mullvadvpn.lib.model.Port import net.mullvad.mullvadvpn.lib.model.SocksAuth import net.mullvad.mullvadvpn.repository.ApiAccessRepository +import net.mullvad.mullvadvpn.util.delayAtLeast import org.apache.commons.validator.routines.InetAddressValidator class EditApiAccessMethodViewModel( @@ -104,7 +106,10 @@ class EditApiAccessMethodViewModel( { errors -> formData.update { it.updateWithErrors(errors) } }, { customProxy -> isTestingApiAccessMethod.value = true - val result = apiAccessRepository.testCustomApiAccessMethod(customProxy) + val result = + delayAtLeast(MINIMUM_LOADING_TIME_MILLIS) { + apiAccessRepository.testCustomApiAccessMethod(customProxy) + } _uiSideEffect.send( EditApiAccessSideEffect.TestApiAccessMethodResult(result.isRight()) ) 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 e35baa571e..30bea42cfe 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 @@ -29,6 +29,7 @@ import net.mullvad.mullvadvpn.lib.model.LoginAccountError import net.mullvad.mullvadvpn.lib.shared.AccountRepository import net.mullvad.mullvadvpn.repository.NewDeviceRepository import net.mullvad.mullvadvpn.usecase.InternetAvailableUseCase +import net.mullvad.mullvadvpn.util.delayAtLeast import net.mullvad.mullvadvpn.util.getOrDefault private const val MINIMUM_LOADING_SPINNER_TIME_MILLIS = 500L @@ -101,15 +102,12 @@ class LoginViewModel( } _loginState.value = Loading.LoggingIn viewModelScope.launch(dispatcher) { - // Ensure we always take at least MINIMUM_LOADING_SPINNER_TIME_MILLIS to show the - // loading indicator - val result = async { accountRepository.login(AccountNumber(accountNumber)) } - - delay(MINIMUM_LOADING_SPINNER_TIME_MILLIS) - val uiState = - result - .await() + // Ensure we always take at least MINIMUM_LOADING_SPINNER_TIME_MILLIS to show the + // loading indicator + delayAtLeast(MINIMUM_LOADING_SPINNER_TIME_MILLIS) { + accountRepository.login(AccountNumber(accountNumber)) + } .fold( { it.toUiState() }, { |
