summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt9
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt124
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt9
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/VpnSettingsFragment.kt1
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt15
5 files changed, 68 insertions, 90 deletions
diff --git a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt
index dc190c6bdf..a9af28e08a 100644
--- a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt
+++ b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt
@@ -13,7 +13,6 @@ import androidx.compose.ui.test.performTextInput
import io.mockk.MockKAnnotations
import io.mockk.mockk
import io.mockk.verify
-import io.mockk.verifyAll
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import net.mullvad.mullvadvpn.compose.state.VpnSettingsUiState
@@ -134,11 +133,9 @@ class VpnSettingsScreenTest {
@Test
fun testMtuDialogTextInput() {
// Arrange
- val mockedInputHandler: (String) -> Unit = mockk(relaxed = true)
composeTestRule.setContent {
VpnSettingsScreen(
uiState = VpnSettingsUiState.MtuDialogUiState(mtuEditValue = EMPTY_STRING),
- onMtuInputChange = mockedInputHandler,
toastMessagesSharedFlow = MutableSharedFlow<String>().asSharedFlow()
)
}
@@ -147,13 +144,13 @@ class VpnSettingsScreenTest {
composeTestRule.onNodeWithText(EMPTY_STRING).performTextInput(VALID_DUMMY_MTU_VALUE)
// Assert
- verifyAll { mockedInputHandler.invoke(VALID_DUMMY_MTU_VALUE) }
+ composeTestRule.onNodeWithText(VALID_DUMMY_MTU_VALUE).assertExists()
}
@Test
fun testMtuDialogSubmitOfValidValue() {
// Arrange
- val mockedSubmitHandler: () -> Unit = mockk(relaxed = true)
+ val mockedSubmitHandler: (Int) -> Unit = mockk(relaxed = true)
composeTestRule.setContent {
VpnSettingsScreen(
uiState = VpnSettingsUiState.MtuDialogUiState(mtuEditValue = VALID_DUMMY_MTU_VALUE),
@@ -166,7 +163,7 @@ class VpnSettingsScreenTest {
composeTestRule.onNodeWithText("Submit").assertIsEnabled().performClick()
// Assert
- verify { mockedSubmitHandler.invoke() }
+ verify { mockedSubmitHandler.invoke(VALID_DUMMY_MTU_VALUE.toInt()) }
}
@Test
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt
index b6cfa73fdb..3bf23a49c6 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt
@@ -9,54 +9,45 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import net.mullvad.mullvadvpn.R
+import net.mullvad.mullvadvpn.compose.button.ActionButton
import net.mullvad.mullvadvpn.compose.textfield.MtuTextField
import net.mullvad.mullvadvpn.constant.MTU_MAX_VALUE
import net.mullvad.mullvadvpn.constant.MTU_MIN_VALUE
-import net.mullvad.mullvadvpn.lib.theme.MullvadBlue
-import net.mullvad.mullvadvpn.lib.theme.MullvadDarkBlue
-import net.mullvad.mullvadvpn.lib.theme.MullvadWhite
-import net.mullvad.mullvadvpn.lib.theme.MullvadWhite20
-import net.mullvad.mullvadvpn.lib.theme.MullvadWhite60
+import net.mullvad.mullvadvpn.lib.theme.AlphaDescription
+import net.mullvad.mullvadvpn.lib.theme.AlphaDisabled
+import net.mullvad.mullvadvpn.lib.theme.AlphaInactive
+import net.mullvad.mullvadvpn.lib.theme.Dimens
import net.mullvad.mullvadvpn.util.isValidMtu
-@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun MtuDialog(
- mtuValue: String,
- onMtuValueChanged: (String) -> Unit,
- onSave: () -> Unit,
+ mtuInitial: Int?,
+ onSave: (Int) -> Unit,
onRestoreDefaultValue: () -> Unit,
onDismiss: () -> Unit,
) {
- val buttonSize = dimensionResource(id = R.dimen.button_height)
- val mediumPadding = dimensionResource(id = R.dimen.medium_padding)
val dialogPadding = 20.dp
val midPadding = 10.dp
val smallPadding = 5.dp
- val textSmallSize = dimensionResource(id = R.dimen.text_small).value.sp
- val textMediumSize = dimensionResource(id = R.dimen.text_medium_plus).value.sp
- val textBigSize = dimensionResource(id = R.dimen.text_big).value.sp
+ val mtu = remember { mutableStateOf(mtuInitial?.toString() ?: "") }
val textFieldFocusRequester = FocusRequester()
- val isValidMtu = mtuValue.toIntOrNull()?.isValidMtu() == true
+ val isValidMtu = mtu.value.toIntOrNull()?.isValidMtu() == true
Dialog(
// Fix for https://issuetracker.google.com/issues/221643630
@@ -67,25 +58,26 @@ fun MtuDialog(
Modifier
// Related to the fix for https://issuetracker.google.com/issues/221643630
.fillMaxWidth(0.8f)
- .background(color = MullvadDarkBlue)
+ .background(color = MaterialTheme.colorScheme.background)
.padding(dialogPadding)
) {
Text(
text = stringResource(id = R.string.wireguard_mtu),
- color = Color.White,
- fontSize = textBigSize
+ color = MaterialTheme.colorScheme.onBackground,
+ style = MaterialTheme.typography.headlineSmall
)
Box(
Modifier.wrapContentSize().clickable { textFieldFocusRequester.requestFocus() }
) {
MtuTextField(
- value = mtuValue,
- onValueChanged = { newMtuValue -> onMtuValueChanged(newMtuValue) },
+ value = mtu.value,
+ onValueChanged = { newMtuValue -> mtu.value = newMtuValue },
onFocusChange = {},
onSubmit = { newMtuValue ->
- if (newMtuValue.toIntOrNull()?.isValidMtu() == true) {
- onSave()
+ val mtuInt = newMtuValue.toIntOrNull()
+ if (mtuInt?.isValidMtu() == true) {
+ onSave(mtuInt)
}
},
isEnabled = true,
@@ -105,64 +97,64 @@ fun MtuDialog(
MTU_MIN_VALUE,
MTU_MAX_VALUE
),
- fontSize = textSmallSize,
- color = MullvadWhite60,
+ style = MaterialTheme.typography.bodySmall,
+ color = MaterialTheme.colorScheme.onBackground.copy(alpha = AlphaDescription),
modifier = Modifier.padding(top = smallPadding)
)
- Button(
+ ActionButton(
modifier =
- Modifier.padding(top = mediumPadding).height(buttonSize).fillMaxWidth(),
+ Modifier.padding(top = Dimens.mediumPadding)
+ .height(Dimens.buttonHeight)
+ .fillMaxWidth(),
colors =
ButtonDefaults.buttonColors(
- containerColor = MullvadBlue,
- contentColor = MullvadWhite,
- disabledContentColor = MullvadWhite60,
- disabledContainerColor = MullvadWhite20
+ containerColor = MaterialTheme.colorScheme.primary,
+ contentColor = MaterialTheme.colorScheme.onPrimary,
+ disabledContentColor =
+ MaterialTheme.colorScheme.onPrimary.copy(alpha = AlphaInactive),
+ disabledContainerColor =
+ MaterialTheme.colorScheme.onPrimary.copy(alpha = AlphaDisabled)
),
- enabled = isValidMtu,
- onClick = { onSave() },
- shape = MaterialTheme.shapes.small
- ) {
- Text(text = stringResource(R.string.submit_button), fontSize = textMediumSize)
- }
+ isEnabled = isValidMtu,
+ text = stringResource(R.string.submit_button),
+ onClick = {
+ val mtuInt = mtu.value.toIntOrNull()
+ if (mtuInt?.isValidMtu() == true) {
+ onSave(mtuInt)
+ }
+ }
+ )
- Button(
+ ActionButton(
modifier =
- Modifier.padding(top = mediumPadding)
- .height(buttonSize)
- .defaultMinSize(minHeight = buttonSize)
+ Modifier.padding(top = Dimens.mediumPadding)
+ .height(Dimens.buttonHeight)
+ .defaultMinSize(minHeight = Dimens.buttonHeight)
.fillMaxWidth(),
colors =
ButtonDefaults.buttonColors(
- containerColor = MullvadBlue,
- contentColor = MullvadWhite
+ containerColor = MaterialTheme.colorScheme.primary,
+ contentColor = MaterialTheme.colorScheme.onPrimary,
),
- onClick = { onRestoreDefaultValue() },
- shape = MaterialTheme.shapes.small
- ) {
- Text(
- text = stringResource(R.string.reset_to_default_button),
- fontSize = textMediumSize
- )
- }
+ text = stringResource(R.string.reset_to_default_button),
+ onClick = onRestoreDefaultValue
+ )
- Button(
+ ActionButton(
modifier =
- Modifier.padding(top = mediumPadding)
- .height(buttonSize)
- .defaultMinSize(minHeight = buttonSize)
+ Modifier.padding(top = Dimens.mediumPadding)
+ .height(Dimens.buttonHeight)
+ .defaultMinSize(minHeight = Dimens.buttonHeight)
.fillMaxWidth(),
colors =
ButtonDefaults.buttonColors(
- containerColor = MullvadBlue,
- contentColor = Color.White
+ containerColor = MaterialTheme.colorScheme.primary,
+ contentColor = MaterialTheme.colorScheme.onPrimary,
),
- onClick = { onDismiss() },
- shape = MaterialTheme.shapes.small
- ) {
- Text(text = stringResource(R.string.cancel), fontSize = textMediumSize)
- }
+ text = stringResource(R.string.cancel),
+ onClick = onDismiss
+ )
}
}
)
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt
index a458c3164a..3ff4719b59 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt
@@ -102,7 +102,6 @@ private fun PreviewVpnSettings() {
customDnsItems = listOf(CustomDnsItem("0.0.0.0", false)),
),
onMtuCellClick = {},
- onMtuInputChange = {},
onSaveMtuClick = {},
onRestoreMtuClick = {},
onCancelMtuDialogClick = {},
@@ -146,8 +145,7 @@ fun VpnSettingsScreen(
lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
uiState: VpnSettingsUiState,
onMtuCellClick: () -> Unit = {},
- onMtuInputChange: (String) -> Unit = {},
- onSaveMtuClick: () -> Unit = {},
+ onSaveMtuClick: (Int) -> Unit = {},
onRestoreMtuClick: () -> Unit = {},
onCancelMtuDialogClick: () -> Unit = {},
onToggleAutoConnect: (Boolean) -> Unit = {},
@@ -186,9 +184,8 @@ fun VpnSettingsScreen(
when (uiState) {
is VpnSettingsUiState.MtuDialogUiState -> {
MtuDialog(
- mtuValue = uiState.mtuEditValue,
- onMtuValueChanged = { onMtuInputChange(it) },
- onSave = { onSaveMtuClick() },
+ mtuInitial = uiState.mtuEditValue.toIntOrNull(),
+ onSave = { onSaveMtuClick(it) },
onRestoreDefaultValue = { onRestoreMtuClick() },
onDismiss = { onCancelMtuDialogClick() }
)
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/VpnSettingsFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/VpnSettingsFragment.kt
index d30608728b..bf799d887a 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/VpnSettingsFragment.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/VpnSettingsFragment.kt
@@ -27,7 +27,6 @@ class VpnSettingsFragment : BaseFragment() {
VpnSettingsScreen(
uiState = state,
onMtuCellClick = vm::onMtuCellClick,
- onMtuInputChange = vm::onMtuInputChange,
onSaveMtuClick = vm::onSaveMtuClick,
onRestoreMtuClick = vm::onRestoreMtuClick,
onCancelMtuDialogClick = vm::onCancelDialogClick,
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt
index 7ebb448207..5bd56f150d 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt
@@ -109,18 +109,11 @@ class VpnSettingsViewModel(
dialogState.update { VpnSettingsDialogState.MtuDialog(vmState.value.mtuValue) }
}
- fun onMtuInputChange(value: String) {
- dialogState.update { VpnSettingsDialogState.MtuDialog(value) }
- }
-
- fun onSaveMtuClick() =
+ fun onSaveMtuClick(mtuValue: Int) =
viewModelScope.launch(dispatcher) {
- val dialog = dialogState.value as? VpnSettingsDialogState.MtuDialog
- dialog
- ?.mtuEditValue
- ?.toIntOrNull()
- ?.takeIf { it.isValidMtu() }
- ?.let { mtu -> repository.setWireguardMtu(mtu) }
+ if (mtuValue.isValidMtu()) {
+ repository.setWireguardMtu(mtuValue)
+ }
hideDialog()
}