diff options
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() } |
