summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorsaber safavi <saber.safavi@codic.se>2023-05-03 09:07:31 +0200
committersaber safavi <saber.safavi@codic.se>2023-05-03 12:06:41 +0200
commit567306f1a04cc0a3e76925df59c7c115910b7ba4 (patch)
tree681e330a0ea38fa8afdb6d6b7c1f5cf737886341 /android
parent7e921fa2d43a7ebf1dcdad3f4f554d3f108322d9 (diff)
downloadmullvadvpn-567306f1a04cc0a3e76925df59c7c115910b7ba4.tar.xz
mullvadvpn-567306f1a04cc0a3e76925df59c7c115910b7ba4.zip
Add warning toast for changing settings
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AdvancedSettingScreen.kt28
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt8
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/AdvancedFragment.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AdvancedSettingsViewModel.kt22
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 = ""
}