diff --git a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl
index 46d90f282..8b5010c86 100644
--- a/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl
+++ b/app/src/main/aidl/com/geeksville/mesh/IMeshService.aidl
@@ -66,6 +66,11 @@ interface IMeshService {
*/
void send(inout DataPacket packet);
+
+ void delete(int position);
+
+ void deleteAllMessages();
+
/**
Get the IDs of everyone on the mesh. You should also subscribe for NODE_CHANGE broadcasts.
*/
diff --git a/app/src/main/java/com/geeksville/mesh/model/MessagesState.kt b/app/src/main/java/com/geeksville/mesh/model/MessagesState.kt
index dd8828804..6e98fb5d4 100644
--- a/app/src/main/java/com/geeksville/mesh/model/MessagesState.kt
+++ b/app/src/main/java/com/geeksville/mesh/model/MessagesState.kt
@@ -46,6 +46,20 @@ class MessagesState(private val ui: UIViewModel) : Logging {
messages.value = messagesList
}
+ fun removeMessage(m: DataPacket) {
+ debug("Removing message from view id=${m.id}")
+
+ messagesList.remove(m)
+ messages.value = messagesList
+ }
+
+ private fun removeAllMessages() {
+ debug("Removing all messages")
+
+ messagesList.clear()
+ messages.value = messagesList
+ }
+
fun updateStatus(id: Int, status: MessageStatus) {
// Super inefficent but this is rare
debug("Handling message status change $id: $status")
@@ -80,4 +94,31 @@ class MessagesState(private val ui: UIViewModel) : Logging {
// FIXME - why is the first time we are called p is already in the list at this point?
addMessage(p)
}
+
+ fun deleteMessage(packet: DataPacket, position: Int) {
+ val service = ui.meshService
+
+ if (service != null) {
+ try {
+ service.delete(position)
+ } catch (ex: RemoteException) {
+ packet.errorMessage = "Error: ${ex.message}"
+ }
+ } else {
+ packet.errorMessage = "Error: No Mesh service"
+ }
+ removeMessage(packet)
+ }
+
+ fun deleteAllMessages() {
+ val service = ui.meshService
+ if (service != null) {
+ try {
+ service.deleteAllMessages()
+ } catch (ex: RemoteException) {
+
+ }
+ removeAllMessages()
+ }
+ }
}
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 a326ca8ec..1392734cb 100644
--- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
+++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
@@ -1018,10 +1018,10 @@ class MeshService : Service(), Logging {
else
broadcastSecs * 1000L
- if (prefs.locationShare == RadioConfigProtos.LocationSharing.LocDisabled) {
- info("GPS location sharing is disabled")
- desiredInterval = 0
- }
+ if (prefs.locationShare == RadioConfigProtos.LocationSharing.LocDisabled) {
+ info("GPS location sharing is disabled")
+ desiredInterval = 0
+ }
// if (prefs.fixedPosition) {
// info("Node has fixed position, therefore not overriding position")
@@ -1783,6 +1783,16 @@ class MeshService : Service(), Logging {
this@MeshService.setOwner(myId, longName, shortName)
}
+ override fun delete(position: Int) {
+ if (position >= 0) {
+ recentDataPackets.removeAt(position)
+ }
+ }
+
+ override fun deleteAllMessages() {
+ recentDataPackets.clear()
+ }
+
override fun send(p: DataPacket) {
toRemoteExceptions {
// Init from and id
diff --git a/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt
index 28db58802..bd0beefb4 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt
@@ -1,5 +1,6 @@
package com.geeksville.mesh.ui
+import android.app.AlertDialog
import android.graphics.Color
import android.os.Bundle
import android.text.InputType
@@ -48,7 +49,7 @@ class MessagesFragment : ScreenFragment("Messages"), Logging {
private val binding get() = _binding!!
private val model: UIViewModel by activityViewModels()
-
+
// Allows textMultiline with IME_ACTION_SEND
fun EditText.onActionSend(func: () -> Unit) {
setImeOptions(EditorInfo.IME_ACTION_SEND)
@@ -164,6 +165,27 @@ class MessagesFragment : ScreenFragment("Messages"), Logging {
// Set cardview offset and color.
val marginParams = holder.card.layoutParams as ViewGroup.MarginLayoutParams
val messageOffset = resources.getDimensionPixelOffset(R.dimen.message_offset)
+ holder.card.setOnLongClickListener {
+ val deleteMessageDialog = AlertDialog.Builder(context)
+ deleteMessageDialog.setMessage(R.string.delete_selected_message)
+ deleteMessageDialog.setPositiveButton(
+ R.string.delete
+ ) { _, _ ->
+ model.messagesState.deleteMessage((messages[position]), position)
+ }
+ deleteMessageDialog.setNeutralButton(
+ R.string.cancel
+ ) { _, _ ->
+ }
+ deleteMessageDialog.setNegativeButton(
+ R.string.delete_all_messages
+ ) { _, _ ->
+ model.messagesState.deleteAllMessages()
+ }
+ deleteMessageDialog.create()
+ deleteMessageDialog.show()
+ true
+ }
if (isMe) {
marginParams.leftMargin = messageOffset
marginParams.rightMargin = 0
@@ -244,7 +266,6 @@ class MessagesFragment : ScreenFragment("Messages"), Logging {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
-
binding.sendButton.setOnClickListener {
debug("sendButton click")
@@ -282,8 +303,8 @@ class MessagesFragment : ScreenFragment("Messages"), Logging {
binding.textInputLayout.isEnabled =
model.isConnected.value != MeshService.ConnectionState.DISCONNECTED
- // Just being connected is enough to allow sending texts I think
- // && model.nodeDB.myId.value != null && model.radioConfig.value != null
+ // Just being connected is enough to allow sending texts I think
+ // && model.nodeDB.myId.value != null && model.radioConfig.value != null
}
model.isConnected.observe(viewLifecycleOwner, Observer { _ ->
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0c7eefa92..41e99f78e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -120,4 +120,7 @@
We must be granted access to the camera to read QR codes. No pictures or videos will be saved.
Short Range / Slow
Medium Range / Slow
+ Delete selected message?
+ Delete
+ Delete All Messages
\ No newline at end of file