Skip to content

Commit c2d176c

Browse files
authored
Cherry-pick from release branch (#3525)
* Update navigation Padding; Update load and performance icons * Add error states for unavailable gateways * Add new backend events
1 parent 21662bd commit c2d176c

File tree

7 files changed

+56
-11
lines changed

7 files changed

+56
-11
lines changed

nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/manager/backend/NymBackendManager.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,13 @@ class NymBackendManager @Inject constructor(
306306

307307
else -> Unit
308308
}
309+
310+
is BackendEvent.AccountState -> {
311+
Timber.d("AccountState: ${backendEvent.event}")
312+
}
313+
is BackendEvent.ConfigChanged -> {
314+
Timber.d("ConfigChanged")
315+
}
309316
}
310317
}
311318

nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/screens/details/DetailsScreen.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package net.nymtech.nymvpn.ui.screens.details
22

33
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Arrangement
45
import androidx.compose.foundation.layout.Box
56
import androidx.compose.foundation.layout.Column
67
import androidx.compose.foundation.layout.Row
78
import androidx.compose.foundation.layout.Spacer
9+
import androidx.compose.foundation.layout.WindowInsets
10+
import androidx.compose.foundation.layout.asPaddingValues
811
import androidx.compose.foundation.layout.fillMaxSize
912
import androidx.compose.foundation.layout.fillMaxWidth
1013
import androidx.compose.foundation.layout.height
1114
import androidx.compose.foundation.layout.padding
15+
import androidx.compose.foundation.layout.systemBars
1216
import androidx.compose.foundation.layout.width
1317
import androidx.compose.foundation.rememberScrollState
1418
import androidx.compose.foundation.verticalScroll
@@ -79,9 +83,12 @@ fun DetailsScreen(appUiState: AppUiState, id: String, type: GatewayType, gateway
7983
@Composable
8084
fun DetailsScreen(detailsUiState: DetailsUiState, onSelectServerClick: () -> Unit) {
8185
Column(
86+
verticalArrangement = Arrangement.spacedBy(8.dp.scaledHeight(), Alignment.Top),
8287
horizontalAlignment = Alignment.Start,
8388
modifier = Modifier
84-
.fillMaxSize(),
89+
.fillMaxSize()
90+
.background(MaterialTheme.colorScheme.background)
91+
.padding(WindowInsets.systemBars.asPaddingValues()),
8592
) {
8693
Column(
8794
modifier = Modifier
@@ -156,7 +163,7 @@ internal fun PreviewPrivacyScreen() {
156163
countryCode = "DE",
157164
mixnetScore = Score.HIGH,
158165
score = Score.HIGH,
159-
load = Score.MEDIUM,
166+
load = Score.HIGH,
160167
uptime = 89f,
161168
lastUpdated = "September 11, 2025 at 13:31",
162169
asnName = "Google LLC",

nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/ui/screens/details/components/DetailsSectionPerformance.kt

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import androidx.compose.ui.unit.dp
1717
import net.nymtech.nymvpn.R
1818
import net.nymtech.nymvpn.ui.theme.Typography
1919
import net.nymtech.nymvpn.util.extensions.capitalizeFirstLowerRest
20+
import net.nymtech.nymvpn.util.extensions.colorLoad
21+
import net.nymtech.nymvpn.util.extensions.colorPerformance
2022
import net.nymtech.nymvpn.util.extensions.formatUtcString
2123
import net.nymtech.nymvpn.util.extensions.getScoreIcon
2224
import nym_vpn_lib_types.Score
@@ -38,7 +40,7 @@ fun DetailsSectionPerformance(score: Score?, load: Score?, uptime: Float?, lastU
3840
Text(
3941
text = s.name.capitalizeFirstLowerRest(),
4042
style = Typography.bodyMedium,
41-
color = MaterialTheme.colorScheme.onBackground,
43+
color = s.colorPerformance(),
4244
fontFamily = FontFamily(Font(R.font.lab_grotesque_regular)),
4345
)
4446
}
@@ -50,17 +52,10 @@ fun DetailsSectionPerformance(score: Score?, load: Score?, uptime: Float?, lastU
5052
add(
5153
stringResource(R.string.details_server_load) to {
5254
Row(verticalAlignment = Alignment.CenterVertically) {
53-
val loadIcon = getScoreIcon(l)
54-
Image(
55-
loadIcon.first,
56-
contentDescription = loadIcon.second,
57-
modifier = Modifier.size(16.dp),
58-
)
59-
Spacer(modifier = Modifier.width(6.dp))
6055
Text(
6156
text = l.name.capitalizeFirstLowerRest(),
6257
style = Typography.bodyMedium,
63-
color = MaterialTheme.colorScheme.onBackground,
58+
color = l.colorLoad(),
6459
fontFamily = FontFamily(Font(R.font.lab_grotesque_regular)),
6560
)
6661
}

nym-vpn-android/app/src/main/java/net/nymtech/nymvpn/util/extensions/UiExtensions.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import net.nymtech.nymvpn.NymVpn
2121
import net.nymtech.nymvpn.ui.Route
2222
import kotlin.reflect.KClass
2323
import net.nymtech.nymvpn.R
24+
import net.nymtech.nymvpn.ui.theme.CustomColors
2425
import net.nymtech.vpn.backend.Tunnel
2526
import net.nymtech.vpn.model.NymGateway
2627
import nym_vpn_lib_types.EntryPoint
@@ -143,6 +144,8 @@ fun ErrorStateReason.toUserMessage(context: Context): String {
143144
ErrorStateReason.TunnelProvider -> context.getString(R.string.error_tunnel_provider)
144145
ErrorStateReason.CredentialWastedOnEntryGateway -> context.getString(R.string.error_bandwidth_entry)
145146
ErrorStateReason.CredentialWastedOnExitGateway -> context.getString(R.string.error_bandwidth_exit)
147+
ErrorStateReason.PerformantEntryGatewayUnavailable -> context.getString(R.string.error_gateway_unavailable_entry)
148+
ErrorStateReason.PerformantExitGatewayUnavailable -> context.getString(R.string.error_gateway_unavailable_exit)
146149
}
147150
}
148151

@@ -192,6 +195,26 @@ fun getScoreIcon(score: Score): Pair<ImageVector, String> {
192195
}
193196
}
194197

198+
@Composable
199+
fun Score.colorLoad(): Color {
200+
return when (this) {
201+
Score.HIGH -> Color.Red
202+
Score.MEDIUM -> CustomColors.warning
203+
Score.LOW -> Color.Green
204+
Score.OFFLINE -> Color.Gray
205+
}
206+
}
207+
208+
@Composable
209+
fun Score.colorPerformance(): Color {
210+
return when (this) {
211+
Score.HIGH -> Color.Green
212+
Score.MEDIUM -> CustomColors.warning
213+
Score.LOW -> Color.Red
214+
Score.OFFLINE -> Color.Gray
215+
}
216+
}
217+
195218
fun String.capitalizeFirstLowerRest(): String {
196219
return this.lowercase()
197220
.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }

nym-vpn-android/app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@
188188
<string name="error_active_plan">You don’t have an active plan. Tap Get started to begin anonymous browsing.</string>
189189
<string name="error_bandwidth_entry">Entry gateway is not responding or responding badly to a bandwidth increase.</string>
190190
<string name="error_bandwidth_exit">Exit gateway is not responding or responding badly to a bandwidth increase.</string>
191+
<string name="error_gateway_unavailable_entry">The entry gateway can\'t connect. Try another!</string>
192+
<string name="error_gateway_unavailable_exit">The exit gateway can\'t connect. Try another!</string>
191193
<!-- Main Screen -->
192194
<string name="main_get_started_button">Get started</string>
193195
<string name="connection_state_resolving_addresses">Resolving API IP addresses</string>

nym-vpn-android/core/src/main/java/net/nymtech/vpn/backend/NymBackend.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,13 @@ class NymBackend private constructor(private val context: Context) : Backend, Tu
414414
onStateChange(event.asTunnelState())
415415
tunnel?.onBackendEvent(BackendEvent.Tunnel(event.v1))
416416
}
417+
418+
is TunnelEvent.AccountState -> {
419+
tunnel?.onBackendEvent(BackendEvent.AccountState(event.v1))
420+
}
421+
is TunnelEvent.ConfigChanged -> {
422+
tunnel?.onBackendEvent(BackendEvent.ConfigChanged(event.v1))
423+
}
417424
}
418425
}
419426

nym-vpn-android/core/src/main/java/net/nymtech/vpn/model/BackendEvent.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@ package net.nymtech.vpn.model
33
import nym_vpn_lib_types.MixnetEvent
44
import nym_vpn_lib_types.TunnelState
55
import nym_vpn_lib.VpnException
6+
import nym_vpn_lib_types.AccountControllerState
7+
import nym_vpn_lib_types.BoxedVpnServiceConfig
68

79
sealed class BackendEvent {
810
data class Mixnet(val event: MixnetEvent) : BackendEvent()
911
data class Tunnel(val state: TunnelState) : BackendEvent()
12+
data class AccountState(val event: AccountControllerState) : BackendEvent()
13+
data class ConfigChanged(val event: BoxedVpnServiceConfig) : BackendEvent()
1014
data class StartFailure(val exception: VpnException) : BackendEvent()
1115
}

0 commit comments

Comments
 (0)