From faf9f7b0e1639323ba9ee51a69b2eb1b5edc5bef Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Fri, 13 Jun 2025 04:34:15 -0700 Subject: [PATCH] Added connection indicator (#2073) Co-authored-by: James Rich <2199651+jamesarich@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../mesh/ui/node/components/NodeItem.kt | 3 +- .../ui/node/components/NodeStatusIcons.kt | 45 ++++++++++++++++++- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt index 9b243b18f..a590cf068 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt @@ -148,7 +148,8 @@ fun NodeItem( NodeStatusIcons( isThisNode = isThisNode, isFavorite = isFavorite, - isUnmessageable = unmessageable + isUnmessageable = unmessageable, + isConnected = isConnected ) } Row( diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt index d46176fa6..e9ba7aedf 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt @@ -23,6 +23,8 @@ import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.NoCell import androidx.compose.material.icons.rounded.Star +import androidx.compose.material.icons.twotone.CloudOff +import androidx.compose.material.icons.twotone.CloudDone import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -40,16 +42,55 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.geeksville.mesh.R +@Suppress("LongMethod") @OptIn(ExperimentalMaterial3Api::class) @Composable fun NodeStatusIcons( isThisNode: Boolean, isUnmessageable: Boolean, isFavorite: Boolean, + isConnected: Boolean ) { Row( modifier = Modifier.padding(4.dp) ) { + if (isThisNode) { + TooltipBox( + positionProvider = TooltipDefaults.rememberTooltipPositionProvider(), + tooltip = { + PlainTooltip { + Text( + stringResource( + if (isConnected) { + R.string.connected + } else { + R.string.disconnected + } + ) + ) + } + }, + state = rememberTooltipState() + ) { + if (isConnected) { + @Suppress("MagicNumber") + Icon( + imageVector = Icons.TwoTone.CloudDone, + contentDescription = stringResource(R.string.connected), + modifier = Modifier.size(24.dp), // Smaller size for badge + tint = Color(0xFF4CAF50) + ) + } else { + Icon( + imageVector = Icons.TwoTone.CloudOff, + contentDescription = stringResource(R.string.not_connected), + modifier = Modifier.size(24.dp), // Smaller size for badge + tint = MaterialTheme.colorScheme.error + ) + } + } + } + if (isUnmessageable) { TooltipBox( positionProvider = TooltipDefaults.rememberTooltipPositionProvider(), @@ -70,7 +111,6 @@ fun NodeStatusIcons( contentDescription = stringResource(R.string.unmessageable), modifier = Modifier .size(24.dp), // Smaller size for badge - tint = MaterialTheme.colorScheme.error, ) } } @@ -107,8 +147,9 @@ fun NodeStatusIcons( @Composable fun StatusIconsPreview() { NodeStatusIcons( - isThisNode = false, + isThisNode = true, isUnmessageable = true, isFavorite = true, + isConnected = true, ) }