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 809cd1e6..76fea7a1 100644 --- a/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt +++ b/app/src/main/java/com/bitchat/android/mesh/MessageHandler.kt @@ -88,12 +88,12 @@ class MessageHandler(private val myPeerID: String) { return } - // Create BitchatMessage - use local system time for incoming messages + // Create BitchatMessage - preserve source packet timestamp val message = BitchatMessage( id = privateMessage.messageID, sender = delegate?.getPeerNickname(peerID) ?: "Unknown", content = privateMessage.content, - timestamp = java.util.Date(), // Use local system time instead of packet timestamp + timestamp = java.util.Date(packet.timestamp.toLong()), isRelay = false, originalSender = null, isPrivate = true, @@ -343,7 +343,7 @@ class MessageHandler(private val myPeerID: String) { sender = delegate?.getPeerNickname(peerID) ?: "unknown", content = String(packet.payload, Charsets.UTF_8), senderPeerID = peerID, - timestamp = Date() + timestamp = Date(packet.timestamp.toLong()) ) delegate?.onMessageReceived(message) @@ -369,7 +369,7 @@ class MessageHandler(private val myPeerID: String) { sender = delegate?.getPeerNickname(peerID) ?: "unknown", content = String(packet.payload, Charsets.UTF_8), senderPeerID = peerID, - timestamp = Date() + timestamp = Date(packet.timestamp.toLong()) ) delegate?.onMessageReceived(message) diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrGeohashService.kt b/app/src/main/java/com/bitchat/android/nostr/NostrGeohashService.kt index 198dfcce..4f443c4b 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrGeohashService.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrGeohashService.kt @@ -680,7 +680,6 @@ class NostrGeohashService( private fun storeGeohashMessage(geohash: String, message: BitchatMessage) { val messages = geohashMessageHistory.getOrPut(geohash) { mutableListOf() } messages.add(message) - messages.sortBy { it.timestamp } // Limit message history to prevent memory issues if (messages.size > maxGeohashMessages) { @@ -1234,8 +1233,8 @@ class NostrGeohashService( val senderName = displayNameForNostrPubkeyUI(event.pubkey) val content = event.content - // Use local time instead of Nostr event time for consistent message ordering - val messageTimestamp = Date() + // Preserve Nostr event time to avoid reordering + val messageTimestamp = Date(event.createdAt.toLong() * 1000L) // Note: mentions parsing needs peer nicknames parameter // val mentions = messageManager.parseMentions(content, peerNicknames, nickname) diff --git a/app/src/main/java/com/bitchat/android/services/ConversationAliasResolver.kt b/app/src/main/java/com/bitchat/android/services/ConversationAliasResolver.kt index b8a91218..2c80d17e 100644 --- a/app/src/main/java/com/bitchat/android/services/ConversationAliasResolver.kt +++ b/app/src/main/java/com/bitchat/android/services/ConversationAliasResolver.kt @@ -60,7 +60,7 @@ object ConversationAliasResolver { } } if (didMerge) { - targetList.sortBy { it.timestamp } + // Preserve arrival order; do not sort by timestamp currentChats[targetPeerID] = targetList state.setPrivateChats(currentChats) diff --git a/app/src/main/java/com/bitchat/android/ui/MessageManager.kt b/app/src/main/java/com/bitchat/android/ui/MessageManager.kt index 9d8b3144..c1e58963 100644 --- a/app/src/main/java/com/bitchat/android/ui/MessageManager.kt +++ b/app/src/main/java/com/bitchat/android/ui/MessageManager.kt @@ -21,7 +21,6 @@ class MessageManager(private val state: ChatState) { fun addMessage(message: BitchatMessage) { val currentMessages = state.getMessagesValue().toMutableList() currentMessages.add(message) - currentMessages.sortBy { it.timestamp } state.setMessages(currentMessages) } @@ -39,7 +38,6 @@ class MessageManager(private val state: ChatState) { val channelMessageList = currentChannelMessages[channel]?.toMutableList() ?: mutableListOf() channelMessageList.add(message) - channelMessageList.sortBy { it.timestamp } currentChannelMessages[channel] = channelMessageList state.setChannelMessages(currentChannelMessages) @@ -83,7 +81,6 @@ class MessageManager(private val state: ChatState) { val chatMessages = currentPrivateChats[peerID]?.toMutableList() ?: mutableListOf() chatMessages.add(message) - chatMessages.sortBy { it.timestamp } currentPrivateChats[peerID] = chatMessages state.setPrivateChats(currentPrivateChats) @@ -103,7 +100,6 @@ class MessageManager(private val state: ChatState) { } val chatMessages = currentPrivateChats[peerID]?.toMutableList() ?: mutableListOf() chatMessages.add(message) - chatMessages.sortBy { it.timestamp } currentPrivateChats[peerID] = chatMessages state.setPrivateChats(currentPrivateChats) } diff --git a/app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt b/app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt index c0308a70..cf549d76 100644 --- a/app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt +++ b/app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt @@ -501,7 +501,6 @@ class PrivateChatManager( } if (didMerge) { - targetList.sortBy { it.timestamp } currentChats[targetPeerID] = targetList state.setPrivateChats(currentChats)