From 221e774471dfe7831c5958c78f8e2a7bf8ac6e27 Mon Sep 17 00:00:00 2001
From: James Rich <2199651+jamesarich@users.noreply.github.com>
Date: Sun, 1 Feb 2026 17:18:06 -0600
Subject: [PATCH] chore: fix regressions in the release (#4398)
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
---
app/src/main/AndroidManifest.xml | 3 +--
.../repository/radio/NordicBleInterface.kt | 22 ++++++++++++++-----
.../geeksville/mesh/service/MeshService.kt | 4 +---
build-logic/settings.gradle.kts | 14 ++++++++++--
.../feature/node/metrics/DeviceMetrics.kt | 11 +++++++---
.../feature/node/metrics/EnvironmentCharts.kt | 22 +++++++++++--------
.../feature/node/metrics/PowerMetrics.kt | 10 +++++----
.../feature/node/metrics/SignalMetrics.kt | 10 +++++++--
settings.gradle.kts | 7 +++++-
9 files changed, 71 insertions(+), 32 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ff2107c5a..e5d62f95e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -65,7 +65,6 @@
-
@@ -125,7 +124,7 @@
diff --git a/app/src/main/java/com/geeksville/mesh/repository/radio/NordicBleInterface.kt b/app/src/main/java/com/geeksville/mesh/repository/radio/NordicBleInterface.kt
index fd0be1261..f85df2fc0 100644
--- a/app/src/main/java/com/geeksville/mesh/repository/radio/NordicBleInterface.kt
+++ b/app/src/main/java/com/geeksville/mesh/repository/radio/NordicBleInterface.kt
@@ -113,13 +113,18 @@ constructor(
private fun fromRadioPacketFlow(): Flow = channelFlow {
while (isActive) {
- // Use safe call and Elvis operator for cleaner loop termination if read fails or returns empty
val packet =
- fromRadioCharacteristic?.read()?.takeIf { it.isNotEmpty() }
- ?: run {
- Logger.d { "[$address] fromRadio queue drain complete (read empty/null)" }
- break
- }
+ try {
+ fromRadioCharacteristic?.read()?.takeIf { it.isNotEmpty() }
+ } catch (e: Exception) {
+ Logger.w(e) { "[$address] Error reading fromRadioCharacteristic (likely disconnected)" }
+ null
+ }
+
+ if (packet == null) {
+ Logger.d { "[$address] fromRadio queue drain complete or error reading characteristic" }
+ break
+ }
send(packet)
}
}
@@ -221,6 +226,11 @@ constructor(
.onEach { state ->
Logger.i { "[$address] BLE connection state changed to $state" }
if (state is ConnectionState.Disconnected) {
+ toRadioCharacteristic = null
+ fromNumCharacteristic = null
+ fromRadioCharacteristic = null
+ logRadioCharacteristic = null
+
val uptime =
if (connectionStartTime > 0) {
System.currentTimeMillis() - connectionStartTime
diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
index c7761b229..76f4e371d 100644
--- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
+++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
@@ -140,9 +140,7 @@ class MeshService : Service() {
SERVICE_NOTIFY_ID,
notification,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
- var types =
- ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE or
- ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC
+ var types = ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
if (hasLocationPermission()) {
types = types or ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION
}
diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts
index e1846dc05..dff68e004 100644
--- a/build-logic/settings.gradle.kts
+++ b/build-logic/settings.gradle.kts
@@ -20,7 +20,12 @@ pluginManagement {
gradlePluginPortal()
google()
mavenCentral()
- maven { url = uri("https://jitpack.io") }
+ maven {
+ url = uri("https://jitpack.io")
+ content {
+ includeGroupByRegex("com\\.github\\..*")
+ }
+ }
}
}
@@ -39,7 +44,12 @@ dependencyResolutionManagement {
}
}
mavenCentral()
- maven { url = uri("https://jitpack.io") }
+ maven {
+ url = uri("https://jitpack.io")
+ content {
+ includeGroupByRegex("com\\.github\\..*")
+ }
+ }
}
versionCatalogs {
create("libs") {
diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt
index 4e7f83da8..641678821 100644
--- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt
+++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt
@@ -236,11 +236,16 @@ private fun DeviceMetricsChart(
/* Series for Left Axis (0-100%) */
lineSeries {
series(x = telemetries.map { it.time }, y = telemetries.map { it.deviceMetrics.batteryLevel })
- series(x = telemetries.map { it.time }, y = telemetries.map { it.deviceMetrics.channelUtilization })
- series(x = telemetries.map { it.time }, y = telemetries.map { it.deviceMetrics.airUtilTx })
+ val chUtilData = telemetries.filter { !it.deviceMetrics.channelUtilization.isNaN() }
+ series(x = chUtilData.map { it.time }, y = chUtilData.map { it.deviceMetrics.channelUtilization })
+ val airUtilData = telemetries.filter { !it.deviceMetrics.airUtilTx.isNaN() }
+ series(x = airUtilData.map { it.time }, y = airUtilData.map { it.deviceMetrics.airUtilTx })
}
/* Series for Right Axis (Voltage) */
- lineSeries { series(x = telemetries.map { it.time }, y = telemetries.map { it.deviceMetrics.voltage }) }
+ lineSeries {
+ val voltageData = telemetries.filter { !it.deviceMetrics.voltage.isNaN() }
+ series(x = voltageData.map { it.time }, y = voltageData.map { it.deviceMetrics.voltage })
+ }
}
}
diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt
index 353ad4706..b2cf20c25 100644
--- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt
+++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt
@@ -134,12 +134,14 @@ fun EnvironmentMetricsChart(
/* Pressure on its own layer/axis */
if (shouldPlot[Environment.BAROMETRIC_PRESSURE.ordinal]) {
lineSeries {
+ val pressureData =
+ telemetries.filter {
+ val v = Environment.BAROMETRIC_PRESSURE.getValue(it)
+ v != null && !v.isNaN()
+ }
series(
- x =
- telemetries.mapNotNull { t ->
- Environment.BAROMETRIC_PRESSURE.getValue(t)?.let { t.time }
- },
- y = telemetries.mapNotNull { t -> Environment.BAROMETRIC_PRESSURE.getValue(t) },
+ x = pressureData.map { it.time },
+ y = pressureData.map { Environment.BAROMETRIC_PRESSURE.getValue(it)!! },
)
}
}
@@ -147,10 +149,12 @@ fun EnvironmentMetricsChart(
Environment.entries.forEach { metric ->
if (metric != Environment.BAROMETRIC_PRESSURE && shouldPlot[metric.ordinal]) {
lineSeries {
- series(
- x = telemetries.mapNotNull { t -> metric.getValue(t)?.let { t.time } },
- y = telemetries.mapNotNull { t -> metric.getValue(t) },
- )
+ val metricData =
+ telemetries.filter {
+ val v = metric.getValue(it)
+ v != null && !v.isNaN()
+ }
+ series(x = metricData.map { it.time }, y = metricData.map { metric.getValue(it)!! })
}
}
}
diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt
index e82df3f07..717a1dd5e 100644
--- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt
+++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt
@@ -253,15 +253,17 @@ private fun PowerMetricsChart(
LaunchedEffect(telemetries, selectedChannel) {
modelProducer.runTransaction {
lineSeries {
+ val currentData = telemetries.filter { !retrieveCurrent(selectedChannel, it).isNaN() }
series(
- x = telemetries.map { it.time },
- y = telemetries.map { retrieveCurrent(selectedChannel, it) },
+ x = currentData.map { it.time },
+ y = currentData.map { retrieveCurrent(selectedChannel, it) },
)
}
lineSeries {
+ val voltageData = telemetries.filter { !retrieveVoltage(selectedChannel, it).isNaN() }
series(
- x = telemetries.map { it.time },
- y = telemetries.map { retrieveVoltage(selectedChannel, it) },
+ x = voltageData.map { it.time },
+ y = voltageData.map { retrieveVoltage(selectedChannel, it) },
)
}
}
diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt
index 96ebd08fc..eb46e6b57 100644
--- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt
+++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt
@@ -139,8 +139,14 @@ private fun SignalMetricsChart(
LaunchedEffect(meshPackets) {
modelProducer.runTransaction {
/* Use separate lineSeries calls to associate them with different vertical axes */
- lineSeries { series(x = meshPackets.map { it.rxTime }, y = meshPackets.map { it.rxRssi }) }
- lineSeries { series(x = meshPackets.map { it.rxTime }, y = meshPackets.map { it.rxSnr }) }
+ lineSeries {
+ val rssiData = meshPackets.filter { it.rxRssi != 0 && !it.rxRssi.toFloat().isNaN() }
+ series(x = rssiData.map { it.rxTime }, y = rssiData.map { it.rxRssi })
+ }
+ lineSeries {
+ val snrData = meshPackets.filter { !it.rxSnr.isNaN() }
+ series(x = snrData.map { it.rxTime }, y = snrData.map { it.rxSnr })
+ }
}
}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 9edbadb3e..9a7d63cd8 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -62,7 +62,12 @@ dependencyResolutionManagement {
mavenLocal()
google()
mavenCentral()
- maven { url = uri("https://jitpack.io") }
+ maven {
+ url = uri("https://jitpack.io")
+ content {
+ includeGroupByRegex("com\\.github\\..*")
+ }
+ }
}
}