summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2025-05-15 13:54:08 +0200
committerDavid Göransson <david.goransson@mullvad.net>2025-05-15 13:54:08 +0200
commit1957ca9181c3badffc103166c3d4f668694e0345 (patch)
tree8d2988cca39fd83fb7ace454b6bca6348facb9d3 /android/lib
parent5cad8a58a60dd5b544ef96820a7be965b9a3febd (diff)
parent2658a984765bae7d097b530acf92d47aabe52da1 (diff)
downloadmullvadvpn-1957ca9181c3badffc103166c3d4f668694e0345.tar.xz
mullvadvpn-1957ca9181c3badffc103166c3d4f668694e0345.zip
Merge branch 'design-review-changes'
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/InAppNotification.kt18
-rw-r--r--android/lib/resource/src/main/res/drawable/icon_fail.xml18
-rw-r--r--android/lib/resource/src/main/res/drawable/icon_success.xml19
-rw-r--r--android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt11
-rw-r--r--android/lib/tv/src/main/kotlin/net/mullvad/mullvadvpn/lib/tv/NavigationDrawerTv.kt4
-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.kt15
7 files changed, 49 insertions, 38 deletions
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/InAppNotification.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/InAppNotification.kt
index fdaa5f3c9d..7a681da66c 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/InAppNotification.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/InAppNotification.kt
@@ -6,6 +6,7 @@ enum class StatusLevel {
Error,
Warning,
Info,
+ None,
}
sealed class InAppNotification {
@@ -13,18 +14,23 @@ sealed class InAppNotification {
abstract val priority: Long
data class TunnelStateError(val error: ErrorState) : InAppNotification() {
- override val statusLevel = StatusLevel.Error
- override val priority: Long = 1001
+ override val statusLevel =
+ if (error.cause is ErrorStateCause.IsOffline) {
+ StatusLevel.Warning
+ } else {
+ StatusLevel.Error
+ }
+ override val priority: Long = 1004
}
data object TunnelStateBlocked : InAppNotification() {
- override val statusLevel = StatusLevel.Error
- override val priority: Long = 1000
+ override val statusLevel = StatusLevel.None
+ override val priority: Long = 1003
}
data class UnsupportedVersion(val versionInfo: VersionInfo) : InAppNotification() {
override val statusLevel = StatusLevel.Error
- override val priority: Long = 999
+ override val priority: Long = 1002
}
data class AccountExpiry(val expiry: Duration) : InAppNotification() {
@@ -39,6 +45,6 @@ sealed class InAppNotification {
data object NewVersionChangelog : InAppNotification() {
override val statusLevel = StatusLevel.Info
- override val priority: Long = 1001
+ override val priority: Long = 1000
}
}
diff --git a/android/lib/resource/src/main/res/drawable/icon_fail.xml b/android/lib/resource/src/main/res/drawable/icon_fail.xml
index 3f934a1300..efe8f0c89d 100644
--- a/android/lib/resource/src/main/res/drawable/icon_fail.xml
+++ b/android/lib/resource/src/main/res/drawable/icon_fail.xml
@@ -1,10 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="44dp"
- android:height="44dp"
- android:viewportWidth="44"
- android:viewportHeight="44">
- <path android:pathData="M22,22m-22,0a22,22 0,1 1,44 0a22,22 0,1 1,-44 0"
- android:fillColor="#fff" />
- <path android:pathData="m25.147,22 l7.875,-7.872A2.225,2.225 0,0 0,29.875 10.982l-7.875,7.872L14.125,10.982A2.225,2.225 0,0 0,10.977 14.128l7.875,7.872 -7.875,7.871a2.225,2.225 0,0 0,3.147 3.146l7.875,-7.872 7.875,7.872a2.225,2.225 0,0 0,3.147 -3.146l-7.875,-7.872z"
- android:fillColor="#e34039" />
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+ <path
+ android:pathData="M24,44C35.046,44 44,35.046 44,24C44,12.954 35.046,4 24,4C12.954,4 4,12.954 4,24C4,35.046 12.954,44 24,44Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M26.861,24L34.02,16.844C34.393,16.463 34.602,15.95 34.599,15.417C34.597,14.884 34.384,14.373 34.007,13.996C33.629,13.619 33.118,13.406 32.585,13.404C32.052,13.401 31.539,13.61 31.159,13.984L24,21.14L16.841,13.984C16.461,13.604 15.947,13.391 15.41,13.391C14.874,13.391 14.359,13.603 13.98,13.983C13.6,14.362 13.387,14.876 13.387,15.413C13.387,15.95 13.599,16.464 13.979,16.844L21.138,24L13.979,31.155C13.605,31.536 13.397,32.049 13.399,32.582C13.402,33.115 13.615,33.626 13.992,34.003C14.369,34.38 14.88,34.593 15.413,34.595C15.947,34.598 16.459,34.389 16.84,34.015L23.999,26.859L31.158,34.015C31.538,34.389 32.051,34.598 32.584,34.595C33.118,34.593 33.628,34.38 34.006,34.003C34.383,33.626 34.596,33.115 34.598,32.582C34.601,32.049 34.393,31.536 34.019,31.155L26.86,23.999L26.861,24Z"
+ android:fillColor="#E34039"/>
</vector>
diff --git a/android/lib/resource/src/main/res/drawable/icon_success.xml b/android/lib/resource/src/main/res/drawable/icon_success.xml
index 1b15d4c1c4..2f0cf6d924 100644
--- a/android/lib/resource/src/main/res/drawable/icon_success.xml
+++ b/android/lib/resource/src/main/res/drawable/icon_success.xml
@@ -1,11 +1,12 @@
-<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="44dp"
- android:height="44dp"
- android:viewportWidth="44.0"
- android:viewportHeight="44.0">
- <path android:fillColor="#fff"
- android:pathData="M22,22m-22,0a22,22 0,1 1,44 0a22,22 0,1 1,-44 0" />
- <path android:fillColor="#44AD4D"
- android:pathData="M11.4142136,20.5857864 C10.633165,19.8047379 9.366835,19.8047379 8.5857864,20.5857864 C7.8047379,21.366835 7.8047379,22.633165 8.5857864,23.4142136 L16.5857864,31.4142136 C17.366835,32.1952621 18.633165,32.1952621 19.4142136,31.4142136 L35.4142136,15.4142136 C36.1952621,14.633165 36.1952621,13.366835 35.4142136,12.5857864 C34.633165,11.8047379 33.366835,11.8047379 32.5857864,12.5857864 L18,27.1715729 L11.4142136,20.5857864 Z" />
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+ <path
+ android:pathData="M24,44C35.046,44 44,35.046 44,24C44,12.954 35.046,4 24,4C12.954,4 4,12.954 4,24C4,35.046 12.954,44 24,44Z"
+ android:fillColor="#ffffff"/>
+ <path
+ android:pathData="M14.377,22.725C14.034,22.386 13.572,22.197 13.091,22.197C12.61,22.197 12.148,22.386 11.806,22.725C11.638,22.891 11.504,23.089 11.413,23.308C11.322,23.526 11.275,23.761 11.275,23.997C11.275,24.234 11.322,24.468 11.413,24.687C11.504,24.905 11.638,25.103 11.806,25.27L19.078,32.482C19.421,32.82 19.882,33.01 20.364,33.01C20.845,33.01 21.307,32.82 21.649,32.482L36.195,18.057C36.363,17.891 36.496,17.692 36.587,17.474C36.678,17.255 36.725,17.021 36.725,16.785C36.725,16.548 36.678,16.314 36.587,16.095C36.496,15.877 36.363,15.678 36.195,15.512C35.852,15.174 35.39,14.984 34.909,14.984C34.428,14.984 33.966,15.174 33.624,15.512L20.364,28.662L14.377,22.725Z"
+ android:fillColor="#44AD4D"/>
</vector>
diff --git a/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt b/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt
index 77ac2c3e62..e7e38534ba 100644
--- a/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt
+++ b/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt
@@ -7,11 +7,10 @@ data class Dimensions(
val accountRowMinHeight: Dp = 48.dp,
val accountRowSpacing: Dp = 24.dp,
val addIconSize: Dp = 24.dp,
- val bigIconSize: Dp = 44.dp,
+ val bigIconSize: Dp = 40.dp,
val bottomPadding: Dp = 4.dp,
val buttonHeight: Dp = 44.dp,
- val buttonSpacing: Dp = 12.dp,
- val buttonVerticalPadding: Dp = 8.dp,
+ val buttonSpacing: Dp = 8.dp,
val cellEndPadding: Dp = 16.dp,
val cellFooterTopPadding: Dp = 6.dp,
val cellHeight: Dp = 56.dp,
@@ -22,7 +21,7 @@ data class Dimensions(
val cellVerticalSpacing: Dp = 24.dp,
val chipSpace: Dp = 8.dp,
val chipVerticalPadding: Dp = 4.dp,
- val circularProgressBarLargeSize: Dp = 44.dp,
+ val circularProgressBarLargeSize: Dp = 40.dp,
val circularProgressBarLargeStrokeWidth: Dp = 6.dp,
val circularProgressBarMediumSize: Dp = 32.dp,
val circularProgressBarMediumStrokeWidth: Dp = 4.dp,
@@ -57,7 +56,8 @@ data class Dimensions(
val problemReportIconToTitlePadding: Dp = 60.dp,
val reconnectButtonMinInteractiveComponentSize: Dp = 40.dp,
val relayCircleSize: Dp = 16.dp,
- val screenVerticalMargin: Dp = 24.dp,
+ val screenBottomMargin: Dp = 16.dp,
+ val screenTopMargin: Dp = 24.dp,
val searchFieldHeight: Dp = 42.dp,
val searchFieldHeightExpanded: Dp = 72.dp,
val searchFieldHorizontalPadding: Dp = 22.dp,
@@ -77,7 +77,6 @@ data class Dimensions(
val switchLocationRetryMinWidth: Dp = 48.dp,
val tinyPadding: Dp = 4.dp,
val titleIconSize: Dp = 48.dp,
- val topPadding: Dp = 20.dp,
val tvDrawerHeaderStartPadding: Dp = 12.dp,
val tvDrawerHeaderWithFocusStartPadding: Dp = 16.dp,
val tvDrawerHorizontalPadding: Dp = 12.dp,
diff --git a/android/lib/tv/src/main/kotlin/net/mullvad/mullvadvpn/lib/tv/NavigationDrawerTv.kt b/android/lib/tv/src/main/kotlin/net/mullvad/mullvadvpn/lib/tv/NavigationDrawerTv.kt
index 2b74716950..56b15f9616 100644
--- a/android/lib/tv/src/main/kotlin/net/mullvad/mullvadvpn/lib/tv/NavigationDrawerTv.kt
+++ b/android/lib/tv/src/main/kotlin/net/mullvad/mullvadvpn/lib/tv/NavigationDrawerTv.kt
@@ -103,8 +103,8 @@ fun NavigationDrawerTv(
Modifier.fillMaxHeight()
.background(brush)
.padding(
- top = Dimens.screenVerticalMargin,
- bottom = Dimens.screenVerticalMargin,
+ top = Dimens.screenBottomMargin,
+ bottom = Dimens.screenBottomMargin,
start = Dimens.tvDrawerHorizontalPadding,
end = Dimens.tvDrawerHorizontalPadding,
)
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 ba0a936109..62c3b5522a 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
@@ -18,6 +18,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.semantics.Role
@@ -184,6 +185,7 @@ private fun NotificationDot(statusLevel: StatusLevel, modifier: Modifier) {
StatusLevel.Error -> MaterialTheme.colorScheme.error
StatusLevel.Warning -> MaterialTheme.colorScheme.warning
StatusLevel.Info -> MaterialTheme.colorScheme.tertiary
+ StatusLevel.None -> Color.Transparent
},
shape = CircleShape,
)
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 c9bfcd887d..ed3da5b1b1 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
@@ -90,7 +90,7 @@ fun InAppNotification.toNotificationData(
stringResource(id = R.string.new_device_notification_message, deviceName)
.formatWithHtml()
),
- statusLevel = StatusLevel.Info,
+ statusLevel = statusLevel,
action =
NotificationAction(
Icons.Default.Clear,
@@ -102,7 +102,7 @@ fun InAppNotification.toNotificationData(
NotificationData(
title = stringResource(id = R.string.account_credit_expires_soon),
message = LocalContext.current.resources.getExpiryQuantityString(expiry),
- statusLevel = StatusLevel.Error,
+ statusLevel = statusLevel,
action =
if (isPlayBuild) null
else
@@ -115,15 +115,15 @@ fun InAppNotification.toNotificationData(
InAppNotification.TunnelStateBlocked ->
NotificationData(
title = stringResource(id = R.string.blocking_internet),
- statusLevel = StatusLevel.Error,
+ statusLevel = StatusLevel.None,
)
is InAppNotification.TunnelStateError ->
- errorMessageBannerData(error, onClickShowWireguardPortSettings)
+ errorMessageBannerData(statusLevel, error, onClickShowWireguardPortSettings)
is InAppNotification.UnsupportedVersion ->
NotificationData(
title = stringResource(id = R.string.unsupported_version),
message = stringResource(id = R.string.unsupported_version_description),
- statusLevel = StatusLevel.Error,
+ statusLevel = statusLevel,
action =
NotificationAction(
Icons.AutoMirrored.Default.OpenInNew,
@@ -150,7 +150,7 @@ fun InAppNotification.toNotificationData(
contentDescription =
stringResource(id = R.string.new_changelog_notification_message),
),
- statusLevel = StatusLevel.Info,
+ statusLevel = statusLevel,
action =
NotificationAction(
Icons.Default.Clear,
@@ -162,13 +162,14 @@ fun InAppNotification.toNotificationData(
@Composable
private fun errorMessageBannerData(
+ statusLevel: StatusLevel,
error: ErrorState,
onClickShowWireguardPortSettings: () -> Unit,
) =
NotificationData(
title = error.title().formatWithHtml(),
message = NotificationMessage.Text(error.message(onClickShowWireguardPortSettings)),
- statusLevel = StatusLevel.Error,
+ statusLevel = statusLevel,
)
@Composable