diff --git a/app/src/main/java/com/geeksville/mesh/ui/LastHeardInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/LastHeardInfo.kt new file mode 100644 index 000000000..4fe38330e --- /dev/null +++ b/app/src/main/java/com/geeksville/mesh/ui/LastHeardInfo.kt @@ -0,0 +1,49 @@ +package com.geeksville.mesh.ui + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.geeksville.mesh.R +import com.geeksville.mesh.ui.theme.AppTheme +import com.geeksville.mesh.util.formatAgo + +@Composable +fun LastHeardInfo( + lastHeard: Int +) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(2.dp) + ) { + Icon( + modifier = Modifier.height(18.dp), + imageVector = ImageVector.vectorResource(id = R.drawable.ic_antenna_24), + contentDescription = null, + tint = MaterialTheme.colors.onSurface, + ) + Text( + text = formatAgo(lastHeard), + color = MaterialTheme.colors.onSurface, + fontSize = MaterialTheme.typography.button.fontSize + ) + } +} + +@Composable +@Preview(showBackground = true) +@Preview(showBackground = true, uiMode = android.content.res.Configuration.UI_MODE_NIGHT_YES) +fun LastHeardInfoPreview() { + AppTheme { + LastHeardInfo((System.currentTimeMillis() / 1000).toInt() - 8600) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt index 396ff9f73..a573d2afa 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt @@ -27,7 +27,6 @@ import com.geeksville.mesh.databinding.AdapterNodeLayoutBinding import com.geeksville.mesh.databinding.NodelistFragmentBinding import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.ui.theme.AppTheme -import com.geeksville.mesh.util.formatAgo import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers @@ -55,12 +54,12 @@ class UsersFragment : ScreenFragment("Users"), Logging { val chipNode = itemView.chipNode val nodeNameView = itemView.nodeNameView val distanceView = itemView.distanceView - val lastTime = itemView.lastConnectionView val signalView = itemView.signalView val envMetrics = itemView.envMetrics val background = itemView.nodeCard val nodePosition = itemView.nodePosition val batteryInfo = itemView.batteryInfo + val lastHeard = itemView.lastHeardInfo fun blink() { val bg = background.backgroundTintList @@ -88,7 +87,8 @@ class UsersFragment : ScreenFragment("Users"), Logging { voltage: Float?, position: Position?, gpsFormat: Int, - nodeName: String? + nodeName: String?, + lastHeard: Int ) { batteryInfo.setContent { AppTheme { @@ -100,6 +100,11 @@ class UsersFragment : ScreenFragment("Users"), Logging { LinkedCoordinates(position, gpsFormat, nodeName) } } + this.lastHeard.setContent { + AppTheme { + LastHeardInfo(lastHeard) + } + } } } @@ -250,14 +255,15 @@ class UsersFragment : ScreenFragment("Users"), Logging { val isIgnored: Boolean = ignoreIncomingList.contains(n.num) val name = user?.longName - holder.bind(n.batteryLevel, n.voltage, n.validPosition, gpsFormat, name) + holder.bind(n.batteryLevel, n.voltage, n.validPosition, gpsFormat, name, n.lastHeard) + + holder.nodeNameView.text = name with(holder.chipNode) { text = (user?.shortName ?: "UNK").strikeIf(isIgnored) chipBackgroundColor = ColorStateList.valueOf(nodeColor) setTextColor(textColor) } - holder.nodeNameView.text = name val ourNodeInfo = nodes[0] val distance = ourNodeInfo.distanceStr(n, displayUnits) @@ -268,8 +274,6 @@ class UsersFragment : ScreenFragment("Users"), Logging { holder.distanceView.visibility = View.INVISIBLE } - holder.lastTime.text = formatAgo(n.lastHeard) - val envMetrics = n.envMetricStr(displayFahrenheit) if (envMetrics.isNotEmpty()) { holder.envMetrics.text = envMetrics diff --git a/app/src/main/res/layout/adapter_node_layout.xml b/app/src/main/res/layout/adapter_node_layout.xml index 9753c3c5f..15c15b4e5 100644 --- a/app/src/main/res/layout/adapter_node_layout.xml +++ b/app/src/main/res/layout/adapter_node_layout.xml @@ -47,9 +47,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@+id/chip_node" - app:layout_constraintEnd_toEndOf="@+id/chip_node" + app:layout_constraintBottom_toTopOf="@id/envMetrics" app:layout_constraintStart_toStartOf="@+id/chip_node" - android:layout_marginTop="8dp" + app:layout_constraintEnd_toEndOf="@+id/chip_node" + android:layout_marginVertical="8dp" + app:layout_constraintVertical_bias="0" tools:text="@string/sample_distance" /> @@ -73,36 +75,26 @@ tools:composableName="com.geeksville.mesh.ui.BatteryInfoKt.BatteryInfoPreviewSimple" /> - - - @@ -110,12 +102,12 @@ android:id="@+id/envMetrics" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="8dp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" tools:visibility="visible" + tools:background="@android:color/holo_red_light" />