diff --git a/app/src/main/java/com/geeksville/mesh/database/NodeRepository.kt b/app/src/main/java/com/geeksville/mesh/database/NodeRepository.kt index 50f4c699..436c0225 100644 --- a/app/src/main/java/com/geeksville/mesh/database/NodeRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/database/NodeRepository.kt @@ -29,6 +29,7 @@ import com.geeksville.mesh.database.entity.NodeEntity import com.geeksville.mesh.model.Node import com.geeksville.mesh.model.NodeSortOption import com.geeksville.mesh.util.onlineTimeThreshold +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -133,4 +134,12 @@ class NodeRepository @Inject constructor( suspend fun insertMetadata(metadata: MetadataEntity) = withContext(dispatchers.io) { nodeInfoDao.upsert(metadata) } + + val onlineNodeCount: Flow = nodeInfoDao.nodeDBbyNum().mapLatest { map -> + map.values.count { it.node.lastHeard > onlineTimeThreshold() } + }.flowOn(dispatchers.io).conflate() + + val totalNodeCount: Flow = nodeInfoDao.nodeDBbyNum().mapLatest { map -> + map.values.count() + }.flowOn(dispatchers.io).conflate() } diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 4066d808..619a068c 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -403,6 +403,18 @@ class UIViewModel @Inject constructor( initialValue = emptyList(), ) + val onlineNodeCount = nodeDB.onlineNodeCount.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = 0, + ) + + val totalNodeCount = nodeDB.totalNodeCount.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = 0, + ) + val filteredNodeList: StateFlow> = nodeList.mapLatest { list -> list.filter { node -> !node.isIgnored diff --git a/app/src/main/java/com/geeksville/mesh/ui/Main.kt b/app/src/main/java/com/geeksville/mesh/ui/Main.kt index 38f3fec8..f5a6dcb6 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/Main.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/Main.kt @@ -376,10 +376,15 @@ private fun MainAppBar( return } val title by viewModel.title.collectAsStateWithLifecycle("") + val onlineNodeCount by viewModel.onlineNodeCount.collectAsStateWithLifecycle(0) + val totalNodeCount by viewModel.totalNodeCount.collectAsStateWithLifecycle(0) TopAppBar( title = { val title = when { - currentDestination == null || isTopLevelRoute -> stringResource(id = R.string.app_name) + currentDestination == null -> stringResource(id = R.string.app_name) + + currentDestination.hasRoute() -> stringResource(id = R.string.app_name) + + " ($onlineNodeCount/$totalNodeCount)" currentDestination.hasRoute() -> stringResource(id = R.string.debug_panel)