diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-09-17 23:30:00 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-09-18 11:09:39 +0200 |
| commit | 2d776648bfb8af95b228f852ee59d4326ab3c03b (patch) | |
| tree | 12a369855d3e44f0d769ee92108cba1d98994d9c /android/app/src | |
| parent | 5ff831f597c1361effbca3749df056329cbb2f84 (diff) | |
| download | mullvadvpn-2d776648bfb8af95b228f852ee59d4326ab3c03b.tar.xz mullvadvpn-2d776648bfb8af95b228f852ee59d4326ab3c03b.zip | |
Prevent multiple service binds from accepting the privacy policy
Diffstat (limited to 'android/app/src')
2 files changed, 32 insertions, 10 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt index 605e789edf..9ac8df45d0 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt @@ -201,7 +201,7 @@ private fun ButtonPanel(isStartingService: Boolean, onAcceptClicked: () -> Unit) } else { PrimaryButton( text = stringResource(id = R.string.agree_and_continue), - onClick = onAcceptClicked::invoke, + onClick = onAcceptClicked, ) } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/PrivacyDisclaimerViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/PrivacyDisclaimerViewModel.kt index a78eb1a17b..d2500bc94d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/PrivacyDisclaimerViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/PrivacyDisclaimerViewModel.kt @@ -4,7 +4,11 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.WhileSubscribed +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.repository.PrivacyDisclaimerRepository @@ -16,11 +20,21 @@ class PrivacyDisclaimerViewModel( isPlayBuild: Boolean, ) : ViewModel() { - private val _uiState = - MutableStateFlow( - PrivacyDisclaimerViewState(isStartingService = false, isPlayBuild = isPlayBuild) - ) - val uiState = _uiState + private val _isStartingService = MutableStateFlow(false) + + val uiState = + _isStartingService + .map { isStartingService -> + PrivacyDisclaimerViewState( + isStartingService = isStartingService, + isPlayBuild = isPlayBuild, + ) + } + .stateIn( + viewModelScope, + SharingStarted.WhileSubscribed(), + PrivacyDisclaimerViewState(false, isPlayBuild), + ) private val _uiSideEffect = Channel<PrivacyDisclaimerUiSideEffect>() val uiSideEffect = _uiSideEffect.receiveAsFlow() @@ -28,17 +42,25 @@ class PrivacyDisclaimerViewModel( fun setPrivacyDisclosureAccepted() { privacyDisclaimerRepository.setPrivacyDisclosureAccepted() viewModelScope.launch { - _uiState.update { it.copy(isStartingService = true) } - _uiSideEffect.send(PrivacyDisclaimerUiSideEffect.StartService) + if (!_isStartingService.value) { + _isStartingService.update { true } + _uiSideEffect.send(PrivacyDisclaimerUiSideEffect.StartService) + } } } fun onServiceStartedSuccessful() { - viewModelScope.launch { _uiSideEffect.send(PrivacyDisclaimerUiSideEffect.NavigateToLogin) } + viewModelScope.launch { + _uiSideEffect.send(PrivacyDisclaimerUiSideEffect.NavigateToLogin) + _isStartingService.update { false } + } } fun onServiceStartedTimeout() { - viewModelScope.launch { _uiSideEffect.send(PrivacyDisclaimerUiSideEffect.NavigateToSplash) } + viewModelScope.launch { + _uiSideEffect.send(PrivacyDisclaimerUiSideEffect.NavigateToSplash) + _isStartingService.update { false } + } } } |
