Remove only pending messages instead of reloading the whole history when sending pending messages
This commit is contained in:
parent
5fc3f7d0cf
commit
b20fded45b
|
@ -44,16 +44,16 @@ class ChatActivity : ServiceBoundActivity() {
|
||||||
override fun onConnectFailed(ip: String, errorMsg: String?) {}
|
override fun onConnectFailed(ip: String, errorMsg: String?) {}
|
||||||
override fun onNewSession(sessionId: Int, ip: String) {
|
override fun onNewSession(sessionId: Int, ip: String) {
|
||||||
if (this@ChatActivity.sessionId == sessionId) {
|
if (this@ChatActivity.sessionId == sessionId) {
|
||||||
|
val contact = airaService.contacts[sessionId]
|
||||||
|
val hasPendingMsg = airaService.pendingMsgs[sessionId]?.size ?: 0 > 0
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
val contact = airaService.contacts[sessionId]
|
|
||||||
if (contact == null) {
|
if (contact == null) {
|
||||||
binding.bottomPanel.visibility = View.VISIBLE
|
binding.bottomPanel.visibility = View.VISIBLE
|
||||||
} else {
|
} else {
|
||||||
binding.offlineWarning.visibility = View.GONE
|
binding.offlineWarning.visibility = View.GONE
|
||||||
if (airaService.pendingMsgs[sessionId]!!.size > 0) {
|
if (hasPendingMsg) {
|
||||||
binding.sendingPendingMsgsIndicator.visibility = View.VISIBLE
|
binding.sendingPendingMsgsIndicator.visibility = View.VISIBLE
|
||||||
//remove pending messages
|
chatAdapter.removePendingMessages()
|
||||||
reloadHistory(contact)
|
|
||||||
scrollToBottom()
|
scrollToBottom()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,7 +213,16 @@ class ChatActivity : ServiceBoundActivity() {
|
||||||
binding.toolbar.avatar.setImageAvatar(image)
|
binding.toolbar.avatar.setImageAvatar(image)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
reloadHistory(contact)
|
chatAdapter.clear()
|
||||||
|
lastLoadedMessageOffset = 0
|
||||||
|
if (contact != null) {
|
||||||
|
loadMsgs(contact.uuid)
|
||||||
|
}
|
||||||
|
airaService.savedMsgs[sessionId]?.let {
|
||||||
|
for (msg in it.asReversed()) {
|
||||||
|
chatAdapter.newLoadedMessage(ChatItem(msg.outgoing, msg.timestamp, msg.data))
|
||||||
|
}
|
||||||
|
}
|
||||||
airaService.pendingMsgs[sessionId]?.let {
|
airaService.pendingMsgs[sessionId]?.let {
|
||||||
for (msg in it) {
|
for (msg in it) {
|
||||||
if (msg[0] == Protocol.MESSAGE ||msg[0] == Protocol.FILE) {
|
if (msg[0] == Protocol.MESSAGE ||msg[0] == Protocol.FILE) {
|
||||||
|
@ -289,19 +298,6 @@ class ChatActivity : ServiceBoundActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun reloadHistory(contact: Contact?) {
|
|
||||||
chatAdapter.clear()
|
|
||||||
lastLoadedMessageOffset = 0
|
|
||||||
if (contact != null) {
|
|
||||||
loadMsgs(contact.uuid)
|
|
||||||
}
|
|
||||||
airaService.savedMsgs[sessionId]?.let {
|
|
||||||
for (msg in it.asReversed()) {
|
|
||||||
chatAdapter.newLoadedMessage(ChatItem(msg.outgoing, msg.timestamp, msg.data))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun scrollToBottom() {
|
private fun scrollToBottom() {
|
||||||
binding.recyclerChat.smoothScrollToPosition(chatAdapter.itemCount-1)
|
binding.recyclerChat.smoothScrollToPosition(chatAdapter.itemCount-1)
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,14 @@ class ChatAdapter(
|
||||||
notifyItemChanged(1)
|
notifyItemChanged(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun removePendingMessages() {
|
||||||
|
val oldSize = chatItems.size
|
||||||
|
chatItems.removeAll {
|
||||||
|
it.timestamp == 0L
|
||||||
|
}
|
||||||
|
notifyItemRangeRemoved(chatItems.size, oldSize-chatItems.size)
|
||||||
|
}
|
||||||
|
|
||||||
fun clear() {
|
fun clear() {
|
||||||
chatItems.clear()
|
chatItems.clear()
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
|
|
Loading…
Reference in New Issue