summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-09-17 23:30:00 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-09-18 11:09:39 +0200
commit2d776648bfb8af95b228f852ee59d4326ab3c03b (patch)
tree12a369855d3e44f0d769ee92108cba1d98994d9c /android/app/src
parent5ff831f597c1361effbca3749df056329cbb2f84 (diff)
downloadmullvadvpn-2d776648bfb8af95b228f852ee59d4326ab3c03b.tar.xz
mullvadvpn-2d776648bfb8af95b228f852ee59d4326ab3c03b.zip
Prevent multiple service binds from accepting the privacy policy
Diffstat (limited to 'android/app/src')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/PrivacyDisclaimerViewModel.kt40
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 }
+ }
}
}