diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-08-14 14:27:26 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-08-22 13:49:04 +0200 |
| commit | c5b594a4d081579b66930fd696cbc5c440288e8f (patch) | |
| tree | 8157fb9e969d031cd8404b79c4ea52e10523bde1 /android/app/src | |
| parent | 744950926a5295de0d829a7bcdddfff0711308bb (diff) | |
| download | mullvadvpn-c5b594a4d081579b66930fd696cbc5c440288e8f.tar.xz mullvadvpn-c5b594a4d081579b66930fd696cbc5c440288e8f.zip | |
Improve connect on start up information
Diffstat (limited to 'android/app/src')
6 files changed, 85 insertions, 23 deletions
diff --git a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt index 310ebcdc6f..d996be4b51 100644 --- a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt +++ b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreenTest.kt @@ -122,6 +122,7 @@ class VpnSettingsScreenTest { navigateToIpv6Info: () -> Unit = {}, onToggleDnsContentBlockers: () -> Unit = {}, navigateToDeviceIpInfo: () -> Unit = {}, + navigateToConnectOnDeviceOnStartUpInfo: () -> Unit = {}, ) { setContentWithTheme { VpnSettingsScreen( @@ -158,6 +159,7 @@ class VpnSettingsScreenTest { navigateToIpv6Info = navigateToIpv6Info, onToggleContentBlockersExpanded = onToggleDnsContentBlockers, navigateToDeviceIpInfo = navigateToDeviceIpInfo, + navigateToConnectOnDeviceOnStartUpInfo = navigateToConnectOnDeviceOnStartUpInfo, initialScrollToFeature = null, ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ConnectOnStartupInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ConnectOnStartupInfoDialog.kt new file mode 100644 index 0000000000..b81cd00c0a --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/ConnectOnStartupInfoDialog.kt @@ -0,0 +1,59 @@ +package net.mullvad.mullvadvpn.compose.dialog.info + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.OpenInNew +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.navigation.DestinationsNavigator +import com.ramcosta.composedestinations.spec.DestinationStyle +import net.mullvad.mullvadvpn.R +import net.mullvad.mullvadvpn.compose.button.PrimaryButton +import net.mullvad.mullvadvpn.lib.common.util.openAppDetailsSettings +import net.mullvad.mullvadvpn.lib.theme.AppTheme + +@Preview +@Composable +private fun PreviewApiAccessMethodInfoDialog() { + AppTheme { ConnectOnStartupInfoDialog(onDismiss = {}, openAppDetails = {}) } +} + +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) +@Composable +fun ConnectOnStartupInfo(navigator: DestinationsNavigator) { + val context = LocalContext.current + ConnectOnStartupInfoDialog( + onDismiss = navigator::navigateUp, + openAppDetails = { context.openAppDetailsSettings() }, + ) +} + +@Composable +fun ConnectOnStartupInfoDialog(onDismiss: () -> Unit, openAppDetails: () -> Unit) { + InfoDialog( + onDismiss = { onDismiss() }, + message = stringResource(R.string.connect_on_start_info_first), + additionalInfo = stringResource(R.string.connect_on_start_info_second), + confirmButton = { + PrimaryButton( + text = stringResource(R.string.open_app_details), + onClick = openAppDetails, + trailingIcon = { + Icon( + imageVector = Icons.AutoMirrored.Filled.OpenInNew, + tint = MaterialTheme.colorScheme.onPrimary, + contentDescription = null, + ) + }, + ) + }, + dismissButton = { + PrimaryButton(text = stringResource(R.string.got_it), onClick = onDismiss) + }, + ) +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/InfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/InfoDialog.kt index 1cb4bccbed..cf6cb1c240 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/InfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/info/InfoDialog.kt @@ -43,7 +43,19 @@ private fun PreviewChangelogDialogWithTwoLongItems() { } @Composable -fun InfoDialog(message: String, additionalInfo: String? = null, onDismiss: () -> Unit) { +fun InfoDialog( + message: String, + additionalInfo: String? = null, + onDismiss: () -> Unit, + confirmButton: @Composable () -> Unit = { + PrimaryButton( + modifier = Modifier.wrapContentHeight().fillMaxWidth(), + text = stringResource(R.string.got_it), + onClick = onDismiss, + ) + }, + dismissButton: @Composable (() -> Unit)? = null, +) { AlertDialog( onDismissRequest = { onDismiss() }, icon = { @@ -86,13 +98,8 @@ fun InfoDialog(message: String, additionalInfo: String? = null, onDismiss: () -> } } }, - confirmButton = { - PrimaryButton( - modifier = Modifier.wrapContentHeight().fillMaxWidth(), - text = stringResource(R.string.got_it), - onClick = onDismiss, - ) - }, + confirmButton = confirmButton, + dismissButton = dismissButton, properties = DialogProperties(dismissOnClickOutside = true, dismissOnBackPress = true), containerColor = MaterialTheme.colorScheme.surface, ) 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 7d26ad25ee..ea45861c96 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 @@ -46,6 +46,7 @@ import androidx.lifecycle.compose.dropUnlessResumed import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.generated.destinations.AutoConnectAndLockdownModeDestination +import com.ramcosta.composedestinations.generated.destinations.ConnectOnStartupInfoDestination import com.ramcosta.composedestinations.generated.destinations.ContentBlockersInfoDestination import com.ramcosta.composedestinations.generated.destinations.CustomDnsInfoDestination import com.ramcosta.composedestinations.generated.destinations.DeviceIpInfoDestination @@ -172,6 +173,7 @@ private fun PreviewVpnSettings( onToggleContentBlockersExpanded = {}, navigateToIpv6Info = {}, navigateToDeviceIpInfo = {}, + navigateToConnectOnDeviceOnStartUpInfo = {}, ) } } @@ -306,6 +308,8 @@ fun SharedTransitionScope.VpnSettings( onToggleIpv6 = vm::setIpv6Enabled, navigateToIpv6Info = dropUnlessResumed { navigator.navigate(Ipv6InfoDestination) }, navigateToDeviceIpInfo = dropUnlessResumed { navigator.navigate(DeviceIpInfoDestination) }, + navigateToConnectOnDeviceOnStartUpInfo = + dropUnlessResumed { navigator.navigate(ConnectOnStartupInfoDestination) }, ) } @@ -349,6 +353,7 @@ fun VpnSettingsScreen( onToggleIpv6: (Boolean) -> Unit, navigateToIpv6Info: () -> Unit, navigateToDeviceIpInfo: () -> Unit, + navigateToConnectOnDeviceOnStartUpInfo: () -> Unit, ) { val appBarState = rememberTopAppBarState() val canScroll = remember { mutableStateOf(false) } @@ -419,6 +424,7 @@ fun VpnSettingsScreen( onToggleIpv6, navigateToIpv6Info, navigateToDeviceIpInfo, + navigateToConnectOnDeviceOnStartUpInfo, ) } } @@ -464,6 +470,7 @@ fun VpnSettingsContent( onToggleIpv6: (Boolean) -> Unit, navigateToIpv6Info: () -> Unit, navigateToDeviceIpInfo: () -> Unit, + navigateToConnectOnDeviceOnStartUpInfo: () -> Unit, ) { val initialIndexFocus = when (initialScrollToFeature) { @@ -534,24 +541,13 @@ fun VpnSettingsContent( modifier = Modifier.animateItem(), title = stringResource(R.string.connect_on_start), isToggled = it.enabled, + onInfoClicked = navigateToConnectOnDeviceOnStartUpInfo, onCellClicked = { newValue -> onToggleAutoStartAndConnectOnBoot(newValue) }, ) } - VpnSettingItem.ConnectDeviceOnStartUpInfo -> - item(key = it::class.simpleName) { - SwitchComposeSubtitleCell( - modifier = Modifier.animateItem(), - text = - textResource( - R.string.connect_on_start_footer, - textResource(R.string.auto_connect_and_lockdown_mode), - ), - ) - } - VpnSettingItem.CustomDnsAdd -> item(key = it::class.simpleName) { BaseCell( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingItem.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingItem.kt index 1016b62af8..517959e1a2 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingItem.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingItem.kt @@ -16,8 +16,6 @@ sealed interface VpnSettingItem { // Only used on TV devices data class ConnectDeviceOnStartUpSetting(val enabled: Boolean) : VpnSettingItem - data object ConnectDeviceOnStartUpInfo : VpnSettingItem - data class LocalNetworkSharingSetting(val enabled: Boolean) : VpnSettingItem data class DnsContentBlockersHeader(val featureEnabled: Boolean, val expanded: Boolean) : diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt index 1526171b1b..bca87015b4 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt @@ -41,7 +41,7 @@ data class VpnSettingsUiState(val settings: List<VpnSettingItem>, val isModal: B add(VpnSettingItem.AutoConnectAndLockdownModeInfo) } else { add(VpnSettingItem.ConnectDeviceOnStartUpSetting(autoStartAndConnectOnBoot)) - add(VpnSettingItem.ConnectDeviceOnStartUpInfo) + add(VpnSettingItem.Spacer) } // Local network sharing |
