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