diff --git a/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt b/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt index 85b3e154..3e91d6e4 100644 --- a/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt +++ b/app/src/main/java/com/bitchat/android/mesh/BluetoothMeshService.kt @@ -262,6 +262,10 @@ class BluetoothMeshService(private val context: Context) { return delegate?.decryptChannelMessage(encryptedContent, channel) } + override fun sendDeliveryAck(message: BitchatMessage, senderPeerID: String) { + this@BluetoothMeshService.sendDeliveryAck(message, senderPeerID) + } + // Callbacks override fun onMessageReceived(message: BitchatMessage) { delegate?.didReceiveMessage(message) @@ -520,6 +524,42 @@ class BluetoothMeshService(private val context: Context) { } } + /** + * Send delivery acknowledgment for a received private message + */ + fun sendDeliveryAck(message: BitchatMessage, senderPeerID: String) { + serviceScope.launch { + val nickname = delegate?.getNickname() ?: myPeerID + val ack = DeliveryAck( + originalMessageID = message.id, + recipientID = myPeerID, + recipientNickname = nickname, + hopCount = 0u // Will be calculated during relay + ) + + try { + val ackData = ack.encode() ?: return@launch + val encryptedPayload = securityManager.encryptForPeer(ackData, senderPeerID) + if (encryptedPayload != null) { + val packet = BitchatPacket( + type = MessageType.DELIVERY_ACK.value, + senderID = hexStringToByteArray(myPeerID), + recipientID = hexStringToByteArray(senderPeerID), + timestamp = System.currentTimeMillis().toULong(), + payload = encryptedPayload, + signature = null, + ttl = 3u + ) + + connectionManager.broadcastPacket(RoutedPacket(packet)) + } + + } catch (e: Exception) { + Log.e(TAG, "Failed to send delivery ACK: ${e.message}") + } + } + } + /** * Send broadcast announce */ diff --git a/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt b/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt index a96cc2ef..f65d9d59 100644 --- a/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt +++ b/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt @@ -281,7 +281,7 @@ class MessageHandler(private val myPeerID: String) { delegate?.onMessageReceived(message) // Send delivery ACK - sendDeliveryAck(message, peerID) + delegate?.sendDeliveryAck(message, peerID) } } catch (e: Exception) { @@ -394,42 +394,6 @@ class MessageHandler(private val myPeerID: String) { } } - /** - * Send delivery acknowledgment for a received private message - */ - private fun sendDeliveryAck(message: BitchatMessage, senderPeerID: String) { - handlerScope.launch { - val nickname = delegate?.getMyNickname() ?: myPeerID - val ack = DeliveryAck( - originalMessageID = message.id, - recipientID = myPeerID, - recipientNickname = nickname, - hopCount = 0u // Will be calculated during relay - ) - - try { - val ackData = ack.encode() ?: return@launch - val encryptedPayload = delegate?.encryptForPeer(ackData, senderPeerID) - if (encryptedPayload != null) { - val packet = BitchatPacket( - type = MessageType.DELIVERY_ACK.value, - senderID = hexStringToByteArray(myPeerID), - recipientID = hexStringToByteArray(senderPeerID), - timestamp = System.currentTimeMillis().toULong(), - payload = encryptedPayload, - signature = null, - ttl = 3u - ) - - delegate?.sendPacket(packet) - } - - } catch (e: Exception) { - Log.e(TAG, "Failed to send delivery ACK: ${e.message}") - } - } - } - /** * Get debug information */ @@ -580,6 +544,7 @@ interface MessageHandlerDelegate { // Message operations fun decryptChannelMessage(encryptedContent: ByteArray, channel: String): String? + fun sendDeliveryAck(message: BitchatMessage, senderPeerID: String) // Callbacks fun onMessageReceived(message: BitchatMessage)