summaryrefslogtreecommitdiffhomepage
path: root/android/lib/ui
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-05-13 15:49:39 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-05-13 15:49:39 +0200
commit2beec9cb917cc274c4326345ae10ff041c665db0 (patch)
treea1f8dfe32fd7cd097b39a8aaecf39dd5acdc7014 /android/lib/ui
parentce62828a21cb65f2b0d1710b7d92b4e55a518408 (diff)
parent95d302c41f11f2b8090c955c59eab3e616430ee7 (diff)
downloadmullvadvpn-2beec9cb917cc274c4326345ae10ff041c665db0.tar.xz
mullvadvpn-2beec9cb917cc274c4326345ae10ff041c665db0.zip
Merge branch 'add-error-message-for-when-a-configured-port-is-invalid-droid-1982'
Diffstat (limited to 'android/lib/ui')
-rw-r--r--android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/AnimatedNotificationBanner.kt2
-rw-r--r--android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/NotificationData.kt54
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)))
+ }
+ }
+}