diff options
| author | saber safavi <saber.safavi@codic.se> | 2023-05-03 09:07:31 +0200 |
|---|---|---|
| committer | saber safavi <saber.safavi@codic.se> | 2023-05-03 12:06:41 +0200 |
| commit | 567306f1a04cc0a3e76925df59c7c115910b7ba4 (patch) | |
| tree | 681e330a0ea38fa8afdb6d6b7c1f5cf737886341 /android | |
| parent | 7e921fa2d43a7ebf1dcdad3f4f554d3f108322d9 (diff) | |
| download | mullvadvpn-567306f1a04cc0a3e76925df59c7c115910b7ba4.tar.xz mullvadvpn-567306f1a04cc0a3e76925df59c7c115910b7ba4.zip | |
Add warning toast for changing settings
Diffstat (limited to 'android')
4 files changed, 51 insertions, 10 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AdvancedSettingScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AdvancedSettingScreen.kt index fe45ac0432..bfe0088136 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AdvancedSettingScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AdvancedSettingScreen.kt @@ -1,5 +1,6 @@ package net.mullvad.mullvadvpn.compose.screen +import android.widget.Toast import androidx.compose.animation.animateContentSize import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background @@ -17,6 +18,7 @@ import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable @@ -24,6 +26,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource @@ -32,6 +35,9 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.asSharedFlow import me.onebone.toolbar.ScrollStrategy import me.onebone.toolbar.rememberCollapsingToolbarScaffoldState import net.mullvad.mullvadvpn.R @@ -66,7 +72,7 @@ private fun PreviewAdvancedSettings() { AdvancedSettingsUiState.DefaultUiState( mtu = "1337", isCustomDnsEnabled = true, - customDnsItems = listOf(CustomDnsItem("0.0.0.0", false)) + customDnsItems = listOf(CustomDnsItem("0.0.0.0", false)), ), onMtuCellClick = {}, onMtuInputChange = {}, @@ -89,7 +95,8 @@ private fun PreviewAdvancedSettings() { onMalwareInfoClicked = {}, onCustomDnsInfoClicked = {}, onDismissInfoClicked = {}, - onBackClick = {} + onBackClick = {}, + toastMessagesSharedFlow = MutableSharedFlow<String>().asSharedFlow() ) } @@ -121,7 +128,8 @@ fun AdvancedSettingScreen( onCustomDnsInfoClicked: () -> Unit = {}, onDismissInfoClicked: () -> Unit = {}, onBackClick: () -> Unit = {}, - onStopEvent: () -> Unit = {} + onStopEvent: () -> Unit = {}, + toastMessagesSharedFlow: SharedFlow<String> ) { val cellVerticalSpacing = dimensionResource(id = R.dimen.cell_label_vertical_padding) val cellHorizontalSpacing = dimensionResource(id = R.dimen.cell_left_padding) @@ -187,8 +195,14 @@ fun AdvancedSettingScreen( modifier = scaffoldModifier, backTitle = stringResource(id = R.string.settings) ) - } + }, ) { + val context = LocalContext.current + LaunchedEffect(Unit) { + toastMessagesSharedFlow.collect { message -> + Toast.makeText(context, message, Toast.LENGTH_SHORT).show() + } + } DisposableEffect(lifecycleOwner) { val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_STOP) { @@ -281,7 +295,7 @@ fun AdvancedSettingScreen( start = cellHorizontalSpacing, top = topPadding, end = cellHorizontalSpacing, - bottom = cellVerticalSpacing, + bottom = cellVerticalSpacing ) ) } @@ -323,7 +337,7 @@ fun AdvancedSettingScreen( bodyView = {}, subtitle = null, background = MullvadBlue20, - startPadding = biggerPadding + startPadding = biggerPadding, ) } } @@ -337,7 +351,7 @@ fun AdvancedSettingScreen( start = cellHorizontalSpacing, top = topPadding, end = cellHorizontalSpacing, - bottom = cellVerticalSpacing + bottom = cellVerticalSpacing, ) ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt index 8427ae0773..1d1f02138e 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt @@ -88,7 +88,13 @@ val uiModule = module { ChangelogViewModel(get(), BuildConfig.VERSION_CODE, BuildConfig.ALWAYS_SHOW_CHANGELOG) } viewModel { PrivacyDisclaimerViewModel(get()) } - viewModel { AdvancedSettingsViewModel(repository = get(), inetAddressValidator = get()) } + viewModel { + AdvancedSettingsViewModel( + get(), + get(), + get(), + ) + } } const val APPS_SCOPE = "APPS_SCOPE" diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/AdvancedFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/AdvancedFragment.kt index 23a5826e47..5e9be88387 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/AdvancedFragment.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/AdvancedFragment.kt @@ -50,7 +50,8 @@ class AdvancedFragment : BaseFragment() { onMalwareInfoClicked = vm::onMalwareInfoClick, onDismissInfoClicked = vm::onDismissInfoClick, onBackClick = { activity?.onBackPressed() }, - onStopEvent = vm::onStopEvent + onStopEvent = vm::onStopEvent, + toastMessagesSharedFlow = vm.toastMessages ) } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AdvancedSettingsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AdvancedSettingsViewModel.kt index e9d9f559d8..89f2df1399 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AdvancedSettingsViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AdvancedSettingsViewModel.kt @@ -1,18 +1,22 @@ package net.mullvad.mullvadvpn.viewmodel +import android.content.res.Resources import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import java.net.InetAddress import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.state.AdvancedSettingsUiState import net.mullvad.mullvadvpn.model.DefaultDnsOptions import net.mullvad.mullvadvpn.model.DnsState @@ -24,9 +28,13 @@ import org.apache.commons.validator.routines.InetAddressValidator class AdvancedSettingsViewModel( private val repository: SettingsRepository, private val inetAddressValidator: InetAddressValidator, + private val resources: Resources, private val dispatcher: CoroutineDispatcher = Dispatchers.IO ) : ViewModel() { + private val _toastMessages = MutableSharedFlow<String>(extraBufferCapacity = 1) + val toastMessages = _toastMessages.asSharedFlow() + private val dialogState = MutableStateFlow<AdvancedSettingsDialogState>(AdvancedSettingsDialogState.NoDialog) @@ -196,36 +204,44 @@ class AdvancedSettingsViewModel( hideDialog() } - fun onToggleDnsClick(isEnabled: Boolean) = updateCustomDnsState(isEnabled) + fun onToggleDnsClick(isEnabled: Boolean) { + updateCustomDnsState(isEnabled) + showApplySettingChangesWarningToast() + } fun onToggleBlockAds(isEnabled: Boolean) { updateDefaultDnsOptionsViaRepository( vmState.value.contentBlockersOptions.copy(blockAds = isEnabled) ) + showApplySettingChangesWarningToast() } fun onToggleBlockTrackers(isEnabled: Boolean) { updateDefaultDnsOptionsViaRepository( vmState.value.contentBlockersOptions.copy(blockTrackers = isEnabled) ) + showApplySettingChangesWarningToast() } fun onToggleBlockMalware(isEnabled: Boolean) { updateDefaultDnsOptionsViaRepository( vmState.value.contentBlockersOptions.copy(blockMalware = isEnabled) ) + showApplySettingChangesWarningToast() } fun onToggleBlockAdultContent(isEnabled: Boolean) { updateDefaultDnsOptionsViaRepository( vmState.value.contentBlockersOptions.copy(blockAdultContent = isEnabled) ) + showApplySettingChangesWarningToast() } fun onToggleBlockGambling(isEnabled: Boolean) { updateDefaultDnsOptionsViaRepository( vmState.value.contentBlockersOptions.copy(blockGambling = isEnabled) ) + showApplySettingChangesWarningToast() } fun onRemoveDnsClick() = @@ -318,6 +334,10 @@ class AdvancedSettingsViewModel( } } + private fun showApplySettingChangesWarningToast() { + _toastMessages.tryEmit(resources.getString(R.string.settings_changes_effect_warning_short)) + } + companion object { private const val EMPTY_STRING = "" } |
