diff options
| author | saber safavi <saber.safavi@codic.se> | 2023-05-08 16:44:25 +0200 |
|---|---|---|
| committer | saber safavi <saber.safavi@codic.se> | 2023-05-15 16:24:01 +0200 |
| commit | 525e294bb258b666c891fb80b486fb8c111a77c8 (patch) | |
| tree | 348cc96f53f432cefaac2f29b9d1eb08b5b0d3dc /android | |
| parent | d36af5377e02e9ab9c2daebcb4439ccf4de1a33c (diff) | |
| download | mullvadvpn-525e294bb258b666c891fb80b486fb8c111a77c8.tar.xz mullvadvpn-525e294bb258b666c891fb80b486fb8c111a77c8.zip | |
Add preferences settings to Advanced screen
Diffstat (limited to 'android')
7 files changed, 136 insertions, 23 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/SwitchComposeCell.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/SwitchComposeCell.kt index 980af59693..0b5508d524 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/SwitchComposeCell.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/cell/SwitchComposeCell.kt @@ -46,13 +46,14 @@ private fun PreviewSwitchComposeCell() { fun SwitchComposeCell( title: String, isToggled: Boolean, + subtitle: String? = null, isEnabled: Boolean = true, background: Color = MullvadBlue, onCellClicked: (Boolean) -> Unit = {}, onInfoClicked: (() -> Unit)? = null ) { - val subtitleModifier = Modifier + val textSize = dimensionResource(id = R.dimen.text_small).value.sp BaseCell( title = { SwitchCellTitle( @@ -60,6 +61,10 @@ fun SwitchComposeCell( modifier = Modifier.alpha(if (isEnabled) AlphaActive else AlphaInactive) ) }, + subtitle = + subtitle?.let { + @Composable { Text(text = it, fontSize = textSize, color = MullvadWhite60) } + }, isRowEnabled = isEnabled, bodyView = { SwitchCellView( @@ -70,8 +75,7 @@ fun SwitchComposeCell( ) }, background = background, - onCellClicked = { onCellClicked(!isToggled) }, - subtitleModifier = subtitleModifier + onCellClicked = { onCellClicked(!isToggled) } ) } @@ -100,7 +104,7 @@ fun SwitchCellView( val verticalPadding = 13.dp Row( modifier = modifier.wrapContentWidth().wrapContentHeight(), - verticalAlignment = Alignment.CenterVertically, + verticalAlignment = Alignment.CenterVertically ) { if (onInfoClicked != null) { Icon( @@ -110,7 +114,7 @@ fun SwitchCellView( start = horizontalPadding, end = horizontalPadding, top = verticalPadding, - bottom = verticalPadding, + bottom = verticalPadding ) .align(Alignment.CenterVertically), painter = painterResource(id = R.drawable.icon_info), diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt new file mode 100644 index 0000000000..89ef3cb3a6 --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt @@ -0,0 +1,19 @@ +package net.mullvad.mullvadvpn.compose.dialog + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import net.mullvad.mullvadvpn.R +import net.mullvad.mullvadvpn.compose.component.textResource + +@Composable +fun LocalNetworkSharingInfoDialog(onDismiss: () -> Unit) { + InfoDialog( + message = stringResource(id = R.string.local_network_sharing_info), + additionalInfo = + buildString { + appendLine(stringResource(id = R.string.local_network_sharing_additional_info)) + appendLine(textResource(id = R.string.local_network_sharing_ip_ranges)) + }, + onDismiss = onDismiss + ) +} 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 c07d188e42..fc9bd30be0 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 @@ -58,6 +58,7 @@ import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar import net.mullvad.mullvadvpn.compose.dialog.ContentBlockersInfoDialog import net.mullvad.mullvadvpn.compose.dialog.CustomDnsInfoDialog import net.mullvad.mullvadvpn.compose.dialog.DnsDialog +import net.mullvad.mullvadvpn.compose.dialog.LocalNetworkSharingInfoDialog import net.mullvad.mullvadvpn.compose.dialog.MalwareInfoDialog import net.mullvad.mullvadvpn.compose.dialog.MtuDialog import net.mullvad.mullvadvpn.compose.dialog.ObfuscationInfoDialog @@ -76,6 +77,7 @@ private fun PreviewAdvancedSettings() { AdvancedSettingScreen( uiState = AdvancedSettingsUiState.DefaultUiState( + isAutoConnectEnabled = true, mtu = "1337", isCustomDnsEnabled = true, customDnsItems = listOf(CustomDnsItem("0.0.0.0", false)), @@ -86,6 +88,8 @@ private fun PreviewAdvancedSettings() { onRestoreMtuClick = {}, onCancelMtuDialogClicked = {}, onSplitTunnelingNavigationClick = {}, + onToggleAutoConnect = {}, + onToggleLocalNetworkSharing = {}, onToggleDnsClick = {}, onToggleBlockAds = {}, onToggleBlockTrackers = {}, @@ -97,6 +101,7 @@ private fun PreviewAdvancedSettings() { onSaveDnsClick = {}, onRemoveDnsClick = {}, onCancelDnsDialogClick = {}, + onLocalNetworkSharingInfoClick = {}, onContentsBlockersInfoClicked = {}, onMalwareInfoClicked = {}, onCustomDnsInfoClicked = {}, @@ -121,6 +126,8 @@ fun AdvancedSettingScreen( onRestoreMtuClick: () -> Unit = {}, onCancelMtuDialogClicked: () -> Unit = {}, onSplitTunnelingNavigationClick: () -> Unit = {}, + onToggleAutoConnect: (Boolean) -> Unit = {}, + onToggleLocalNetworkSharing: (Boolean) -> Unit = {}, onToggleDnsClick: (Boolean) -> Unit = {}, onToggleBlockAds: (Boolean) -> Unit = {}, onToggleBlockTrackers: (Boolean) -> Unit = {}, @@ -132,6 +139,7 @@ fun AdvancedSettingScreen( onSaveDnsClick: () -> Unit = {}, onRemoveDnsClick: () -> Unit = {}, onCancelDnsDialogClick: () -> Unit = {}, + onLocalNetworkSharingInfoClick: () -> Unit = {}, onContentsBlockersInfoClicked: () -> Unit = {}, onMalwareInfoClicked: () -> Unit = {}, onCustomDnsInfoClicked: () -> Unit = {}, @@ -165,6 +173,9 @@ fun AdvancedSettingScreen( onDismiss = { onCancelDnsDialogClick() } ) } + is AdvancedSettingsUiState.LocalNetworkSharingInfoDialogUiState -> { + LocalNetworkSharingInfoDialog(onDismissInfoClicked) + } is AdvancedSettingsUiState.ContentBlockersInfoDialogUiState -> { ContentBlockersInfoDialog(onDismissInfoClicked) } @@ -234,7 +245,30 @@ fun AdvancedSettingScreen( .animateContentSize(), state = lazyListState ) { - item { MtuComposeCell(mtuValue = uiState.mtu, onEditMtu = { onMtuCellClick() }) } + item { + Spacer(modifier = Modifier.height(cellVerticalSpacing)) + SwitchComposeCell( + title = stringResource(R.string.auto_connect), + subtitle = stringResource(id = R.string.auto_connect_footer), + isToggled = uiState.isAutoConnectEnabled, + isEnabled = true, + onCellClicked = { newValue -> onToggleAutoConnect(newValue) } + ) + } + item { + Spacer(modifier = Modifier.height(cellVerticalSpacing)) + SwitchComposeCell( + title = stringResource(R.string.local_network_sharing), + isToggled = uiState.isAllowLanEnabled, + isEnabled = true, + onCellClicked = { newValue -> onToggleLocalNetworkSharing(newValue) }, + onInfoClicked = { onLocalNetworkSharingInfoClick() } + ) + } + item { + Spacer(modifier = Modifier.height(cellVerticalSpacing)) + MtuComposeCell(mtuValue = uiState.mtu, onEditMtu = { onMtuCellClick() }) + } itemWithDivider { NavigationComposeCell( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/AdvancedSettingsUiState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/AdvancedSettingsUiState.kt index f08a654078..261714f8f9 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/AdvancedSettingsUiState.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/AdvancedSettingsUiState.kt @@ -7,6 +7,8 @@ import net.mullvad.mullvadvpn.viewmodel.StagedDns sealed interface AdvancedSettingsUiState { val mtu: String + val isAutoConnectEnabled: Boolean + val isLocalNetworkSharingEnabled: Boolean val isCustomDnsEnabled: Boolean val customDnsItems: List<CustomDnsItem> val contentBlockersOptions: DefaultDnsOptions @@ -15,66 +17,91 @@ sealed interface AdvancedSettingsUiState { data class DefaultUiState( override val mtu: String = "", + override val isAutoConnectEnabled: Boolean = false, + override val isLocalNetworkSharingEnabled: Boolean = false, override val isCustomDnsEnabled: Boolean = false, override val isAllowLanEnabled: Boolean = false, override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), - override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, + override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off ) : AdvancedSettingsUiState data class MtuDialogUiState( override val mtu: String = "", + override val isAutoConnectEnabled: Boolean = false, + override val isLocalNetworkSharingEnabled: Boolean = false, override val isCustomDnsEnabled: Boolean = false, override val isAllowLanEnabled: Boolean = false, override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), val mtuEditValue: String, - override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, + override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off ) : AdvancedSettingsUiState data class DnsDialogUiState( override val mtu: String = "", + override val isAutoConnectEnabled: Boolean = false, + override val isLocalNetworkSharingEnabled: Boolean = false, override val isCustomDnsEnabled: Boolean = false, override val isAllowLanEnabled: Boolean = false, override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), val stagedDns: StagedDns, - override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, + override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off + ) : AdvancedSettingsUiState + + data class LocalNetworkSharingInfoDialogUiState( + override val mtu: String = "", + override val isAutoConnectEnabled: Boolean = false, + override val isLocalNetworkSharingEnabled: Boolean = false, + override val isCustomDnsEnabled: Boolean = false, + override val isAllowLanEnabled: Boolean = false, + override val customDnsItems: List<CustomDnsItem> = listOf(), + override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), + override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off ) : AdvancedSettingsUiState data class ContentBlockersInfoDialogUiState( override val mtu: String = "", + override val isAutoConnectEnabled: Boolean = false, + override val isLocalNetworkSharingEnabled: Boolean = false, override val isCustomDnsEnabled: Boolean = false, override val isAllowLanEnabled: Boolean = false, override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), - override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, + override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off ) : AdvancedSettingsUiState data class CustomDnsInfoDialogUiState( override val mtu: String = "", + override val isAutoConnectEnabled: Boolean = false, + override val isLocalNetworkSharingEnabled: Boolean = false, override val isCustomDnsEnabled: Boolean = false, override val isAllowLanEnabled: Boolean = false, override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), - override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, + override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off ) : AdvancedSettingsUiState data class MalwareInfoDialogUiState( override val mtu: String = "", + override val isAutoConnectEnabled: Boolean = false, + override val isLocalNetworkSharingEnabled: Boolean = false, override val isCustomDnsEnabled: Boolean = false, override val isAllowLanEnabled: Boolean = false, override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), - override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, + override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off ) : AdvancedSettingsUiState data class ObfuscationInfoDialogUiState( override val mtu: String = "", + override val isAutoConnectEnabled: Boolean = false, + override val isLocalNetworkSharingEnabled: Boolean = false, override val isCustomDnsEnabled: Boolean = false, override val isAllowLanEnabled: Boolean = false, override val customDnsItems: List<CustomDnsItem> = listOf(), override val contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(), - override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off, + override val selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off ) : AdvancedSettingsUiState } 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 4bd7ea35b8..a7dbc8116d 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 @@ -34,6 +34,8 @@ class AdvancedFragment : BaseFragment() { onRestoreMtuClick = vm::onRestoreMtuClick, onCancelMtuDialogClicked = vm::onCancelDialogClick, onSplitTunnelingNavigationClick = ::openSplitTunnelingFragment, + onToggleAutoConnect = vm::onToggleAutoConnect, + onToggleLocalNetworkSharing = vm::onToggleLocalNetworkSharing, onToggleDnsClick = vm::onToggleDnsClick, onToggleBlockAds = vm::onToggleBlockAds, onToggleBlockTrackers = vm::onToggleBlockTrackers, @@ -45,6 +47,7 @@ class AdvancedFragment : BaseFragment() { onSaveDnsClick = vm::onSaveDnsClick, onRemoveDnsClick = vm::onRemoveDnsClick, onCancelDnsDialogClick = vm::onCancelDialogClick, + onLocalNetworkSharingInfoClick = vm::onLocalNetworkSharingInfoClick, onContentsBlockersInfoClicked = vm::onContentsBlockerInfoClick, onCustomDnsInfoClicked = vm::onCustomDnsInfoClick, onMalwareInfoClicked = vm::onMalwareInfoClick, 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 8b1fa76d15..6990b7036e 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 @@ -46,6 +46,8 @@ class AdvancedSettingsViewModel( combine(repository.settingsUpdates, dialogState) { settings, dialogState -> AdvancedSettingsViewModelState( mtuValue = settings?.mtuString() ?: "", + isAutoConnectEnabled = settings?.autoConnect ?: false, + isLocalNetworkSharingEnabled = settings?.allowLan ?: false, isCustomDnsEnabled = settings?.isCustomDnsEnabled() ?: false, customDnsList = settings?.addresses()?.asStringAddressList() ?: listOf(), contentBlockersOptions = settings?.contentBlockersSettings() @@ -100,6 +102,10 @@ class AdvancedSettingsViewModel( hideDialog() } + fun onLocalNetworkSharingInfoClick() { + dialogState.update { AdvancedSettingsDialogState.LocalNetworkSharingInfoDialog } + } + fun onContentsBlockerInfoClick() { dialogState.update { AdvancedSettingsDialogState.ContentBlockersInfoDialog } } @@ -211,19 +217,11 @@ class AdvancedSettingsViewModel( } fun onToggleAutoConnect(isEnabled: Boolean) { - viewModelScope.launch(dispatcher) { - repository.setAutoConnect( - isEnabled - ) - } + viewModelScope.launch(dispatcher) { repository.setAutoConnect(isEnabled) } } fun onToggleLocalNetworkSharing(isEnabled: Boolean) { - viewModelScope.launch(dispatcher) { - repository.setLocalNetworkSharing( - isEnabled - ) - } + viewModelScope.launch(dispatcher) { repository.setLocalNetworkSharing(isEnabled) } } fun onToggleDnsClick(isEnabled: Boolean) { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AdvancedSettingsViewModelState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AdvancedSettingsViewModelState.kt index 3349e58b99..640f4f64ac 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AdvancedSettingsViewModelState.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AdvancedSettingsViewModelState.kt @@ -6,6 +6,8 @@ import net.mullvad.mullvadvpn.model.SelectedObfuscation data class AdvancedSettingsViewModelState( val mtuValue: String, + val isAutoConnectEnabled: Boolean, + val isLocalNetworkSharingEnabled: Boolean, val isCustomDnsEnabled: Boolean, val isAllowLanEnabled: Boolean, val customDnsList: List<CustomDnsItem>, @@ -18,6 +20,8 @@ data class AdvancedSettingsViewModelState( is AdvancedSettingsDialogState.MtuDialog -> AdvancedSettingsUiState.MtuDialogUiState( mtu = mtuValue, + isAutoConnectEnabled = isAutoConnectEnabled, + isLocalNetworkSharingEnabled = isLocalNetworkSharingEnabled, isCustomDnsEnabled = isCustomDnsEnabled, isAllowLanEnabled = isAllowLanEnabled, customDnsItems = customDnsList, @@ -28,6 +32,8 @@ data class AdvancedSettingsViewModelState( is AdvancedSettingsDialogState.DnsDialog -> AdvancedSettingsUiState.DnsDialogUiState( mtu = mtuValue, + isAutoConnectEnabled = isAutoConnectEnabled, + isLocalNetworkSharingEnabled = isLocalNetworkSharingEnabled, isCustomDnsEnabled = isCustomDnsEnabled, isAllowLanEnabled = isAllowLanEnabled, customDnsItems = customDnsList, @@ -35,9 +41,21 @@ data class AdvancedSettingsViewModelState( stagedDns = dialogState.stagedDns, selectedObfuscation = selectedObfuscation ) + is AdvancedSettingsDialogState.LocalNetworkSharingInfoDialog -> + AdvancedSettingsUiState.LocalNetworkSharingInfoDialogUiState( + mtu = mtuValue, + isAutoConnectEnabled = isAutoConnectEnabled, + isLocalNetworkSharingEnabled = isLocalNetworkSharingEnabled, + isCustomDnsEnabled = isCustomDnsEnabled, + isAllowLanEnabled = isAllowLanEnabled, + customDnsItems = customDnsList, + contentBlockersOptions = contentBlockersOptions + ) is AdvancedSettingsDialogState.ContentBlockersInfoDialog -> AdvancedSettingsUiState.ContentBlockersInfoDialogUiState( mtu = mtuValue, + isAutoConnectEnabled = isAutoConnectEnabled, + isLocalNetworkSharingEnabled = isLocalNetworkSharingEnabled, isCustomDnsEnabled = isCustomDnsEnabled, isAllowLanEnabled = isAllowLanEnabled, customDnsItems = customDnsList, @@ -47,6 +65,8 @@ data class AdvancedSettingsViewModelState( is AdvancedSettingsDialogState.CustomDnsInfoDialog -> AdvancedSettingsUiState.CustomDnsInfoDialogUiState( mtu = mtuValue, + isAutoConnectEnabled = isAutoConnectEnabled, + isLocalNetworkSharingEnabled = isLocalNetworkSharingEnabled, isCustomDnsEnabled = isCustomDnsEnabled, isAllowLanEnabled = isAllowLanEnabled, customDnsItems = customDnsList, @@ -55,6 +75,8 @@ data class AdvancedSettingsViewModelState( is AdvancedSettingsDialogState.MalwareInfoDialog -> AdvancedSettingsUiState.MalwareInfoDialogUiState( mtu = mtuValue, + isAutoConnectEnabled = isAutoConnectEnabled, + isLocalNetworkSharingEnabled = isLocalNetworkSharingEnabled, isCustomDnsEnabled = isCustomDnsEnabled, isAllowLanEnabled = isAllowLanEnabled, customDnsItems = customDnsList, @@ -73,6 +95,8 @@ data class AdvancedSettingsViewModelState( else -> AdvancedSettingsUiState.DefaultUiState( mtu = mtuValue, + isAutoConnectEnabled = isAutoConnectEnabled, + isLocalNetworkSharingEnabled = isLocalNetworkSharingEnabled, isCustomDnsEnabled = isCustomDnsEnabled, isAllowLanEnabled = isAllowLanEnabled, customDnsItems = customDnsList, @@ -88,6 +112,8 @@ data class AdvancedSettingsViewModelState( fun default() = AdvancedSettingsViewModelState( mtuValue = EMPTY_STRING, + isAutoConnectEnabled = false, + isLocalNetworkSharingEnabled = false, isCustomDnsEnabled = false, customDnsList = listOf(), contentBlockersOptions = DefaultDnsOptions(), @@ -105,6 +131,8 @@ sealed class AdvancedSettingsDialogState { data class DnsDialog(val stagedDns: StagedDns) : AdvancedSettingsDialogState() + object LocalNetworkSharingInfoDialog : AdvancedSettingsDialogState() + object ContentBlockersInfoDialog : AdvancedSettingsDialogState() object CustomDnsInfoDialog : AdvancedSettingsDialogState() |
