From 828696aca74463935bd09e70a6b859cc323ec847 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 9 Apr 2024 05:18:38 -0500 Subject: [PATCH] Add option to delete single node from nodeDB (#958) --- .../main/aidl/com/geeksville/mesh/IMeshService.aidl | 3 +++ .../com/geeksville/mesh/database/dao/NodeInfoDao.kt | 3 +++ app/src/main/java/com/geeksville/mesh/model/NodeDB.kt | 3 +++ .../main/java/com/geeksville/mesh/model/UIState.kt | 11 +++++++++++ .../java/com/geeksville/mesh/service/MeshService.kt | 6 ++++++ .../main/java/com/geeksville/mesh/ui/UsersFragment.kt | 8 ++++++++ app/src/main/res/menu/menu_nodes.xml | 4 ++++ app/src/main/res/values/strings.xml | 1 + 8 files changed, 39 insertions(+) diff --git a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl index a668eeebf..62ce4fb91 100644 --- a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl +++ b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl @@ -115,6 +115,9 @@ interface IMeshService { /// Send commitEditSettings admin packet to nodeNum void commitEditSettings(); + /// delete a specific nodeNum from nodeDB + void removeByNodenum(in int requestID, in int nodeNum); + /// Send position packet with wantResponse to nodeNum void requestPosition(in int destNum, in Position position); diff --git a/app/src/main/java/com/geeksville/mesh/database/dao/NodeInfoDao.kt b/app/src/main/java/com/geeksville/mesh/database/dao/NodeInfoDao.kt index 01ca864a4..dc0f73993 100644 --- a/app/src/main/java/com/geeksville/mesh/database/dao/NodeInfoDao.kt +++ b/app/src/main/java/com/geeksville/mesh/database/dao/NodeInfoDao.kt @@ -43,6 +43,9 @@ interface NodeInfoDao { @Query("DELETE FROM NodeInfo") fun clearNodeInfo() + @Query("DELETE FROM NodeInfo WHERE num=:num") + fun delNode(num: Int) + @Query("SELECT * FROM NodeInfo WHERE num=:num") fun getNodeInfo(num: Int): NodeInfo? diff --git a/app/src/main/java/com/geeksville/mesh/model/NodeDB.kt b/app/src/main/java/com/geeksville/mesh/model/NodeDB.kt index 5692b5dcb..b51490aa9 100644 --- a/app/src/main/java/com/geeksville/mesh/model/NodeDB.kt +++ b/app/src/main/java/com/geeksville/mesh/model/NodeDB.kt @@ -60,6 +60,9 @@ class NodeDB @Inject constructor( fun myNodeInfoFlow(): Flow = nodeInfoDao.getMyNodeInfo() fun nodeInfoFlow(): Flow> = nodeInfoDao.getNodes() + fun delNode(num: Int) { + nodeInfoDao.delNode(num) + } suspend fun upsert(node: NodeInfo) = withContext(Dispatchers.IO) { nodeInfoDao.upsert(node) } 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 de70953d8..35c805be2 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -284,6 +284,17 @@ class UIViewModel @Inject constructor( } } + fun forgetNode(nodeNum: Int) { + try { + val packetId = meshService?.packetId ?: return + meshService?.removeByNodenum(packetId, nodeNum) + viewModelScope.launch(Dispatchers.IO) { + nodeDB.delNode(nodeNum) + } + } catch (ex: RemoteException) { + errormsg("Request traceroute error: ${ex.message}") + } + } fun requestPosition(destNum: Int, position: Position = Position(0.0, 0.0, 0)) { try { meshService?.requestPosition(destNum, position) diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt index 3455b81d5..8a9bcd6b7 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -1878,7 +1878,13 @@ class MeshService : Service(), Logging { override fun stopProvideLocation() = toRemoteExceptions { stopLocationRequests() } + override fun removeByNodenum(requestId: Int, nodeNum: Int) = toRemoteExceptions { + sendToRadio(newMeshPacketTo(myNodeNum).buildAdminPacket { + removeByNodenum = nodeNum + }) + + } override fun requestPosition(destNum: Int, position: Position) = toRemoteExceptions { if (destNum != myNodeNum) { // request position 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 a2b43c04f..eb5775b00 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt @@ -139,6 +139,14 @@ class UsersFragment : ScreenFragment("Users"), Logging { R.id.traceroute -> { debug("requesting traceroute for '${user.longName}'") model.requestTraceroute(node.num) + } + R.id.forget_node -> { + debug("Forgetting node '${user.longName}'") + + model.forgetNode(node.num) + onNodesChanged(nodes) + + } R.id.ignore -> { val message = if (isIgnored) R.string.ignore_remove else R.string.ignore_add diff --git a/app/src/main/res/menu/menu_nodes.xml b/app/src/main/res/menu/menu_nodes.xml index 7cc6e40ae..227fdeb1e 100644 --- a/app/src/main/res/menu/menu_nodes.xml +++ b/app/src/main/res/menu/menu_nodes.xml @@ -10,6 +10,10 @@ android:id="@+id/request_position" android:title="@string/request_position" app:showAsAction="withText" /> + New waypoint Received waypoint: %s Duty Cycle limit reached. Cannot send messages right now, please try again later. + Forget Node