Commit efce1574 authored by Filipe de Lima Brito's avatar Filipe de Lima Brito

Favorite/pinned messages aren't shown as the messages on the chatroom are.

parent 576b2a20
...@@ -74,12 +74,18 @@ class ViewModelMapper @Inject constructor( ...@@ -74,12 +74,18 @@ class ViewModelMapper @Inject constructor(
suspend fun map( suspend fun map(
messages: List<Message>, messages: List<Message>,
roomViewModel: RoomViewModel = RoomViewModel(roles = emptyList(), isBroadcast = true) roomViewModel: RoomViewModel = RoomViewModel(roles = emptyList(), isBroadcast = true),
asNotReversed: Boolean = false
): List<BaseViewModel<*>> = ): List<BaseViewModel<*>> =
withContext(CommonPool) { withContext(CommonPool) {
val list = ArrayList<BaseViewModel<*>>(messages.size) val list = ArrayList<BaseViewModel<*>>(messages.size)
messages.forEach { list.addAll(translate(it, roomViewModel)) } messages.forEach {
list.addAll(
if (asNotReversed) translateAsNotReversed(it, roomViewModel)
else translate(it, roomViewModel)
)
}
return@withContext list return@withContext list
} }
...@@ -123,6 +129,56 @@ class ViewModelMapper @Inject constructor( ...@@ -123,6 +129,56 @@ class ViewModelMapper @Inject constructor(
return@withContext list return@withContext list
} }
private suspend fun translateAsNotReversed(
message: Message,
roomViewModel: RoomViewModel
): List<BaseViewModel<*>> =
withContext(CommonPool) {
val list = ArrayList<BaseViewModel<*>>()
mapMessage(message).let {
if (list.isNotEmpty()) {
it.preview = list.first().preview
}
list.add(it)
}
message.attachments?.forEach {
val attachment = mapAttachment(message, it)
attachment?.let {
list.add(attachment)
}
}
message.urls?.forEach {
val url = mapUrl(message, it)
url?.let {
list.add(url)
}
}
for (i in list.size - 1 downTo 0) {
val next = if (i - 1 < 0) null else list[i - 1]
list[i].nextDownStreamMessage = next
}
if (isBroadcastReplyAvailable(roomViewModel, message)) {
roomsInteractor.getById(currentServer, message.roomId)?.let { chatRoom ->
val replyViewModel = mapMessageReply(message, chatRoom)
list.first().nextDownStreamMessage = replyViewModel
list.add(0, replyViewModel)
}
}
list.dropLast(1).forEach {
it.reactions = emptyList()
}
list.last().reactions = getReactions(message)
list.last().nextDownStreamMessage = null
return@withContext list
}
private fun isBroadcastReplyAvailable(roomViewModel: RoomViewModel, message: Message): Boolean { private fun isBroadcastReplyAvailable(roomViewModel: RoomViewModel, message: Message): Boolean {
val senderUsername = message.sender?.username val senderUsername = message.sender?.username
return roomViewModel.isRoom && roomViewModel.isBroadcast && return roomViewModel.isRoom && roomViewModel.isBroadcast &&
......
...@@ -35,7 +35,7 @@ class FavoriteMessagesPresenter @Inject constructor( ...@@ -35,7 +35,7 @@ class FavoriteMessagesPresenter @Inject constructor(
view.showLoading() view.showLoading()
roomsInteractor.getById(serverUrl, roomId)?.let { roomsInteractor.getById(serverUrl, roomId)?.let {
val favoriteMessages = client.getFavoriteMessages(roomId, it.type, offset) val favoriteMessages = client.getFavoriteMessages(roomId, it.type, offset)
val messageList = mapper.map(favoriteMessages.result) val messageList = mapper.map(favoriteMessages.result, asNotReversed = true)
view.showFavoriteMessages(messageList) view.showFavoriteMessages(messageList)
offset += 1 * 30 offset += 1 * 30
}.ifNull { }.ifNull {
......
...@@ -69,8 +69,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView { ...@@ -69,8 +69,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView {
adapter = ChatRoomAdapter(enableActions = false) adapter = ChatRoomAdapter(enableActions = false)
recycler_view.adapter = adapter recycler_view.adapter = adapter
val linearLayoutManager = val linearLayoutManager =
LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true) LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
linearLayoutManager.stackFromEnd = true
recycler_view.layoutManager = linearLayoutManager recycler_view.layoutManager = linearLayoutManager
recycler_view.itemAnimator = DefaultItemAnimator() recycler_view.itemAnimator = DefaultItemAnimator()
if (favoriteMessages.size >= 30) { if (favoriteMessages.size >= 30) {
......
...@@ -36,7 +36,7 @@ class PinnedMessagesPresenter @Inject constructor( ...@@ -36,7 +36,7 @@ class PinnedMessagesPresenter @Inject constructor(
view.showLoading() view.showLoading()
roomsInteractor.getById(serverUrl, roomId)?.let { roomsInteractor.getById(serverUrl, roomId)?.let {
val pinnedMessages = client.getPinnedMessages(roomId, it.type, offset) val pinnedMessages = client.getPinnedMessages(roomId, it.type, offset)
val messageList = mapper.map(pinnedMessages.result) val messageList = mapper.map(pinnedMessages.result, asNotReversed = true)
view.showPinnedMessages(messageList) view.showPinnedMessages(messageList)
offset += 1 * 30 offset += 1 * 30
}.ifNull { }.ifNull {
......
...@@ -71,8 +71,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView { ...@@ -71,8 +71,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
adapter = ChatRoomAdapter(enableActions = false) adapter = ChatRoomAdapter(enableActions = false)
recycler_view_pinned.adapter = adapter recycler_view_pinned.adapter = adapter
val linearLayoutManager = val linearLayoutManager =
LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true) LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
linearLayoutManager.stackFromEnd = true
recycler_view_pinned.layoutManager = linearLayoutManager recycler_view_pinned.layoutManager = linearLayoutManager
recycler_view_pinned.itemAnimator = DefaultItemAnimator() recycler_view_pinned.itemAnimator = DefaultItemAnimator()
if (pinnedMessages.size >= 30) { if (pinnedMessages.size >= 30) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment