feat: allow hiding offline and/or non-direct nodes from list and map (#2052)

Co-authored-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit is contained in:
Łukasz Kosson 2025-06-09 19:44:53 +02:00 committed by GitHub
parent 6becdf137b
commit e781d6774b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 211 additions and 16 deletions

View file

@ -28,6 +28,7 @@ import com.geeksville.mesh.database.entity.MyNodeEntity
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.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
@ -96,10 +97,14 @@ class NodeRepository @Inject constructor(
sort: NodeSortOption = NodeSortOption.LAST_HEARD,
filter: String = "",
includeUnknown: Boolean = true,
onlyOnline: Boolean = false,
onlyDirect: Boolean = false,
) = nodeInfoDao.getNodes(
sort = sort.sqlValue,
filter = filter,
includeUnknown = includeUnknown,
hopsAwayMax = if (onlyDirect) 0 else -1,
lastHeardMin = if (onlyOnline) onlineTimeThreshold() else -1,
).mapLatest { list ->
list.map {
it.toModel()

View file

@ -70,6 +70,8 @@ interface NodeInfoDao {
AND (:filter = ''
OR (long_name LIKE '%' || :filter || '%'
OR short_name LIKE '%' || :filter || '%'))
AND (:lastHeardMin = -1 OR last_heard >= :lastHeardMin)
AND (:hopsAwayMax = -1 OR (hops_away <= :hopsAwayMax AND hops_away >= 0) OR num = (SELECT myNodeNum FROM my_node LIMIT 1))
ORDER BY CASE
WHEN num = (SELECT myNodeNum FROM my_node LIMIT 1) THEN 0
ELSE 1
@ -105,6 +107,8 @@ interface NodeInfoDao {
sort: String,
filter: String,
includeUnknown: Boolean,
hopsAwayMax: Int,
lastHeardMin: Int,
): Flow<List<NodeWithRelations>>
@Upsert

View file

@ -33,6 +33,7 @@ import com.geeksville.mesh.Position
import com.geeksville.mesh.TelemetryProtos
import com.geeksville.mesh.copy
import com.geeksville.mesh.model.Node
import com.geeksville.mesh.util.onlineTimeThreshold
import com.google.protobuf.ByteString
data class NodeWithRelations(
@ -164,9 +165,7 @@ data class NodeEntity(
*/
val isOnline: Boolean
get() {
val now = System.currentTimeMillis() / 1000
val timeout = 2 * 60 * 60
return (now - lastHeard <= timeout)
return lastHeard > onlineTimeThreshold()
}
companion object {