From f3997c55fd72adaec92f7ad4c390e0bcc80bd1bc Mon Sep 17 00:00:00 2001 From: James Rich Date: Wed, 3 Jun 2026 15:26:56 -0500 Subject: [PATCH] refactor(node): migrate to non-deprecated Vico chart APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vico 3.2.1 deprecated two APIs used in the node metrics charts: - lineSeries → lineModel (drop-in rename; the deprecated function just delegates to lineModel) - the rememberCartesianChart getXStep lambda now receives (model, minX, maxX); updated the BaseMetricChart callback to { model, _, _ -> ... } with unchanged logic Clears the deprecation warnings from the build log. No behavior change. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../meshtastic/feature/node/metrics/BaseMetricChart.kt | 2 +- .../org/meshtastic/feature/node/metrics/DeviceMetrics.kt | 6 +++--- .../meshtastic/feature/node/metrics/EnvironmentCharts.kt | 6 +++--- .../meshtastic/feature/node/metrics/HostMetricsChart.kt | 6 +++--- .../org/meshtastic/feature/node/metrics/PaxMetrics.kt | 4 ++-- .../org/meshtastic/feature/node/metrics/PowerMetrics.kt | 6 +++--- .../org/meshtastic/feature/node/metrics/SignalMetrics.kt | 8 ++++---- .../meshtastic/feature/node/metrics/TracerouteChart.kt | 8 ++++---- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/BaseMetricChart.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/BaseMetricChart.kt index a64e0e895f..7fc333da22 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/BaseMetricChart.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/BaseMetricChart.kt @@ -140,7 +140,7 @@ fun GenericMetricChart( // x-step, Vico computes the GCD of consecutive x-value differences which can // be as small as 1 second, making the chart logically enormous. A 60-second // floor keeps the internal slot count reasonable for any practical interval. - getXStep = { model -> maxOf(model.getXDeltaGcd(), MIN_X_STEP_SECONDS) }, + getXStep = { model, _, _ -> maxOf(model.getXDeltaGcd(), MIN_X_STEP_SECONDS) }, ), modelProducer = modelProducer, modifier = modifier, diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt index 86b2e3a45b..8aa1569bdf 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt @@ -50,7 +50,7 @@ import com.patrykandpatrick.vico.compose.cartesian.VicoScrollState import com.patrykandpatrick.vico.compose.cartesian.axis.Axis import com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis import com.patrykandpatrick.vico.compose.cartesian.data.CartesianLayerRangeProvider -import com.patrykandpatrick.vico.compose.cartesian.data.lineSeries +import com.patrykandpatrick.vico.compose.cartesian.data.lineModel import com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer import com.patrykandpatrick.vico.compose.cartesian.rememberVicoScrollState import org.jetbrains.compose.resources.stringResource @@ -274,7 +274,7 @@ private fun DeviceMetricsChart( modelProducer.runTransaction { /* Series for Left Axis (0-100%) */ if (leftLayerSeriesStyles.isNotEmpty()) { - lineSeries { + lineModel { if (batteryData.isNotEmpty()) { series( x = batteryData.map { it.time }, @@ -297,7 +297,7 @@ private fun DeviceMetricsChart( } /* Series for Right Axis (Voltage) */ if (voltageData.isNotEmpty()) { - lineSeries { + lineModel { series( x = voltageData.map { it.time }, y = voltageData.map { it.device_metrics?.voltage ?: 0f }, diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt index 0d10dcfd93..0e3ce50d00 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt @@ -32,7 +32,7 @@ import com.patrykandpatrick.vico.compose.cartesian.axis.Axis import com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis import com.patrykandpatrick.vico.compose.cartesian.data.CartesianChartModelProducer import com.patrykandpatrick.vico.compose.cartesian.data.CartesianLayerRangeProvider -import com.patrykandpatrick.vico.compose.cartesian.data.lineSeries +import com.patrykandpatrick.vico.compose.cartesian.data.lineModel import com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer import com.patrykandpatrick.vico.compose.cartesian.layer.rememberLineCartesianLayer import org.jetbrains.compose.resources.stringResource @@ -205,7 +205,7 @@ fun EnvironmentMetricsChart( modelProducer.runTransaction { /* Pressure on its own layer/axis */ if (showPressure && pressureData.isNotEmpty()) { - lineSeries { + lineModel { series( x = pressureData.map { it.time }, y = pressureData.map { Environment.BAROMETRIC_PRESSURE.getValue(it)!! }, @@ -216,7 +216,7 @@ fun EnvironmentMetricsChart( otherMetrics.forEach { metric -> val metricData = otherMetricsData[metric] ?: emptyList() if (metricData.isNotEmpty()) { - lineSeries { + lineModel { series(x = metricData.map { it.time }, y = metricData.map { metric.getValue(it)!! }) } } diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/HostMetricsChart.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/HostMetricsChart.kt index dcc91ad2a9..f8cfc219ae 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/HostMetricsChart.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/HostMetricsChart.kt @@ -27,7 +27,7 @@ import com.patrykandpatrick.vico.compose.cartesian.VicoScrollState import com.patrykandpatrick.vico.compose.cartesian.axis.Axis import com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis import com.patrykandpatrick.vico.compose.cartesian.data.CartesianLayerRangeProvider -import com.patrykandpatrick.vico.compose.cartesian.data.lineSeries +import com.patrykandpatrick.vico.compose.cartesian.data.lineModel import com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer import org.meshtastic.core.common.util.formatString import org.meshtastic.core.resources.Res @@ -155,7 +155,7 @@ internal fun HostMetricsChart( LaunchedEffect(chartData) { modelProducer.runTransaction { if (chartData.hasLoad) { - lineSeries { + lineModel { if (load1Data.isNotEmpty()) { series(x = load1Data.map { it.time }, y = load1Data.map { it.value }) } @@ -168,7 +168,7 @@ internal fun HostMetricsChart( } } if (memData.isNotEmpty()) { - lineSeries { series(x = memData.map { it.time }, y = memData.map { it.value }) } + lineModel { series(x = memData.map { it.time }, y = memData.map { it.value }) } } } } diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PaxMetrics.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PaxMetrics.kt index 492685b185..7a44405ab1 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PaxMetrics.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PaxMetrics.kt @@ -42,7 +42,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.patrykandpatrick.vico.compose.cartesian.VicoScrollState import com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis import com.patrykandpatrick.vico.compose.cartesian.data.CartesianLayerRangeProvider -import com.patrykandpatrick.vico.compose.cartesian.data.lineSeries +import com.patrykandpatrick.vico.compose.cartesian.data.lineModel import com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer import com.patrykandpatrick.vico.compose.cartesian.layer.rememberLineCartesianLayer import org.jetbrains.compose.resources.StringResource @@ -107,7 +107,7 @@ private fun PaxMetricsChart( LaunchedEffect(totalSeries, bleSeries, wifiSeries) { modelProducer.runTransaction { - lineSeries { + lineModel { series(x = bleSeries.map { it.first }, y = bleSeries.map { it.second }) series(x = wifiSeries.map { it.first }, y = wifiSeries.map { it.second }) series(x = totalSeries.map { it.first }, y = totalSeries.map { it.second }) diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt index 577a8b612d..006acf37e7 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt @@ -48,7 +48,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.patrykandpatrick.vico.compose.cartesian.VicoScrollState import com.patrykandpatrick.vico.compose.cartesian.axis.Axis import com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis -import com.patrykandpatrick.vico.compose.cartesian.data.lineSeries +import com.patrykandpatrick.vico.compose.cartesian.data.lineModel import com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer import org.jetbrains.compose.resources.StringResource import org.jetbrains.compose.resources.stringResource @@ -211,7 +211,7 @@ private fun PowerMetricsChart( LaunchedEffect(selectedChannel, currentData, voltageData) { modelProducer.runTransaction { if (currentData.isNotEmpty()) { - lineSeries { + lineModel { series( x = currentData.map { it.time }, y = currentData.map { retrieveCurrent(selectedChannel, it) }, @@ -219,7 +219,7 @@ private fun PowerMetricsChart( } } if (voltageData.isNotEmpty()) { - lineSeries { + lineModel { series( x = voltageData.map { it.time }, y = voltageData.map { retrieveVoltage(selectedChannel, it) }, diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt index b5f17d9765..fb43eba97f 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt @@ -44,7 +44,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.patrykandpatrick.vico.compose.cartesian.VicoScrollState import com.patrykandpatrick.vico.compose.cartesian.axis.Axis import com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis -import com.patrykandpatrick.vico.compose.cartesian.data.lineSeries +import com.patrykandpatrick.vico.compose.cartesian.data.lineModel import com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer import org.meshtastic.core.common.util.DateFormatter import org.meshtastic.core.common.util.MetricFormatter @@ -143,11 +143,11 @@ private fun SignalMetricsChart( LaunchedEffect(rssiData, snrData) { modelProducer.runTransaction { if (rssiData.isNotEmpty()) { - /* Use separate lineSeries calls to associate them with different vertical axes */ - lineSeries { series(x = rssiData.map { it.rx_time }, y = rssiData.map { it.rx_rssi }) } + /* Use separate lineModel calls to associate them with different vertical axes */ + lineModel { series(x = rssiData.map { it.rx_time }, y = rssiData.map { it.rx_rssi }) } } if (snrData.isNotEmpty()) { - lineSeries { series(x = snrData.map { it.rx_time }, y = snrData.map { it.rx_snr }) } + lineModel { series(x = snrData.map { it.rx_time }, y = snrData.map { it.rx_snr }) } } } } diff --git a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/TracerouteChart.kt b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/TracerouteChart.kt index 267b0dbe8f..fe5022f087 100644 --- a/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/TracerouteChart.kt +++ b/feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/TracerouteChart.kt @@ -27,7 +27,7 @@ import com.patrykandpatrick.vico.compose.cartesian.VicoScrollState import com.patrykandpatrick.vico.compose.cartesian.axis.Axis import com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis import com.patrykandpatrick.vico.compose.cartesian.data.CartesianLayerRangeProvider -import com.patrykandpatrick.vico.compose.cartesian.data.lineSeries +import com.patrykandpatrick.vico.compose.cartesian.data.lineModel import com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer import org.meshtastic.core.common.util.formatString import org.meshtastic.core.model.MeshLog @@ -157,15 +157,15 @@ internal fun TracerouteMetricsChart( LaunchedEffect(forwardData, returnData, rttData) { modelProducer.runTransaction { if (forwardData.isNotEmpty()) { - lineSeries { + lineModel { series(x = forwardData.map { it.timeSeconds }, y = forwardData.map { it.forwardHops!! }) } } if (returnData.isNotEmpty()) { - lineSeries { series(x = returnData.map { it.timeSeconds }, y = returnData.map { it.returnHops!! }) } + lineModel { series(x = returnData.map { it.timeSeconds }, y = returnData.map { it.returnHops!! }) } } if (rttData.isNotEmpty()) { - lineSeries { series(x = rttData.map { it.timeSeconds }, y = rttData.map { it.roundTripSeconds!! }) } + lineModel { series(x = rttData.map { it.timeSeconds }, y = rttData.map { it.roundTripSeconds!! }) } } } }