summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/HtmlText.kt31
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt28
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt110
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt27
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/InputDialog.kt106
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt101
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/NegativeConfirmationDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteConfirmationDialog.kt)45
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt61
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt50
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt88
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ApiAccessMethodInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ApiAccessMethodInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ContentBlockersInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ContentBlockersInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/CustomDnsInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomDnsInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/DaitaInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DaitaInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/DeviceNameInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeviceNameInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/InfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/InfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/LocalNetworkSharingInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/MalwareInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MalwareInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ObfuscationInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ObfuscationInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/QuantumResistanceInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/QuantumResistanceInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ServerIpOverridesInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ServerIpOverridesInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/UdpOverTcpPortInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/UdpOverTcpPortInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/WireguardPortInfoDialog.kt (renamed from android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardPortInfoDialog.kt)2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt2
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