diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-05-12 16:11:38 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-05-13 15:48:32 +0200 |
| commit | c0b2a8c0f1c565a0343e91e914accafe1e69f3fc (patch) | |
| tree | 0c7179607e59043cc564721b5161ca5fff7af7f2 /android/lib/ui/component/src | |
| parent | ce62828a21cb65f2b0d1710b7d92b4e55a518408 (diff) | |
| download | mullvadvpn-c0b2a8c0f1c565a0343e91e914accafe1e69f3fc.tar.xz mullvadvpn-c0b2a8c0f1c565a0343e91e914accafe1e69f3fc.zip | |
Show a specific error if selected port is not in the port range
Diffstat (limited to 'android/lib/ui/component/src')
2 files changed, 50 insertions, 6 deletions
diff --git a/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/AnimatedNotificationBanner.kt b/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/AnimatedNotificationBanner.kt index 979f63920a..ba0a936109 100644 --- a/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/AnimatedNotificationBanner.kt +++ b/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/AnimatedNotificationBanner.kt @@ -44,6 +44,7 @@ fun AnimatedNotificationBanner( onClickShowChangelog: () -> Unit, onClickDismissChangelog: () -> Unit, onClickDismissNewDevice: () -> Unit, + onClickShowWireguardPortSettings: () -> Unit, ) { // Fix for animating to invisible state val previous = rememberPrevious(current = notification, shouldUpdate = { _, _ -> true }) @@ -64,6 +65,7 @@ fun AnimatedNotificationBanner( onClickShowChangelog, onClickDismissChangelog, onClickDismissNewDevice, + onClickShowWireguardPortSettings, ), ) } diff --git a/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/NotificationData.kt b/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/NotificationData.kt index b022ca8c07..c9bfcd887d 100644 --- a/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/NotificationData.kt +++ b/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/NotificationData.kt @@ -9,10 +9,13 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.LinkAnnotation +import androidx.compose.ui.text.LinkInteractionListener import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.withLink import androidx.compose.ui.text.withStyle import androidx.core.text.HtmlCompat import java.net.InetAddress @@ -75,6 +78,7 @@ fun InAppNotification.toNotificationData( onClickShowChangelog: () -> Unit, onClickDismissChangelog: () -> Unit, onClickDismissNewDevice: () -> Unit, + onClickShowWireguardPortSettings: () -> Unit, ) = when (this) { is InAppNotification.NewDevice -> @@ -113,7 +117,8 @@ fun InAppNotification.toNotificationData( title = stringResource(id = R.string.blocking_internet), statusLevel = StatusLevel.Error, ) - is InAppNotification.TunnelStateError -> errorMessageBannerData(error) + is InAppNotification.TunnelStateError -> + errorMessageBannerData(error, onClickShowWireguardPortSettings) is InAppNotification.UnsupportedVersion -> NotificationData( title = stringResource(id = R.string.unsupported_version), @@ -156,10 +161,13 @@ fun InAppNotification.toNotificationData( } @Composable -private fun errorMessageBannerData(error: ErrorState) = +private fun errorMessageBannerData( + error: ErrorState, + onClickShowWireguardPortSettings: () -> Unit, +) = NotificationData( title = error.title().formatWithHtml(), - message = NotificationMessage.Text(error.message().formatWithHtml()), + message = NotificationMessage.Text(error.message(onClickShowWireguardPortSettings)), statusLevel = StatusLevel.Error, ) @@ -191,11 +199,13 @@ private fun ErrorState.title(): String { } @Composable -private fun ErrorState.message(): String { +private fun ErrorState.message(onClickShowWireguardPortSettings: () -> Unit): AnnotatedString { val cause = this.cause return when { - isBlocking -> cause.errorMessageId() - else -> stringResource(R.string.failed_to_block_internet) + cause is ErrorStateCause.NoRelaysMatchSelectedPort -> + cause.message(onClickShowWireguardPortSettings) + isBlocking -> cause.errorMessageId().formatWithHtml() + else -> stringResource(R.string.failed_to_block_internet).formatWithHtml() } } @@ -220,6 +230,8 @@ private fun ErrorStateCause.errorMessageId(): String = R.string.invalid_dns_servers, addresses.joinToString { address -> address.addressString() }, ) + is ErrorStateCause.NoRelaysMatchSelectedPort -> + stringResource(R.string.wireguard_port_is_not_supported) } private fun AuthFailedError.errorMessageId(): Int = @@ -249,3 +261,33 @@ private fun InetAddress.addressString(): String { return address } + +@Composable +private fun ErrorStateCause.NoRelaysMatchSelectedPort.message( + onClickShowWireguardPortSettings: () -> Unit +) = buildAnnotatedString { + append( + stringResource(R.string.wireguard_port_is_not_supported, stringResource(R.string.wireguard)) + ) + append(" ") + withStyle( + SpanStyle( + color = MaterialTheme.colorScheme.onSurface, + textDecoration = TextDecoration.Underline, + ) + ) { + withLink( + LinkAnnotation.Clickable( + tag = stringResource(R.string.wireguard), + linkInteractionListener = + object : LinkInteractionListener { + override fun onClick(link: LinkAnnotation) { + onClickShowWireguardPortSettings() + } + }, + ) + ) { + append(stringResource(R.string.wireguard_settings, stringResource(R.string.wireguard))) + } + } +} |
