diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt index db977f731..cdd63ff4b 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt @@ -46,6 +46,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewLightDark @@ -62,62 +63,36 @@ import java.text.DecimalFormat @OptIn(ExperimentalFoundationApi::class) @Composable -fun HostMetricsLogScreen( - metricsViewModel: MetricsViewModel = hiltViewModel(), -) { +fun HostMetricsLogScreen(metricsViewModel: MetricsViewModel = hiltViewModel()) { val state by metricsViewModel.state.collectAsStateWithLifecycle() val hostMetrics = state.hostMetrics - LazyColumn( - modifier = Modifier.fillMaxSize(), - contentPadding = PaddingValues(horizontal = 16.dp), - ) { - items(hostMetrics) { telemetry -> - HostMetricsItem( - telemetry = telemetry, - ) - } + LazyColumn(modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(horizontal = 16.dp)) { + items(hostMetrics) { telemetry -> HostMetricsItem(telemetry = telemetry) } } } -@Suppress("LongMethod") +@Suppress("LongMethod", "MagicNumber") @Composable -fun HostMetricsItem( - modifier: Modifier = Modifier, - telemetry: TelemetryProtos.Telemetry -) { +fun HostMetricsItem(modifier: Modifier = Modifier, telemetry: TelemetryProtos.Telemetry) { val hostMetrics = telemetry.hostMetrics val time = telemetry.time * CommonCharts.MS_PER_SEC Card( - modifier = modifier - .fillMaxWidth() - .padding(vertical = 4.dp) - .combinedClickable(onClick = { /* Handle click */ }), + modifier = modifier.fillMaxWidth().padding(vertical = 4.dp).combinedClickable(onClick = { /* Handle click */ }), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), ) { - Row( - modifier = Modifier.padding(16.dp) - ) { - Icon( - imageVector = Icons.Default.DataArray, - contentDescription = null, - modifier = Modifier.width(24.dp), - ) + Row(modifier = Modifier.padding(16.dp)) { + Icon(imageVector = Icons.Default.DataArray, contentDescription = null, modifier = Modifier.width(24.dp)) Spacer(modifier = Modifier.width(16.dp)) SelectionContainer { - - Column( - modifier = Modifier - .fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(8.dp), - ) { + Column(modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(8.dp)) { Text( modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.End, text = DATE_TIME_FORMAT.format(time), style = TextStyle(fontWeight = FontWeight.Bold), - fontSize = MaterialTheme.typography.labelLarge.fontSize + fontSize = MaterialTheme.typography.labelLarge.fontSize, ) LogLine( label = stringResource(R.string.uptime), @@ -130,72 +105,63 @@ fun HostMetricsItem( modifier = Modifier.fillMaxWidth(), ) LogLine( - label = stringResource(R.string.disk_free) + " 1", + label = stringResource(R.string.disk_free_indexed, 1), value = formatBytes(hostMetrics.diskfree1Bytes), modifier = Modifier.fillMaxWidth(), ) if (hostMetrics.hasDiskfree2Bytes()) { LogLine( - label = stringResource(R.string.disk_free) + " 2", + label = stringResource(R.string.disk_free_indexed, 2), value = formatBytes(hostMetrics.diskfree2Bytes), modifier = Modifier.fillMaxWidth(), ) } if (hostMetrics.hasDiskfree3Bytes()) { LogLine( - label = stringResource(R.string.disk_free) + " 3", + label = stringResource(R.string.disk_free_indexed, 3), value = formatBytes(hostMetrics.diskfree3Bytes), modifier = Modifier.fillMaxWidth(), ) } LogLine( - label = stringResource(R.string.load) + " 1", + label = stringResource(R.string.load_indexed, 1), value = (hostMetrics.load1 / 100.0).toString(), modifier = Modifier.fillMaxWidth(), ) LinearProgressIndicator( - progress = { hostMetrics.load1 / 100.0f }, - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 4.dp), + progress = { hostMetrics.load1 / 10000.0f }, + modifier = Modifier.fillMaxWidth().padding(bottom = 4.dp), color = ProgressIndicatorDefaults.linearColor, trackColor = ProgressIndicatorDefaults.linearTrackColor, strokeCap = ProgressIndicatorDefaults.LinearStrokeCap, ) LogLine( - label = stringResource(R.string.load) + " 5", + label = stringResource(R.string.load_indexed, 5), value = (hostMetrics.load5 / 100.0).toString(), modifier = Modifier.fillMaxWidth(), ) LinearProgressIndicator( - progress = { hostMetrics.load5 / 100.0f }, - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 4.dp), + progress = { hostMetrics.load5 / 10000.0f }, + modifier = Modifier.fillMaxWidth().padding(bottom = 4.dp), color = ProgressIndicatorDefaults.linearColor, trackColor = ProgressIndicatorDefaults.linearTrackColor, strokeCap = ProgressIndicatorDefaults.LinearStrokeCap, ) LogLine( - label = stringResource(R.string.load) + " 15", + label = stringResource(R.string.load_indexed, 15), value = (hostMetrics.load15 / 100.0).toString(), modifier = Modifier.fillMaxWidth(), ) LinearProgressIndicator( - progress = { hostMetrics.load15 / 100.0f }, - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 4.dp), + progress = { hostMetrics.load15 / 10000.0f }, + modifier = Modifier.fillMaxWidth().padding(bottom = 4.dp), color = ProgressIndicatorDefaults.linearColor, trackColor = ProgressIndicatorDefaults.linearTrackColor, strokeCap = ProgressIndicatorDefaults.LinearStrokeCap, ) if (hostMetrics.hasUserString()) { - LogLine( - label = stringResource(R.string.user_string), - value = hostMetrics.userString, - modifier = Modifier.fillMaxWidth(), - ) + Text(text = stringResource(R.string.user_string), style = MaterialTheme.typography.bodyMedium) + Text(text = hostMetrics.userString, style = TextStyle(fontFamily = FontFamily.Monospace)) } } } @@ -204,23 +170,14 @@ fun HostMetricsItem( } @Composable -fun LogLine( - modifier: Modifier = Modifier, - label: String, - value: String, -) { +fun LogLine(modifier: Modifier = Modifier, label: String, value: String) { Row( - modifier = modifier - .fillMaxWidth(), + modifier = modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween + horizontalArrangement = Arrangement.SpaceBetween, ) { - Text( - text = label, - ) - Text( - text = value, - ) + Text(text = label) + Text(text = value) } } @@ -229,11 +186,12 @@ const val BYTES_IN_MB = BYTES_IN_KB * 1024.0 const val BYTES_IN_GB = BYTES_IN_MB * 1024.0 fun formatBytes(bytes: Long, decimalPlaces: Int = 2): String { - val formatter = DecimalFormat().apply { - maximumFractionDigits = decimalPlaces - minimumFractionDigits = 0 - isGroupingUsed = false - } + val formatter = + DecimalFormat().apply { + maximumFractionDigits = decimalPlaces + minimumFractionDigits = 0 + isGroupingUsed = false + } return when { bytes < 0 -> "N/A" // Handle negative bytes gracefully bytes == 0L -> "0 B" @@ -248,22 +206,22 @@ fun formatBytes(bytes: Long, decimalPlaces: Int = 2): String { @PreviewLightDark @Composable private fun HostMetricsItemPreview() { - val hostMetrics = TelemetryProtos.HostMetrics.newBuilder() - .setUptimeSeconds(3600) - .setFreememBytes(2048000) - .setDiskfree1Bytes(104857600) - .setDiskfree2Bytes(2097915200) - .setDiskfree3Bytes(44444) - .setLoad1(30) - .setLoad5(75) - .setLoad15(19) - .setUserString("test") - .build() - val logs = TelemetryProtos.Telemetry.newBuilder() - .setTime((System.currentTimeMillis() / 1000L).toInt()) - .setHostMetrics(hostMetrics) - .build() - AppTheme { - HostMetricsItem(telemetry = logs) - } + val hostMetrics = + TelemetryProtos.HostMetrics.newBuilder() + .setUptimeSeconds(3600) + .setFreememBytes(2048000) + .setDiskfree1Bytes(104857600) + .setDiskfree2Bytes(2097915200) + .setDiskfree3Bytes(44444) + .setLoad1(30) + .setLoad5(75) + .setLoad15(19) + .setUserString("test") + .build() + val logs = + TelemetryProtos.Telemetry.newBuilder() + .setTime((System.currentTimeMillis() / 1000L).toInt()) + .setHostMetrics(hostMetrics) + .build() + AppTheme { HostMetricsItem(telemetry = logs) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a7cd6b4cd..57e39f9cc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -583,6 +583,8 @@ Node Number User ID Uptime + Load %1$d + Disk Free %1$d Timestamp Heading Speed