diff options
Diffstat (limited to 'android')
26 files changed, 290 insertions, 393 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/HtmlText.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/HtmlText.kt deleted file mode 100644 index 1aa374598e..0000000000 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/HtmlText.kt +++ /dev/null @@ -1,31 +0,0 @@ -package net.mullvad.mullvadvpn.compose.component - -import android.util.TypedValue -import android.widget.TextView -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.viewinterop.AndroidView -import androidx.core.text.HtmlCompat - -@Composable -fun HtmlText( - htmlFormattedString: String, - textSize: Float, - modifier: Modifier = Modifier, - textColor: Int = Color.White.toArgb(), -) { - AndroidView( - modifier = modifier, - factory = { context -> - TextView(context).apply { - setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize) - setTextColor(textColor) - } - }, - update = { - it.text = HtmlCompat.fromHtml(htmlFormattedString, HtmlCompat.FROM_HTML_MODE_COMPACT) - }, - ) -} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt index 0334b0b14d..a7656573b1 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt @@ -1,8 +1,5 @@ package net.mullvad.mullvadvpn.compose.dialog -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf @@ -22,7 +19,6 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.communication.CustomListActionResultData import net.mullvad.mullvadvpn.compose.state.CreateCustomListUiState import net.mullvad.mullvadvpn.compose.test.CREATE_CUSTOM_LIST_DIALOG_INPUT_TEST_TAG @@ -101,13 +97,14 @@ fun CreateCustomListDialog( onInputChanged: () -> Unit = {}, onDismiss: () -> Unit = {}, ) { - val name = remember { mutableStateOf("") } val isValidName by remember { derivedStateOf { name.value.isNotBlank() } } - AlertDialog( - title = { Text(text = stringResource(id = R.string.create_new_list)) }, - text = { + InputDialog( + title = stringResource(id = R.string.create_new_list), + confirmButtonText = stringResource(id = R.string.create), + confirmButtonEnabled = isValidName, + input = { CustomListNameTextField( name = name.value, isValidName = isValidName, @@ -120,19 +117,8 @@ fun CreateCustomListDialog( modifier = Modifier.testTag(CREATE_CUSTOM_LIST_DIALOG_INPUT_TEST_TAG), ) }, - containerColor = MaterialTheme.colorScheme.surface, - titleContentColor = MaterialTheme.colorScheme.onSurface, - onDismissRequest = onDismiss, - confirmButton = { - PrimaryButton( - text = stringResource(id = R.string.create), - onClick = { createCustomList(name.value) }, - isEnabled = isValidName, - ) - }, - dismissButton = { - PrimaryButton(text = stringResource(id = R.string.cancel), onClick = onDismiss) - }, + onBack = onDismiss, + onConfirm = { createCustomList(name.value) }, ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt index d829e4650e..4b0d4573eb 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt @@ -54,8 +54,8 @@ fun DeleteApiAccessMethodConfirmationDialog( onDelete: () -> Unit = {}, onBack: () -> Unit = {}, ) { - DeleteConfirmationDialog( - onDelete = onDelete, + NegativeConfirmationDialog( + onConfirm = onDelete, onBack = onBack, message = stringResource(id = R.string.delete_method_question), errorMessage = diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt index e8f146f37e..3153aeb37c 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt @@ -62,8 +62,8 @@ fun DeleteCustomListConfirmationDialog( onDelete: () -> Unit = {}, onBack: () -> Unit = {}, ) { - DeleteConfirmationDialog( - onDelete = onDelete, + NegativeConfirmationDialog( + onConfirm = onDelete, onBack = onBack, message = stringResource( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt index 7561747e53..dd08a71c3a 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt @@ -1,12 +1,7 @@ package net.mullvad.mullvadvpn.compose.dialog -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier @@ -19,13 +14,10 @@ import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.button.NegativeButton -import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.communication.DnsDialogResult import net.mullvad.mullvadvpn.compose.textfield.DnsTextField import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle import net.mullvad.mullvadvpn.lib.theme.AppTheme -import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.viewmodel.DnsDialogSideEffect import net.mullvad.mullvadvpn.viewmodel.DnsDialogViewModel import net.mullvad.mullvadvpn.viewmodel.DnsDialogViewState @@ -85,79 +77,41 @@ fun DnsDialog( onRemoveDnsClick: (Int) -> Unit, onDismiss: () -> Unit, ) { - AlertDialog( - title = { - Text( - text = - if (state.isNewEntry) { - stringResource(R.string.add_dns_server_dialog_title) - } else { - stringResource(R.string.update_dns_server_dialog_title) - }, - color = MaterialTheme.colorScheme.onSurface, + InputDialog( + title = + if (state.isNewEntry) { + stringResource(R.string.add_dns_server_dialog_title) + } else { + stringResource(R.string.update_dns_server_dialog_title) + }, + input = { + DnsTextField( + value = state.input, + isValidValue = state.isValid(), + onValueChanged = { newDnsValue -> onDnsInputChange(newDnsValue) }, + onSubmit = onSaveDnsClick, + isEnabled = true, + placeholderText = stringResource(R.string.custom_dns_hint), + modifier = Modifier.fillMaxWidth(), ) }, - text = { - Column { - DnsTextField( - value = state.input, - isValidValue = state.isValid(), - onValueChanged = { newDnsValue -> onDnsInputChange(newDnsValue) }, - onSubmit = onSaveDnsClick, - isEnabled = true, - placeholderText = stringResource(R.string.custom_dns_hint), - modifier = Modifier.fillMaxWidth(), - ) - - val errorMessage = - when { - state.validationError is ValidationError.DuplicateAddress -> { - stringResource(R.string.duplicate_address_warning) - } - state.isLocal && !state.isAllowLanEnabled -> { - stringResource(id = R.string.confirm_local_dns) - } - else -> { - null - } - } - - if (errorMessage != null) { - Text( - text = errorMessage, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.error, - modifier = Modifier.padding(top = Dimens.smallPadding), - ) + message = + when { + state.validationError is ValidationError.DuplicateAddress -> { + stringResource(R.string.duplicate_address_warning) } - } - }, - confirmButton = { - Column(verticalArrangement = Arrangement.spacedBy(Dimens.buttonSpacing)) { - PrimaryButton( - modifier = Modifier.fillMaxWidth(), - onClick = onSaveDnsClick, - isEnabled = state.isValid(), - text = stringResource(id = R.string.submit_button), - ) - - if (state.index != null) { - NegativeButton( - modifier = Modifier.fillMaxWidth(), - onClick = { onRemoveDnsClick(state.index) }, - text = stringResource(id = R.string.remove_button), - ) + state.isLocal && !state.isAllowLanEnabled -> { + stringResource(id = R.string.confirm_local_dns) } - - PrimaryButton( - modifier = Modifier.fillMaxWidth(), - onClick = onDismiss, - text = stringResource(id = R.string.cancel), - ) - } - }, - onDismissRequest = onDismiss, - containerColor = MaterialTheme.colorScheme.surface, - titleContentColor = MaterialTheme.colorScheme.onSurface, + else -> { + null + } + }, + onResetButtonText = stringResource(id = R.string.remove_button), + confirmButtonEnabled = state.isValid(), + messageTextColor = MaterialTheme.colorScheme.error, + onReset = state.index?.let { { onRemoveDnsClick(state.index) } }, + onBack = onDismiss, + onConfirm = onSaveDnsClick, ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt index dcece689f4..57205175e5 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt @@ -1,8 +1,5 @@ package net.mullvad.mullvadvpn.compose.dialog -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier @@ -16,7 +13,6 @@ import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.communication.CustomListActionResultData import net.mullvad.mullvadvpn.compose.state.EditCustomListNameUiState import net.mullvad.mullvadvpn.compose.test.EDIT_CUSTOM_LIST_DIALOG_INPUT_TEST_TAG @@ -77,9 +73,11 @@ fun EditCustomListNameDialog( onInputChanged: (String) -> Unit = {}, onDismiss: () -> Unit = {}, ) { - AlertDialog( - title = { Text(text = stringResource(id = R.string.update_list_name)) }, - text = { + InputDialog( + title = stringResource(id = R.string.update_list_name), + confirmButtonText = stringResource(id = R.string.save), + confirmButtonEnabled = state.isValidName, + input = { CustomListNameTextField( name = state.name, isValidName = state.isValidName, @@ -89,19 +87,8 @@ fun EditCustomListNameDialog( modifier = Modifier.testTag(EDIT_CUSTOM_LIST_DIALOG_INPUT_TEST_TAG), ) }, - containerColor = MaterialTheme.colorScheme.surface, - titleContentColor = MaterialTheme.colorScheme.onSurface, - onDismissRequest = onDismiss, - confirmButton = { - PrimaryButton( - text = stringResource(id = R.string.save), - onClick = { updateName(state.name) }, - isEnabled = state.isValidName, - ) - }, - dismissButton = { - PrimaryButton(text = stringResource(id = R.string.cancel), onClick = onDismiss) - }, + onBack = onDismiss, + onConfirm = { updateName(state.name) }, ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/InputDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/InputDialog.kt new file mode 100644 index 0000000000..8919ad69db --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/InputDialog.kt @@ -0,0 +1,106 @@ +package net.mullvad.mullvadvpn.compose.dialog + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.tooling.preview.Preview +import net.mullvad.mullvadvpn.R +import net.mullvad.mullvadvpn.compose.button.NegativeButton +import net.mullvad.mullvadvpn.compose.button.PrimaryButton +import net.mullvad.mullvadvpn.compose.textfield.CustomTextField +import net.mullvad.mullvadvpn.lib.theme.AppTheme +import net.mullvad.mullvadvpn.lib.theme.Dimens + +@Preview +@Composable +private fun PreviewInputDialog() { + AppTheme { + InputDialog( + title = "Input here", + message = "Lorem ipsum", + input = { + CustomTextField( + value = "input", + keyboardType = KeyboardType.Text, + onValueChanged = {}, + onSubmit = {}, + placeholderText = "Placeholder", + isValidValue = true, + isDigitsOnlyAllowed = false, + ) + }, + onReset = {}, + onBack = {}, + onConfirm = {}, + ) + } +} + +@Composable +fun InputDialog( + title: String, + message: String? = null, + input: @Composable ColumnScope.() -> Unit, + confirmButtonEnabled: Boolean = true, + confirmButtonText: String = stringResource(R.string.submit_button), + onResetButtonText: String = stringResource(R.string.reset_to_default_button), + messageTextColor: Color = MaterialTheme.colorScheme.onSurfaceVariant, + onBack: () -> Unit, + onConfirm: () -> Unit, + onReset: (() -> Unit)? = null, +) { + AlertDialog( + onDismissRequest = onBack, + title = { Text(text = title, color = MaterialTheme.colorScheme.onSurface) }, + text = { + Column { + input() + + message?.let { + Text( + text = message, + style = MaterialTheme.typography.bodySmall, + color = messageTextColor, + modifier = Modifier.padding(top = Dimens.smallPadding), + ) + } + } + }, + confirmButton = { + Column(verticalArrangement = Arrangement.spacedBy(Dimens.buttonSpacing)) { + PrimaryButton( + modifier = Modifier.fillMaxWidth(), + isEnabled = confirmButtonEnabled, + text = confirmButtonText, + onClick = onConfirm, + ) + + if (onReset != null) { + NegativeButton( + modifier = Modifier.fillMaxWidth(), + text = onResetButtonText, + onClick = onReset, + ) + } + + PrimaryButton( + modifier = Modifier.fillMaxWidth(), + text = stringResource(R.string.cancel), + onClick = onBack, + ) + } + }, + containerColor = MaterialTheme.colorScheme.surface, + titleContentColor = MaterialTheme.colorScheme.onSurface, + ) +} 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 bbf05d550d..97427fe9da 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 @@ -1,12 +1,6 @@ package net.mullvad.mullvadvpn.compose.dialog -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier @@ -16,19 +10,15 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.dropUnlessResumed import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph -import com.ramcosta.composedestinations.result.EmptyResultBackNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.button.NegativeButton -import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.textfield.MtuTextField import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle import net.mullvad.mullvadvpn.constant.MTU_MAX_VALUE import net.mullvad.mullvadvpn.constant.MTU_MIN_VALUE import net.mullvad.mullvadvpn.lib.model.Mtu import net.mullvad.mullvadvpn.lib.theme.AppTheme -import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.viewmodel.MtuDialogSideEffect import net.mullvad.mullvadvpn.viewmodel.MtuDialogUiState import net.mullvad.mullvadvpn.viewmodel.MtuDialogViewModel @@ -37,7 +27,16 @@ import org.koin.androidx.compose.koinViewModel @Preview @Composable private fun PreviewMtuDialog() { - AppTheme { Mtu(EmptyResultBackNavigator()) } + AppTheme { + MtuDialog( + state = + MtuDialogUiState(mtuInput = "1300", isValidInput = true, showResetToDefault = true), + onInputChanged = {}, + onSaveMtu = {}, + onResetMtu = {}, + onDismiss = {}, + ) + } } data class MtuNavArgs(val initialMtu: Mtu? = null) @@ -71,65 +70,29 @@ fun MtuDialog( onResetMtu: () -> Unit, onDismiss: () -> Unit, ) { - AlertDialog( - onDismissRequest = onDismiss, - title = { - Text( - text = stringResource(id = R.string.wireguard_mtu), - color = MaterialTheme.colorScheme.onSurface, + InputDialog( + title = stringResource(id = R.string.wireguard_mtu), + message = stringResource(id = R.string.wireguard_mtu_footer, MTU_MIN_VALUE, MTU_MAX_VALUE), + input = { + MtuTextField( + value = state.mtuInput, + onValueChanged = onInputChanged, + onSubmit = onSaveMtu, + isEnabled = true, + placeholderText = stringResource(R.string.enter_value_placeholder), + maxCharLength = 4, + isValidValue = state.isValidInput, + modifier = Modifier.fillMaxWidth(), ) }, - text = { - Column { - MtuTextField( - value = state.mtuInput, - onValueChanged = onInputChanged, - onSubmit = onSaveMtu, - isEnabled = true, - placeholderText = stringResource(R.string.enter_value_placeholder), - maxCharLength = 4, - isValidValue = state.isValidInput, - modifier = Modifier.fillMaxWidth(), - ) - - Text( - text = - stringResource( - id = R.string.wireguard_mtu_footer, - MTU_MIN_VALUE, - MTU_MAX_VALUE, - ), - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = Dimens.smallPadding), - ) - } - }, - confirmButton = { - Column(verticalArrangement = Arrangement.spacedBy(Dimens.buttonSpacing)) { - PrimaryButton( - modifier = Modifier.fillMaxWidth(), - isEnabled = state.isValidInput, - text = stringResource(R.string.submit_button), - onClick = { onSaveMtu(state.mtuInput) }, - ) - - if (state.showResetToDefault) { - NegativeButton( - modifier = Modifier.fillMaxWidth(), - text = stringResource(R.string.reset_to_default_button), - onClick = onResetMtu, - ) - } - - PrimaryButton( - modifier = Modifier.fillMaxWidth(), - text = stringResource(R.string.cancel), - onClick = onDismiss, - ) - } - }, - containerColor = MaterialTheme.colorScheme.surface, - titleContentColor = MaterialTheme.colorScheme.onSurface, + confirmButtonEnabled = state.isValidInput, + onReset = + if (state.showResetToDefault) { + onResetMtu + } else { + null + }, + onBack = onDismiss, + onConfirm = { onSaveMtu(state.mtuInput) }, ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteConfirmationDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/NegativeConfirmationDialog.kt index e2cb6c1072..bad856d8c7 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteConfirmationDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/NegativeConfirmationDialog.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.AlertDialog import androidx.compose.material3.Icon +import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -15,6 +16,8 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.tooling.preview.Preview import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.NegativeButton @@ -26,7 +29,7 @@ import net.mullvad.mullvadvpn.lib.theme.Dimens @Composable private fun PreviewDeleteConfirmationDialog() { AppTheme { - DeleteConfirmationDialog(message = "Do you want to delete Cookie?", errorMessage = null) + NegativeConfirmationDialog(message = "Do you want to delete Cookie?", errorMessage = null) } } @@ -34,7 +37,7 @@ private fun PreviewDeleteConfirmationDialog() { @Composable private fun PreviewDeleteConfirmationDialogError() { AppTheme { - DeleteConfirmationDialog( + NegativeConfirmationDialog( message = "Do you want to delete Cookie?", errorMessage = "An error occured", ) @@ -42,10 +45,34 @@ private fun PreviewDeleteConfirmationDialogError() { } @Composable -fun DeleteConfirmationDialog( +fun NegativeConfirmationDialog( message: String, - errorMessage: String?, - onDelete: () -> Unit = {}, + messageStyle: TextStyle? = null, + errorMessage: String? = null, + confirmationText: String = stringResource(id = R.string.delete), + cancelText: String = stringResource(id = R.string.cancel), + onConfirm: () -> Unit = {}, + onBack: () -> Unit = {}, +) { + NegativeConfirmationDialog( + message = AnnotatedString(message), + messageStyle = messageStyle, + errorMessage = errorMessage, + confirmationText = confirmationText, + cancelText = cancelText, + onConfirm = onConfirm, + onBack = onBack, + ) +} + +@Composable +fun NegativeConfirmationDialog( + message: AnnotatedString, + messageStyle: TextStyle? = null, + errorMessage: String? = null, + confirmationText: String = stringResource(id = R.string.delete), + cancelText: String = stringResource(id = R.string.cancel), + onConfirm: () -> Unit = {}, onBack: () -> Unit = {}, ) { AlertDialog( @@ -60,7 +87,7 @@ fun DeleteConfirmationDialog( }, title = { Column(horizontalAlignment = Alignment.CenterHorizontally) { - Text(text = message) + Text(text = message, style = messageStyle ?: LocalTextStyle.current) if (errorMessage != null) { Text( text = errorMessage, @@ -75,12 +102,10 @@ fun DeleteConfirmationDialog( PrimaryButton( modifier = Modifier.focusRequester(FocusRequester()), onClick = onBack, - text = stringResource(id = R.string.cancel), + text = cancelText, ) }, - confirmButton = { - NegativeButton(onClick = onDelete, text = stringResource(id = R.string.delete)) - }, + confirmButton = { NegativeButton(onClick = onConfirm, text = confirmationText) }, containerColor = MaterialTheme.colorScheme.surface, ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt index f2f0bcd567..d31325f140 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt @@ -1,19 +1,12 @@ package net.mullvad.mullvadvpn.compose.dialog -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.FocusRequester -import androidx.compose.ui.focus.focusRequester -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.unit.sp +import androidx.core.text.HtmlCompat import androidx.lifecycle.compose.dropUnlessResumed import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph @@ -21,15 +14,12 @@ import com.ramcosta.composedestinations.result.EmptyResultBackNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.button.NegativeButton -import net.mullvad.mullvadvpn.compose.button.PrimaryButton -import net.mullvad.mullvadvpn.compose.component.HtmlText import net.mullvad.mullvadvpn.compose.component.textResource +import net.mullvad.mullvadvpn.compose.extensions.toAnnotatedString import net.mullvad.mullvadvpn.compose.preview.DevicePreviewParameterProvider import net.mullvad.mullvadvpn.lib.model.Device import net.mullvad.mullvadvpn.lib.model.DeviceId import net.mullvad.mullvadvpn.lib.theme.AppTheme -import net.mullvad.mullvadvpn.lib.theme.Dimens @Preview @Composable @@ -42,38 +32,17 @@ private fun PreviewRemoveDeviceConfirmationDialog( @Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun RemoveDeviceConfirmation(navigator: ResultBackNavigator<DeviceId>, device: Device) { - AlertDialog( - onDismissRequest = dropUnlessResumed { navigator.navigateBack() }, - icon = { - Icon( - modifier = Modifier.fillMaxWidth().height(Dimens.dialogIconHeight), - painter = painterResource(id = R.drawable.icon_alert), - contentDescription = stringResource(id = R.string.remove_button), - tint = MaterialTheme.colorScheme.error, - ) - }, - text = { - val htmlFormattedDialogText = - textResource( - id = R.string.max_devices_confirm_removal_description, - device.displayName(), - ) - - HtmlText(htmlFormattedString = htmlFormattedDialogText, textSize = 16.sp.value) - }, - dismissButton = { - PrimaryButton( - modifier = Modifier.focusRequester(FocusRequester()), - onClick = dropUnlessResumed { navigator.navigateBack() }, - text = stringResource(id = R.string.back), - ) - }, - confirmButton = { - NegativeButton( - onClick = dropUnlessResumed { navigator.navigateBack(result = device.id) }, - text = stringResource(id = R.string.confirm_removal), - ) - }, - containerColor = MaterialTheme.colorScheme.surface, + val htmlFormattedString = + textResource(id = R.string.max_devices_confirm_removal_description, device.displayName()) + val message = + HtmlCompat.fromHtml(htmlFormattedString, HtmlCompat.FROM_HTML_MODE_COMPACT) + .toAnnotatedString(boldFontWeight = FontWeight.Bold) + NegativeConfirmationDialog( + message = message, + messageStyle = MaterialTheme.typography.labelLarge, + confirmationText = stringResource(id = R.string.confirm_removal), + cancelText = stringResource(id = R.string.back), + onBack = dropUnlessResumed { navigator.navigateBack() }, + onConfirm = dropUnlessResumed { navigator.navigateBack(result = device.id) }, ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt index 1e212bea97..2c01c3f436 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt @@ -1,14 +1,7 @@ package net.mullvad.mullvadvpn.compose.dialog -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.size -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.compose.dropUnlessResumed @@ -18,10 +11,7 @@ import com.ramcosta.composedestinations.result.EmptyResultBackNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.button.NegativeButton -import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.lib.theme.AppTheme -import net.mullvad.mullvadvpn.lib.theme.Dimens @Preview @Composable @@ -32,38 +22,12 @@ private fun PreviewReportProblemNoEmailDialog() { @Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun ReportProblemNoEmail(resultBackNavigator: ResultBackNavigator<Boolean>) { - AlertDialog( - onDismissRequest = dropUnlessResumed { resultBackNavigator.navigateBack() }, - icon = { - Icon( - painter = painterResource(id = R.drawable.icon_alert), - contentDescription = null, - modifier = Modifier.size(Dimens.dialogIconHeight), - tint = MaterialTheme.colorScheme.error, - ) - }, - text = { - Text( - text = stringResource(id = R.string.confirm_no_email), - modifier = Modifier.fillMaxWidth(), - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurface, - ) - }, - dismissButton = { - PrimaryButton( - modifier = Modifier.fillMaxWidth(), - onClick = dropUnlessResumed { resultBackNavigator.navigateBack() }, - text = stringResource(id = R.string.back), - ) - }, - confirmButton = { - NegativeButton( - modifier = Modifier.fillMaxWidth(), - onClick = dropUnlessResumed { resultBackNavigator.navigateBack(result = true) }, - text = stringResource(id = R.string.send_anyway), - ) - }, - containerColor = MaterialTheme.colorScheme.surface, + NegativeConfirmationDialog( + message = stringResource(id = R.string.confirm_no_email), + confirmationText = stringResource(id = R.string.send_anyway), + cancelText = stringResource(id = R.string.back), + messageStyle = MaterialTheme.typography.bodySmall, + onBack = dropUnlessResumed { resultBackNavigator.navigateBack() }, + onConfirm = dropUnlessResumed { resultBackNavigator.navigateBack(result = true) }, ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt index 6f775358d9..63f17c780b 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt @@ -1,14 +1,7 @@ package net.mullvad.mullvadvpn.compose.dialog import android.os.Parcelable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -23,14 +16,11 @@ import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import kotlinx.parcelize.Parcelize import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.button.NegativeButton -import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.test.CUSTOM_PORT_DIALOG_INPUT_TEST_TAG import net.mullvad.mullvadvpn.compose.textfield.CustomPortTextField import net.mullvad.mullvadvpn.lib.model.Port import net.mullvad.mullvadvpn.lib.model.PortRange import net.mullvad.mullvadvpn.lib.theme.AppTheme -import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.util.asString import net.mullvad.mullvadvpn.util.inAnyOf @@ -76,56 +66,40 @@ fun WireguardCustomPortDialog( onDismiss: () -> Unit, ) { val port = remember { mutableStateOf(initialPort?.value?.toString() ?: "") } - val isValidPort = port.value.toPortOrNull()?.inAnyOf(allowedPortRanges) ?: false - AlertDialog( - title = { Text(text = stringResource(id = R.string.custom_port_dialog_title)) }, - confirmButton = { - Column(verticalArrangement = Arrangement.spacedBy(Dimens.buttonSpacing)) { - PrimaryButton( - text = stringResource(id = R.string.custom_port_dialog_submit), - onClick = { onSave(port.value.toPortOrNull()) }, - isEnabled = isValidPort, - ) - if (initialPort != null) { - NegativeButton( - text = stringResource(R.string.custom_port_dialog_remove), - onClick = { onSave(null) }, - ) - } - PrimaryButton(text = stringResource(id = R.string.cancel), onClick = onDismiss) - } - }, - text = { - Column { - CustomPortTextField( - value = port.value, - onSubmit = { input -> - if (isValidPort) { - onSave(input.toPortOrNull()) - } - }, - onValueChanged = { input -> port.value = input }, - isValidValue = isValidPort, - maxCharLength = 5, - modifier = Modifier.testTag(CUSTOM_PORT_DIALOG_INPUT_TEST_TAG).fillMaxWidth(), - ) - Spacer(modifier = Modifier.height(Dimens.smallPadding)) - Text( - text = - stringResource( - id = R.string.custom_port_dialog_valid_ranges, - allowedPortRanges.asString(), - ), - color = MaterialTheme.colorScheme.onSurfaceVariant, - style = MaterialTheme.typography.bodySmall, - ) - } + InputDialog( + title = stringResource(id = R.string.custom_port_dialog_title), + input = { + CustomPortTextField( + value = port.value, + onSubmit = { input -> + if (isValidPort) { + onSave(input.toPortOrNull()) + } + }, + onValueChanged = { input -> port.value = input }, + isValidValue = isValidPort, + maxCharLength = 5, + modifier = Modifier.testTag(CUSTOM_PORT_DIALOG_INPUT_TEST_TAG).fillMaxWidth(), + ) }, - containerColor = MaterialTheme.colorScheme.surface, - titleContentColor = MaterialTheme.colorScheme.onSurface, - onDismissRequest = onDismiss, + message = + stringResource( + id = R.string.custom_port_dialog_valid_ranges, + allowedPortRanges.asString(), + ), + confirmButtonEnabled = isValidPort, + confirmButtonText = stringResource(id = R.string.custom_port_dialog_submit), + onResetButtonText = stringResource(R.string.custom_port_dialog_remove), + onBack = onDismiss, + onReset = + if (initialPort != null) { + { onSave(null) } + } else { + null + }, + onConfirm = { onSave(port.value.toPortOrNull()) }, ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ApiAccessMethodInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ApiAccessMethodInfoDialog.kt index 95d4304976..44358083d8 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ApiAccessMethodInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ApiAccessMethodInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ContentBlockersInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ContentBlockersInfoDialog.kt index 88d125f20e..5826da034a 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ContentBlockersInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ContentBlockersInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomDnsInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/CustomDnsInfoDialog.kt index a464b1fbb1..5a4547c4b8 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomDnsInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/CustomDnsInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DaitaInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/DaitaInfoDialog.kt index a7e2b0b78e..4cfbbb087e 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DaitaInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/DaitaInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeviceNameInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/DeviceNameInfoDialog.kt index 728913d7c1..bd4ac6ffc1 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeviceNameInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/DeviceNameInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/InfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/InfoDialog.kt index 0b0632f1d7..f1f0a6d41f 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/InfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/InfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer 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/info/LocalNetworkSharingInfoDialog.kt index 830bdf393f..03713afba7 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/LocalNetworkSharingInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MalwareInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/MalwareInfoDialog.kt index c5b52240f1..efc2f962f1 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MalwareInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/MalwareInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ObfuscationInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ObfuscationInfoDialog.kt index aa7dd334ff..b62862aeaa 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ObfuscationInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ObfuscationInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/QuantumResistanceInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/QuantumResistanceInfoDialog.kt index 1d9a397532..71d9af3182 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/QuantumResistanceInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/QuantumResistanceInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ServerIpOverridesInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ServerIpOverridesInfoDialog.kt index 0a38d8d878..aff628c3fc 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ServerIpOverridesInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ServerIpOverridesInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/UdpOverTcpPortInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/UdpOverTcpPortInfoDialog.kt index 4dd1f8ce7e..ccebe70f32 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/UdpOverTcpPortInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/UdpOverTcpPortInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardPortInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/WireguardPortInfoDialog.kt index e4b6bf06f3..63efb152ae 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardPortInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/WireguardPortInfoDialog.kt @@ -1,4 +1,4 @@ -package net.mullvad.mullvadvpn.compose.dialog +package net.mullvad.mullvadvpn.compose.dialog.info import android.os.Parcelable import androidx.compose.runtime.Composable 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 c130d6d61c..e77dbf00ef 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 @@ -71,7 +71,7 @@ import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar import net.mullvad.mullvadvpn.compose.component.textResource import net.mullvad.mullvadvpn.compose.dialog.WireguardCustomPortNavArgs -import net.mullvad.mullvadvpn.compose.dialog.WireguardPortInfoDialogArgument +import net.mullvad.mullvadvpn.compose.dialog.info.WireguardPortInfoDialogArgument import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.extensions.itemWithDivider import net.mullvad.mullvadvpn.compose.extensions.itemsIndexedWithDivider |
