Commit 542d2bd3 authored by Lucio Maciel's avatar Lucio Maciel

Rename *ViewModel to *UiModel

parent 38fc3787
package chat.rocket.android.authentication.infraestructure
import chat.rocket.android.authentication.domain.model.TokenModel
import chat.rocket.android.util.DataToDomain
import chat.rocket.common.model.Token
object TokenMapper : DataToDomain<Token, TokenModel> {
override fun translate(data: Token): TokenModel {
return TokenModel(data.userId, data.authToken)
}
}
\ No newline at end of file
package chat.rocket.android.chatroom.adapter package chat.rocket.android.chatroom.adapter
import android.view.View import android.view.View
import chat.rocket.android.chatroom.viewmodel.AudioAttachmentViewModel import chat.rocket.android.chatroom.uimodel.AudioAttachmentUiModel
import chat.rocket.android.player.PlayerActivity import chat.rocket.android.player.PlayerActivity
import chat.rocket.android.util.extensions.setVisible import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
...@@ -10,7 +10,7 @@ import kotlinx.android.synthetic.main.message_attachment.view.* ...@@ -10,7 +10,7 @@ import kotlinx.android.synthetic.main.message_attachment.view.*
class AudioAttachmentViewHolder(itemView: View, class AudioAttachmentViewHolder(itemView: View,
listener: ActionsListener, listener: ActionsListener,
reactionListener: EmojiReactionListener? = null) reactionListener: EmojiReactionListener? = null)
: BaseViewHolder<AudioAttachmentViewModel>(itemView, listener, reactionListener) { : BaseViewHolder<AudioAttachmentUiModel>(itemView, listener, reactionListener) {
init { init {
with(itemView) { with(itemView) {
...@@ -20,7 +20,7 @@ class AudioAttachmentViewHolder(itemView: View, ...@@ -20,7 +20,7 @@ class AudioAttachmentViewHolder(itemView: View,
} }
} }
override fun bindViews(data: AudioAttachmentViewModel) { override fun bindViews(data: AudioAttachmentUiModel) {
with(itemView) { with(itemView) {
file_name.text = data.attachmentTitle file_name.text = data.attachmentTitle
audio_video_attachment.setOnClickListener { view -> audio_video_attachment.setOnClickListener { view ->
......
...@@ -5,7 +5,7 @@ import android.net.Uri ...@@ -5,7 +5,7 @@ import android.net.Uri
import android.view.View import android.view.View
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import chat.rocket.android.chatroom.viewmodel.AuthorAttachmentViewModel import chat.rocket.android.chatroom.uimodel.AuthorAttachmentUiModel
import chat.rocket.android.util.extensions.content import chat.rocket.android.util.extensions.content
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
...@@ -14,7 +14,7 @@ import kotlinx.android.synthetic.main.item_author_attachment.view.* ...@@ -14,7 +14,7 @@ import kotlinx.android.synthetic.main.item_author_attachment.view.*
class AuthorAttachmentViewHolder(itemView: View, class AuthorAttachmentViewHolder(itemView: View,
listener: ActionsListener, listener: ActionsListener,
reactionListener: EmojiReactionListener? = null) reactionListener: EmojiReactionListener? = null)
: BaseViewHolder<AuthorAttachmentViewModel>(itemView, listener, reactionListener) { : BaseViewHolder<AuthorAttachmentUiModel>(itemView, listener, reactionListener) {
init { init {
with(itemView) { with(itemView) {
...@@ -22,7 +22,7 @@ class AuthorAttachmentViewHolder(itemView: View, ...@@ -22,7 +22,7 @@ class AuthorAttachmentViewHolder(itemView: View,
} }
} }
override fun bindViews(data: AuthorAttachmentViewModel) { override fun bindViews(data: AuthorAttachmentUiModel) {
with(itemView) { with(itemView) {
data.icon?.let { icon -> data.icon?.let { icon ->
author_icon.isVisible = true author_icon.isVisible = true
......
...@@ -8,7 +8,7 @@ import androidx.core.view.children ...@@ -8,7 +8,7 @@ import androidx.core.view.children
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.ui.bottomsheet.BottomSheetMenu import chat.rocket.android.chatroom.ui.bottomsheet.BottomSheetMenu
import chat.rocket.android.chatroom.ui.bottomsheet.adapter.ActionListAdapter import chat.rocket.android.chatroom.ui.bottomsheet.adapter.ActionListAdapter
import chat.rocket.android.chatroom.viewmodel.BaseViewModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
import chat.rocket.android.widget.emoji.Emoji import chat.rocket.android.widget.emoji.Emoji
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
...@@ -18,7 +18,7 @@ import com.google.android.flexbox.FlexboxLayoutManager ...@@ -18,7 +18,7 @@ import com.google.android.flexbox.FlexboxLayoutManager
import ru.whalemare.sheetmenu.extension.inflate import ru.whalemare.sheetmenu.extension.inflate
import ru.whalemare.sheetmenu.extension.toList import ru.whalemare.sheetmenu.extension.toList
abstract class BaseViewHolder<T : BaseViewModel<*>>( abstract class BaseViewHolder<T : BaseUiModel<*>>(
itemView: View, itemView: View,
private val listener: ActionsListener, private val listener: ActionsListener,
var reactionListener: EmojiReactionListener? = null var reactionListener: EmojiReactionListener? = null
......
...@@ -5,7 +5,7 @@ import android.view.MenuItem ...@@ -5,7 +5,7 @@ import android.view.MenuItem
import android.view.ViewGroup import android.view.ViewGroup
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.presentation.ChatRoomPresenter import chat.rocket.android.chatroom.presentation.ChatRoomPresenter
import chat.rocket.android.chatroom.viewmodel.* import chat.rocket.android.chatroom.uimodel.*
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
...@@ -20,7 +20,7 @@ class ChatRoomAdapter( ...@@ -20,7 +20,7 @@ class ChatRoomAdapter(
private val enableActions: Boolean = true, private val enableActions: Boolean = true,
private val reactionListener: EmojiReactionListener? = null private val reactionListener: EmojiReactionListener? = null
) : RecyclerView.Adapter<BaseViewHolder<*>>() { ) : RecyclerView.Adapter<BaseViewHolder<*>>() {
private val dataSet = ArrayList<BaseViewModel<*>>() private val dataSet = ArrayList<BaseUiModel<*>>()
init { init {
setHasStableIds(true) setHasStableIds(true)
...@@ -28,43 +28,43 @@ class ChatRoomAdapter( ...@@ -28,43 +28,43 @@ class ChatRoomAdapter(
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<*> { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<*> {
return when (viewType.toViewType()) { return when (viewType.toViewType()) {
BaseViewModel.ViewType.MESSAGE -> { BaseUiModel.ViewType.MESSAGE -> {
val view = parent.inflate(R.layout.item_message) val view = parent.inflate(R.layout.item_message)
MessageViewHolder(view, actionsListener, reactionListener) MessageViewHolder(view, actionsListener, reactionListener)
} }
BaseViewModel.ViewType.IMAGE_ATTACHMENT -> { BaseUiModel.ViewType.IMAGE_ATTACHMENT -> {
val view = parent.inflate(R.layout.message_attachment) val view = parent.inflate(R.layout.message_attachment)
ImageAttachmentViewHolder(view, actionsListener, reactionListener) ImageAttachmentViewHolder(view, actionsListener, reactionListener)
} }
BaseViewModel.ViewType.AUDIO_ATTACHMENT -> { BaseUiModel.ViewType.AUDIO_ATTACHMENT -> {
val view = parent.inflate(R.layout.message_attachment) val view = parent.inflate(R.layout.message_attachment)
AudioAttachmentViewHolder(view, actionsListener, reactionListener) AudioAttachmentViewHolder(view, actionsListener, reactionListener)
} }
BaseViewModel.ViewType.VIDEO_ATTACHMENT -> { BaseUiModel.ViewType.VIDEO_ATTACHMENT -> {
val view = parent.inflate(R.layout.message_attachment) val view = parent.inflate(R.layout.message_attachment)
VideoAttachmentViewHolder(view, actionsListener, reactionListener) VideoAttachmentViewHolder(view, actionsListener, reactionListener)
} }
BaseViewModel.ViewType.URL_PREVIEW -> { BaseUiModel.ViewType.URL_PREVIEW -> {
val view = parent.inflate(R.layout.message_url_preview) val view = parent.inflate(R.layout.message_url_preview)
UrlPreviewViewHolder(view, actionsListener, reactionListener) UrlPreviewViewHolder(view, actionsListener, reactionListener)
} }
BaseViewModel.ViewType.MESSAGE_ATTACHMENT -> { BaseUiModel.ViewType.MESSAGE_ATTACHMENT -> {
val view = parent.inflate(R.layout.item_message_attachment) val view = parent.inflate(R.layout.item_message_attachment)
MessageAttachmentViewHolder(view, actionsListener, reactionListener) MessageAttachmentViewHolder(view, actionsListener, reactionListener)
} }
BaseViewModel.ViewType.AUTHOR_ATTACHMENT -> { BaseUiModel.ViewType.AUTHOR_ATTACHMENT -> {
val view = parent.inflate(R.layout.item_author_attachment) val view = parent.inflate(R.layout.item_author_attachment)
AuthorAttachmentViewHolder(view, actionsListener, reactionListener) AuthorAttachmentViewHolder(view, actionsListener, reactionListener)
} }
BaseViewModel.ViewType.COLOR_ATTACHMENT -> { BaseUiModel.ViewType.COLOR_ATTACHMENT -> {
val view = parent.inflate(R.layout.item_color_attachment) val view = parent.inflate(R.layout.item_color_attachment)
ColorAttachmentViewHolder(view, actionsListener, reactionListener) ColorAttachmentViewHolder(view, actionsListener, reactionListener)
} }
BaseViewModel.ViewType.GENERIC_FILE_ATTACHMENT -> { BaseUiModel.ViewType.GENERIC_FILE_ATTACHMENT -> {
val view = parent.inflate(R.layout.item_file_attachment) val view = parent.inflate(R.layout.item_file_attachment)
GenericFileAttachmentViewHolder(view, actionsListener, reactionListener) GenericFileAttachmentViewHolder(view, actionsListener, reactionListener)
} }
BaseViewModel.ViewType.MESSAGE_REPLY -> { BaseUiModel.ViewType.MESSAGE_REPLY -> {
val view = parent.inflate(R.layout.item_message_reply) val view = parent.inflate(R.layout.item_message_reply)
MessageReplyViewHolder(view, actionsListener, reactionListener) { roomName, permalink -> MessageReplyViewHolder(view, actionsListener, reactionListener) { roomName, permalink ->
presenter?.openDirectMessage(roomName, permalink) presenter?.openDirectMessage(roomName, permalink)
...@@ -104,45 +104,45 @@ class ChatRoomAdapter( ...@@ -104,45 +104,45 @@ class ChatRoomAdapter(
when (holder) { when (holder) {
is MessageViewHolder -> is MessageViewHolder ->
holder.bind(dataSet[position] as MessageViewModel) holder.bind(dataSet[position] as MessageUiModel)
is ImageAttachmentViewHolder -> is ImageAttachmentViewHolder ->
holder.bind(dataSet[position] as ImageAttachmentViewModel) holder.bind(dataSet[position] as ImageAttachmentUiModel)
is AudioAttachmentViewHolder -> is AudioAttachmentViewHolder ->
holder.bind(dataSet[position] as AudioAttachmentViewModel) holder.bind(dataSet[position] as AudioAttachmentUiModel)
is VideoAttachmentViewHolder -> is VideoAttachmentViewHolder ->
holder.bind(dataSet[position] as VideoAttachmentViewModel) holder.bind(dataSet[position] as VideoAttachmentUiModel)
is UrlPreviewViewHolder -> is UrlPreviewViewHolder ->
holder.bind(dataSet[position] as UrlPreviewViewModel) holder.bind(dataSet[position] as UrlPreviewUiModel)
is MessageAttachmentViewHolder -> is MessageAttachmentViewHolder ->
holder.bind(dataSet[position] as MessageAttachmentViewModel) holder.bind(dataSet[position] as MessageAttachmentUiModel)
is AuthorAttachmentViewHolder -> is AuthorAttachmentViewHolder ->
holder.bind(dataSet[position] as AuthorAttachmentViewModel) holder.bind(dataSet[position] as AuthorAttachmentUiModel)
is ColorAttachmentViewHolder -> is ColorAttachmentViewHolder ->
holder.bind(dataSet[position] as ColorAttachmentViewModel) holder.bind(dataSet[position] as ColorAttachmentUiModel)
is GenericFileAttachmentViewHolder -> is GenericFileAttachmentViewHolder ->
holder.bind(dataSet[position] as GenericFileAttachmentViewModel) holder.bind(dataSet[position] as GenericFileAttachmentUiModel)
is MessageReplyViewHolder -> is MessageReplyViewHolder ->
holder.bind(dataSet[position] as MessageReplyViewModel) holder.bind(dataSet[position] as MessageReplyUiModel)
} }
} }
override fun getItemId(position: Int): Long { override fun getItemId(position: Int): Long {
val model = dataSet[position] val model = dataSet[position]
return when (model) { return when (model) {
is MessageViewModel -> model.messageId.hashCode().toLong() is MessageUiModel -> model.messageId.hashCode().toLong()
is BaseFileAttachmentViewModel -> model.id is BaseFileAttachmentUiModel -> model.id
is AuthorAttachmentViewModel -> model.id is AuthorAttachmentUiModel -> model.id
else -> return position.toLong() else -> return position.toLong()
} }
} }
fun appendData(dataSet: List<BaseViewModel<*>>) { fun appendData(dataSet: List<BaseUiModel<*>>) {
val previousDataSetSize = this.dataSet.size val previousDataSetSize = this.dataSet.size
this.dataSet.addAll(dataSet) this.dataSet.addAll(dataSet)
notifyItemChanged(previousDataSetSize, dataSet.size) notifyItemChanged(previousDataSetSize, dataSet.size)
} }
fun prependData(dataSet: List<BaseViewModel<*>>) { fun prependData(dataSet: List<BaseUiModel<*>>) {
val item = dataSet.indexOfFirst { newItem -> val item = dataSet.indexOfFirst { newItem ->
this.dataSet.indexOfFirst { it.messageId == newItem.messageId && it.viewType == newItem.viewType } > -1 this.dataSet.indexOfFirst { it.messageId == newItem.messageId && it.viewType == newItem.viewType } > -1
} }
...@@ -162,7 +162,7 @@ class ChatRoomAdapter( ...@@ -162,7 +162,7 @@ class ChatRoomAdapter(
} }
} }
fun updateItem(message: BaseViewModel<*>) { fun updateItem(message: BaseUiModel<*>) {
val index = dataSet.indexOfLast { it.messageId == message.messageId } val index = dataSet.indexOfLast { it.messageId == message.messageId }
val indexOfNext = dataSet.indexOfFirst { it.messageId == message.messageId } val indexOfNext = dataSet.indexOfFirst { it.messageId == message.messageId }
Timber.d("index: $index") Timber.d("index: $index")
......
...@@ -5,7 +5,7 @@ import androidx.core.content.ContextCompat ...@@ -5,7 +5,7 @@ import androidx.core.content.ContextCompat
import android.text.method.LinkMovementMethod import android.text.method.LinkMovementMethod
import android.view.View import android.view.View
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.viewmodel.ColorAttachmentViewModel import chat.rocket.android.chatroom.uimodel.ColorAttachmentUiModel
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
import kotlinx.android.synthetic.main.item_color_attachment.view.* import kotlinx.android.synthetic.main.item_color_attachment.view.*
...@@ -13,7 +13,7 @@ import kotlinx.android.synthetic.main.item_color_attachment.view.* ...@@ -13,7 +13,7 @@ import kotlinx.android.synthetic.main.item_color_attachment.view.*
class ColorAttachmentViewHolder(itemView: View, class ColorAttachmentViewHolder(itemView: View,
listener: BaseViewHolder.ActionsListener, listener: BaseViewHolder.ActionsListener,
reactionListener: EmojiReactionListener? = null) reactionListener: EmojiReactionListener? = null)
: BaseViewHolder<ColorAttachmentViewModel>(itemView, listener, reactionListener) { : BaseViewHolder<ColorAttachmentUiModel>(itemView, listener, reactionListener) {
val drawable: Drawable? = ContextCompat.getDrawable(itemView.context, val drawable: Drawable? = ContextCompat.getDrawable(itemView.context,
R.drawable.quote_vertical_bar) R.drawable.quote_vertical_bar)
...@@ -25,7 +25,7 @@ class ColorAttachmentViewHolder(itemView: View, ...@@ -25,7 +25,7 @@ class ColorAttachmentViewHolder(itemView: View,
} }
} }
override fun bindViews(data: ColorAttachmentViewModel) { override fun bindViews(data: ColorAttachmentUiModel) {
with(itemView) { with(itemView) {
drawable?.let { drawable?.let {
quote_bar.background = drawable.mutate().apply { setTint(data.color) } quote_bar.background = drawable.mutate().apply { setTint(data.color) }
......
...@@ -6,7 +6,7 @@ import android.view.ViewGroup ...@@ -6,7 +6,7 @@ import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.adapter.CommandSuggestionsAdapter.CommandSuggestionsViewHolder import chat.rocket.android.chatroom.adapter.CommandSuggestionsAdapter.CommandSuggestionsViewHolder
import chat.rocket.android.chatroom.viewmodel.suggestion.CommandSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.CommandSuggestionUiModel
import chat.rocket.android.widget.autocompletion.model.SuggestionModel import chat.rocket.android.widget.autocompletion.model.SuggestionModel
import chat.rocket.android.widget.autocompletion.ui.BaseSuggestionViewHolder import chat.rocket.android.widget.autocompletion.ui.BaseSuggestionViewHolder
import chat.rocket.android.widget.autocompletion.ui.SuggestionsAdapter import chat.rocket.android.widget.autocompletion.ui.SuggestionsAdapter
...@@ -23,7 +23,7 @@ class CommandSuggestionsAdapter : SuggestionsAdapter<CommandSuggestionsViewHolde ...@@ -23,7 +23,7 @@ class CommandSuggestionsAdapter : SuggestionsAdapter<CommandSuggestionsViewHolde
class CommandSuggestionsViewHolder(view: View) : BaseSuggestionViewHolder(view) { class CommandSuggestionsViewHolder(view: View) : BaseSuggestionViewHolder(view) {
override fun bind(item: SuggestionModel, itemClickListener: SuggestionsAdapter.ItemClickListener?) { override fun bind(item: SuggestionModel, itemClickListener: SuggestionsAdapter.ItemClickListener?) {
item as CommandSuggestionViewModel item as CommandSuggestionUiModel
with(itemView) { with(itemView) {
val nameTextView = itemView.findViewById<TextView>(R.id.text_command_name) val nameTextView = itemView.findViewById<TextView>(R.id.text_command_name)
val descriptionTextView = itemView.findViewById<TextView>(R.id.text_command_description) val descriptionTextView = itemView.findViewById<TextView>(R.id.text_command_description)
......
package chat.rocket.android.chatroom.adapter package chat.rocket.android.chatroom.adapter
import android.content.Intent import android.content.Intent
import android.net.Uri
import android.view.View import android.view.View
import androidx.core.net.toUri import androidx.core.net.toUri
import chat.rocket.android.chatroom.viewmodel.GenericFileAttachmentViewModel import chat.rocket.android.chatroom.uimodel.GenericFileAttachmentUiModel
import chat.rocket.android.util.extensions.content import chat.rocket.android.util.extensions.content
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
import chat.rocket.common.util.ifNull
import kotlinx.android.synthetic.main.item_file_attachment.view.* import kotlinx.android.synthetic.main.item_file_attachment.view.*
class GenericFileAttachmentViewHolder(itemView: View, class GenericFileAttachmentViewHolder(itemView: View,
listener: ActionsListener, listener: ActionsListener,
reactionListener: EmojiReactionListener? = null) reactionListener: EmojiReactionListener? = null)
: BaseViewHolder<GenericFileAttachmentViewModel>(itemView, listener, reactionListener) { : BaseViewHolder<GenericFileAttachmentUiModel>(itemView, listener, reactionListener) {
init { init {
with(itemView) { with(itemView) {
...@@ -21,7 +19,7 @@ class GenericFileAttachmentViewHolder(itemView: View, ...@@ -21,7 +19,7 @@ class GenericFileAttachmentViewHolder(itemView: View,
} }
} }
override fun bindViews(data: GenericFileAttachmentViewModel) { override fun bindViews(data: GenericFileAttachmentUiModel) {
with(itemView) { with(itemView) {
text_file_name.content = data.attachmentTitle text_file_name.content = data.attachmentTitle
......
package chat.rocket.android.chatroom.adapter package chat.rocket.android.chatroom.adapter
import android.view.View import android.view.View
import chat.rocket.android.chatroom.viewmodel.ImageAttachmentViewModel import chat.rocket.android.chatroom.uimodel.ImageAttachmentUiModel
import chat.rocket.android.helper.ImageHelper import chat.rocket.android.helper.ImageHelper
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.drawee.backends.pipeline.Fresco
...@@ -11,7 +11,7 @@ class ImageAttachmentViewHolder( ...@@ -11,7 +11,7 @@ class ImageAttachmentViewHolder(
itemView: View, itemView: View,
listener: ActionsListener, listener: ActionsListener,
reactionListener: EmojiReactionListener? = null reactionListener: EmojiReactionListener? = null
) : BaseViewHolder<ImageAttachmentViewModel>(itemView, listener, reactionListener) { ) : BaseViewHolder<ImageAttachmentUiModel>(itemView, listener, reactionListener) {
init { init {
with(itemView) { with(itemView) {
...@@ -19,7 +19,7 @@ class ImageAttachmentViewHolder( ...@@ -19,7 +19,7 @@ class ImageAttachmentViewHolder(
} }
} }
override fun bindViews(data: ImageAttachmentViewModel) { override fun bindViews(data: ImageAttachmentUiModel) {
with(itemView) { with(itemView) {
val controller = Fresco.newDraweeControllerBuilder().apply { val controller = Fresco.newDraweeControllerBuilder().apply {
setUri(data.attachmentUrl) setUri(data.attachmentUrl)
......
...@@ -2,7 +2,7 @@ package chat.rocket.android.chatroom.adapter ...@@ -2,7 +2,7 @@ package chat.rocket.android.chatroom.adapter
import android.text.method.LinkMovementMethod import android.text.method.LinkMovementMethod
import android.view.View import android.view.View
import chat.rocket.android.chatroom.viewmodel.MessageAttachmentViewModel import chat.rocket.android.chatroom.uimodel.MessageAttachmentUiModel
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
import kotlinx.android.synthetic.main.item_message_attachment.view.* import kotlinx.android.synthetic.main.item_message_attachment.view.*
...@@ -10,7 +10,7 @@ class MessageAttachmentViewHolder( ...@@ -10,7 +10,7 @@ class MessageAttachmentViewHolder(
itemView: View, itemView: View,
listener: ActionsListener, listener: ActionsListener,
reactionListener: EmojiReactionListener? = null reactionListener: EmojiReactionListener? = null
) : BaseViewHolder<MessageAttachmentViewModel>(itemView, listener, reactionListener) { ) : BaseViewHolder<MessageAttachmentUiModel>(itemView, listener, reactionListener) {
init { init {
with(itemView) { with(itemView) {
...@@ -19,7 +19,7 @@ class MessageAttachmentViewHolder( ...@@ -19,7 +19,7 @@ class MessageAttachmentViewHolder(
} }
} }
override fun bindViews(data: MessageAttachmentViewModel) { override fun bindViews(data: MessageAttachmentUiModel) {
with(itemView) { with(itemView) {
text_message_time.text = data.time text_message_time.text = data.time
text_sender.text = data.senderName text_sender.text = data.senderName
......
...@@ -7,7 +7,7 @@ import android.view.ViewGroup ...@@ -7,7 +7,7 @@ import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.viewmodel.ReactionViewModel import chat.rocket.android.chatroom.uimodel.ReactionUiModel
import chat.rocket.android.dagger.DaggerLocalComponent import chat.rocket.android.dagger.DaggerLocalComponent
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.widget.emoji.Emoji import chat.rocket.android.widget.emoji.Emoji
...@@ -23,7 +23,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() ...@@ -23,7 +23,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>()
private const val ADD_REACTION_VIEW_TYPE = 1 private const val ADD_REACTION_VIEW_TYPE = 1
} }
private val reactions = CopyOnWriteArrayList<ReactionViewModel>() private val reactions = CopyOnWriteArrayList<ReactionUiModel>()
var listener: EmojiReactionListener? = null var listener: EmojiReactionListener? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
...@@ -59,7 +59,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() ...@@ -59,7 +59,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>()
return REACTION_VIEW_TYPE return REACTION_VIEW_TYPE
} }
fun addReactions(reactions: List<ReactionViewModel>) { fun addReactions(reactions: List<ReactionUiModel>) {
this.reactions.clear() this.reactions.clear()
this.reactions.addAllAbsent(reactions) this.reactions.addAllAbsent(reactions)
notifyItemRangeInserted(0, reactions.size) notifyItemRangeInserted(0, reactions.size)
...@@ -78,7 +78,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() ...@@ -78,7 +78,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>()
private val listener: EmojiReactionListener?) private val listener: EmojiReactionListener?)
: RecyclerView.ViewHolder(view), View.OnClickListener { : RecyclerView.ViewHolder(view), View.OnClickListener {
@Inject lateinit var localRepository: LocalRepository @Inject lateinit var localRepository: LocalRepository
@Volatile lateinit var reaction: ReactionViewModel @Volatile lateinit var reaction: ReactionUiModel
@Volatile @Volatile
var clickHandled = false var clickHandled = false
...@@ -89,7 +89,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() ...@@ -89,7 +89,7 @@ class MessageReactionsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>()
.inject(this) .inject(this)
} }
fun bind(reaction: ReactionViewModel) { fun bind(reaction: ReactionUiModel) {
clickHandled = false clickHandled = false
this.reaction = reaction this.reaction = reaction
with(itemView) { with(itemView) {
......
package chat.rocket.android.chatroom.adapter package chat.rocket.android.chatroom.adapter
import android.view.View import android.view.View
import chat.rocket.android.chatroom.viewmodel.MessageReplyViewModel import chat.rocket.android.chatroom.uimodel.MessageReplyUiModel
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
import kotlinx.android.synthetic.main.item_message_reply.view.* import kotlinx.android.synthetic.main.item_message_reply.view.*
...@@ -10,7 +10,7 @@ class MessageReplyViewHolder( ...@@ -10,7 +10,7 @@ class MessageReplyViewHolder(
listener: ActionsListener, listener: ActionsListener,
reactionListener: EmojiReactionListener? = null, reactionListener: EmojiReactionListener? = null,
private val replyCallback: (roomName: String, permalink: String) -> Unit private val replyCallback: (roomName: String, permalink: String) -> Unit
) : BaseViewHolder<MessageReplyViewModel>(itemView, listener, reactionListener) { ) : BaseViewHolder<MessageReplyUiModel>(itemView, listener, reactionListener) {
init { init {
with(itemView) { with(itemView) {
...@@ -18,7 +18,7 @@ class MessageReplyViewHolder( ...@@ -18,7 +18,7 @@ class MessageReplyViewHolder(
} }
} }
override fun bindViews(data: MessageReplyViewModel) { override fun bindViews(data: MessageReplyUiModel) {
with(itemView) { with(itemView) {
button_message_reply.setOnClickListener { button_message_reply.setOnClickListener {
with(data.rawData) { with(data.rawData) {
......
...@@ -4,8 +4,7 @@ import android.graphics.Color ...@@ -4,8 +4,7 @@ import android.graphics.Color
import android.text.method.LinkMovementMethod import android.text.method.LinkMovementMethod
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import chat.rocket.android.chatroom.viewmodel.MessageViewModel import chat.rocket.android.chatroom.uimodel.MessageUiModel
import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
import chat.rocket.core.model.isSystemMessage import chat.rocket.core.model.isSystemMessage
import kotlinx.android.synthetic.main.avatar.view.* import kotlinx.android.synthetic.main.avatar.view.*
...@@ -15,7 +14,7 @@ class MessageViewHolder( ...@@ -15,7 +14,7 @@ class MessageViewHolder(
itemView: View, itemView: View,
listener: ActionsListener, listener: ActionsListener,
reactionListener: EmojiReactionListener? = null reactionListener: EmojiReactionListener? = null
) : BaseViewHolder<MessageViewModel>(itemView, listener, reactionListener) { ) : BaseViewHolder<MessageUiModel>(itemView, listener, reactionListener) {
init { init {
with(itemView) { with(itemView) {
...@@ -24,7 +23,7 @@ class MessageViewHolder( ...@@ -24,7 +23,7 @@ class MessageViewHolder(
} }
} }
override fun bindViews(data: MessageViewModel) { override fun bindViews(data: MessageUiModel) {
with(itemView) { with(itemView) {
if (data.isFirstUnread) new_messages_notif.visibility = View.VISIBLE if (data.isFirstUnread) new_messages_notif.visibility = View.VISIBLE
else new_messages_notif.visibility = View.GONE else new_messages_notif.visibility = View.GONE
......
...@@ -9,7 +9,7 @@ import android.widget.ImageView ...@@ -9,7 +9,7 @@ import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.adapter.PeopleSuggestionsAdapter.PeopleSuggestionViewHolder import chat.rocket.android.chatroom.adapter.PeopleSuggestionsAdapter.PeopleSuggestionViewHolder
import chat.rocket.android.chatroom.viewmodel.suggestion.PeopleSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.PeopleSuggestionUiModel
import chat.rocket.android.util.extensions.setVisible import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.widget.autocompletion.model.SuggestionModel import chat.rocket.android.widget.autocompletion.model.SuggestionModel
import chat.rocket.android.widget.autocompletion.ui.BaseSuggestionViewHolder import chat.rocket.android.widget.autocompletion.ui.BaseSuggestionViewHolder
...@@ -22,14 +22,14 @@ class PeopleSuggestionsAdapter(context: Context) : SuggestionsAdapter<PeopleSugg ...@@ -22,14 +22,14 @@ class PeopleSuggestionsAdapter(context: Context) : SuggestionsAdapter<PeopleSugg
val allDescription = context.getString(R.string.suggest_all_description) val allDescription = context.getString(R.string.suggest_all_description)
val hereDescription = context.getString(R.string.suggest_here_description) val hereDescription = context.getString(R.string.suggest_here_description)
val pinnedList = listOf( val pinnedList = listOf(
PeopleSuggestionViewModel(imageUri = null, PeopleSuggestionUiModel(imageUri = null,
text = "all", text = "all",
username = "all", username = "all",
name = allDescription, name = allDescription,
status = null, status = null,
pinned = false, pinned = false,
searchList = listOf("all")), searchList = listOf("all")),
PeopleSuggestionViewModel(imageUri = null, PeopleSuggestionUiModel(imageUri = null,
text = "here", text = "here",
username = "here", username = "here",
name = hereDescription, name = hereDescription,
...@@ -49,7 +49,7 @@ class PeopleSuggestionsAdapter(context: Context) : SuggestionsAdapter<PeopleSugg ...@@ -49,7 +49,7 @@ class PeopleSuggestionsAdapter(context: Context) : SuggestionsAdapter<PeopleSugg
class PeopleSuggestionViewHolder(view: View) : BaseSuggestionViewHolder(view) { class PeopleSuggestionViewHolder(view: View) : BaseSuggestionViewHolder(view) {
override fun bind(item: SuggestionModel, itemClickListener: SuggestionsAdapter.ItemClickListener?) { override fun bind(item: SuggestionModel, itemClickListener: SuggestionsAdapter.ItemClickListener?) {
item as PeopleSuggestionViewModel item as PeopleSuggestionUiModel
with(itemView) { with(itemView) {
val username = itemView.findViewById<TextView>(R.id.text_username) val username = itemView.findViewById<TextView>(R.id.text_username)
val name = itemView.findViewById<TextView>(R.id.text_name) val name = itemView.findViewById<TextView>(R.id.text_name)
......
...@@ -6,7 +6,7 @@ import android.view.ViewGroup ...@@ -6,7 +6,7 @@ import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.adapter.RoomSuggestionsAdapter.RoomSuggestionsViewHolder import chat.rocket.android.chatroom.adapter.RoomSuggestionsAdapter.RoomSuggestionsViewHolder
import chat.rocket.android.chatroom.viewmodel.suggestion.ChatRoomSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.ChatRoomSuggestionUiModel
import chat.rocket.android.widget.autocompletion.model.SuggestionModel import chat.rocket.android.widget.autocompletion.model.SuggestionModel
import chat.rocket.android.widget.autocompletion.ui.BaseSuggestionViewHolder import chat.rocket.android.widget.autocompletion.ui.BaseSuggestionViewHolder
import chat.rocket.android.widget.autocompletion.ui.SuggestionsAdapter import chat.rocket.android.widget.autocompletion.ui.SuggestionsAdapter
...@@ -22,7 +22,7 @@ class RoomSuggestionsAdapter : SuggestionsAdapter<RoomSuggestionsViewHolder>("#" ...@@ -22,7 +22,7 @@ class RoomSuggestionsAdapter : SuggestionsAdapter<RoomSuggestionsViewHolder>("#"
class RoomSuggestionsViewHolder(view: View) : BaseSuggestionViewHolder(view) { class RoomSuggestionsViewHolder(view: View) : BaseSuggestionViewHolder(view) {
override fun bind(item: SuggestionModel, itemClickListener: SuggestionsAdapter.ItemClickListener?) { override fun bind(item: SuggestionModel, itemClickListener: SuggestionsAdapter.ItemClickListener?) {
item as ChatRoomSuggestionViewModel item as ChatRoomSuggestionUiModel
with(itemView) { with(itemView) {
val fullname = itemView.findViewById<TextView>(R.id.text_fullname) val fullname = itemView.findViewById<TextView>(R.id.text_fullname)
val name = itemView.findViewById<TextView>(R.id.text_name) val name = itemView.findViewById<TextView>(R.id.text_name)
......
package chat.rocket.android.chatroom.adapter package chat.rocket.android.chatroom.adapter
import android.content.Intent
import android.net.Uri import android.net.Uri
import android.view.View import android.view.View
import chat.rocket.android.chatroom.viewmodel.UrlPreviewViewModel import chat.rocket.android.chatroom.uimodel.UrlPreviewUiModel
import chat.rocket.android.util.extensions.content import chat.rocket.android.util.extensions.content
import chat.rocket.android.util.extensions.openTabbedUrl import chat.rocket.android.util.extensions.openTabbedUrl
import chat.rocket.android.util.extensions.setVisible import chat.rocket.android.util.extensions.setVisible
...@@ -13,7 +12,7 @@ import kotlinx.android.synthetic.main.message_url_preview.view.* ...@@ -13,7 +12,7 @@ import kotlinx.android.synthetic.main.message_url_preview.view.*
class UrlPreviewViewHolder(itemView: View, class UrlPreviewViewHolder(itemView: View,
listener: ActionsListener, listener: ActionsListener,
reactionListener: EmojiReactionListener? = null) reactionListener: EmojiReactionListener? = null)
: BaseViewHolder<UrlPreviewViewModel>(itemView, listener, reactionListener) { : BaseViewHolder<UrlPreviewUiModel>(itemView, listener, reactionListener) {
init { init {
with(itemView) { with(itemView) {
...@@ -21,7 +20,7 @@ class UrlPreviewViewHolder(itemView: View, ...@@ -21,7 +20,7 @@ class UrlPreviewViewHolder(itemView: View,
} }
} }
override fun bindViews(data: UrlPreviewViewModel) { override fun bindViews(data: UrlPreviewUiModel) {
with(itemView) { with(itemView) {
if (data.thumbUrl.isNullOrEmpty()) { if (data.thumbUrl.isNullOrEmpty()) {
image_preview.setVisible(false) image_preview.setVisible(false)
......
package chat.rocket.android.chatroom.adapter package chat.rocket.android.chatroom.adapter
import android.view.View import android.view.View
import chat.rocket.android.chatroom.viewmodel.VideoAttachmentViewModel import chat.rocket.android.chatroom.uimodel.VideoAttachmentUiModel
import chat.rocket.android.player.PlayerActivity import chat.rocket.android.player.PlayerActivity
import chat.rocket.android.util.extensions.setVisible import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.widget.emoji.EmojiReactionListener import chat.rocket.android.widget.emoji.EmojiReactionListener
...@@ -10,7 +10,7 @@ import kotlinx.android.synthetic.main.message_attachment.view.* ...@@ -10,7 +10,7 @@ import kotlinx.android.synthetic.main.message_attachment.view.*
class VideoAttachmentViewHolder(itemView: View, class VideoAttachmentViewHolder(itemView: View,
listener: ActionsListener, listener: ActionsListener,
reactionListener: EmojiReactionListener? = null) reactionListener: EmojiReactionListener? = null)
: BaseViewHolder<VideoAttachmentViewModel>(itemView, listener, reactionListener) { : BaseViewHolder<VideoAttachmentUiModel>(itemView, listener, reactionListener) {
init { init {
with(itemView) { with(itemView) {
...@@ -20,7 +20,7 @@ class VideoAttachmentViewHolder(itemView: View, ...@@ -20,7 +20,7 @@ class VideoAttachmentViewHolder(itemView: View,
} }
} }
override fun bindViews(data: VideoAttachmentViewModel) { override fun bindViews(data: VideoAttachmentUiModel) {
with(itemView) { with(itemView) {
file_name.text = data.attachmentTitle file_name.text = data.attachmentTitle
audio_video_attachment.setOnClickListener { view -> audio_video_attachment.setOnClickListener { view ->
......
...@@ -6,11 +6,11 @@ import chat.rocket.android.chatroom.adapter.AutoCompleteType ...@@ -6,11 +6,11 @@ import chat.rocket.android.chatroom.adapter.AutoCompleteType
import chat.rocket.android.chatroom.adapter.PEOPLE import chat.rocket.android.chatroom.adapter.PEOPLE
import chat.rocket.android.chatroom.adapter.ROOMS import chat.rocket.android.chatroom.adapter.ROOMS
import chat.rocket.android.chatroom.domain.UriInteractor import chat.rocket.android.chatroom.domain.UriInteractor
import chat.rocket.android.chatroom.viewmodel.RoomViewModel import chat.rocket.android.chatroom.uimodel.RoomUiModel
import chat.rocket.android.chatroom.viewmodel.ViewModelMapper import chat.rocket.android.chatroom.uimodel.UiModelMapper
import chat.rocket.android.chatroom.viewmodel.suggestion.ChatRoomSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.ChatRoomSuggestionUiModel
import chat.rocket.android.chatroom.viewmodel.suggestion.CommandSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.CommandSuggestionUiModel
import chat.rocket.android.chatroom.viewmodel.suggestion.PeopleSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.PeopleSuggestionUiModel
import chat.rocket.android.core.behaviours.showMessage import chat.rocket.android.core.behaviours.showMessage
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.helper.MessageHelper import chat.rocket.android.helper.MessageHelper
...@@ -88,7 +88,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -88,7 +88,7 @@ class ChatRoomPresenter @Inject constructor(
private val roomsRepository: RoomRepository, private val roomsRepository: RoomRepository,
private val localRepository: LocalRepository, private val localRepository: LocalRepository,
private val userHelper: UserHelper, private val userHelper: UserHelper,
private val mapper: ViewModelMapper, private val mapper: UiModelMapper,
private val jobSchedulerInteractor: JobSchedulerInteractor, private val jobSchedulerInteractor: JobSchedulerInteractor,
private val messageHelper: MessageHelper, private val messageHelper: MessageHelper,
getSettingsInteractor: GetSettingsInteractor, getSettingsInteractor: GetSettingsInteractor,
...@@ -152,7 +152,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -152,7 +152,7 @@ class ChatRoomPresenter @Inject constructor(
try { try {
if (offset == 0L) { if (offset == 0L) {
val localMessages = messagesRepository.getByRoomId(chatRoomId) val localMessages = messagesRepository.getByRoomId(chatRoomId)
val oldMessages = mapper.map(localMessages, RoomViewModel(roles = chatRoles, val oldMessages = mapper.map(localMessages, RoomUiModel(roles = chatRoles,
isBroadcast = chatIsBroadcast, isRoom = true)) isBroadcast = chatIsBroadcast, isRoom = true))
if (oldMessages.isNotEmpty()) { if (oldMessages.isNotEmpty()) {
view.showMessages(oldMessages) view.showMessages(oldMessages)
...@@ -191,7 +191,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -191,7 +191,7 @@ class ChatRoomPresenter @Inject constructor(
client.messages(chatRoomId, roomTypeOf(chatRoomType), offset, 30).result client.messages(chatRoomId, roomTypeOf(chatRoomType), offset, 30).result
} }
messagesRepository.saveAll(messages) messagesRepository.saveAll(messages)
view.showMessages(mapper.map(messages, RoomViewModel(roles = chatRoles, view.showMessages(mapper.map(messages, RoomUiModel(roles = chatRoles,
isBroadcast = chatIsBroadcast, isRoom = true))) isBroadcast = chatIsBroadcast, isRoom = true)))
} }
...@@ -227,7 +227,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -227,7 +227,7 @@ class ChatRoomPresenter @Inject constructor(
) )
try { try {
messagesRepository.save(newMessage) messagesRepository.save(newMessage)
view.showNewMessage(mapper.map(newMessage, RoomViewModel( view.showNewMessage(mapper.map(newMessage, RoomUiModel(
roles = chatRoles, isBroadcast = chatIsBroadcast))) roles = chatRoles, isBroadcast = chatIsBroadcast)))
client.sendMessage(id, chatRoomId, text) client.sendMessage(id, chatRoomId, text)
} catch (ex: Exception) { } catch (ex: Exception) {
...@@ -369,7 +369,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -369,7 +369,7 @@ class ChatRoomPresenter @Inject constructor(
Timber.d("History: $messages") Timber.d("History: $messages")
if (messages.result.isNotEmpty()) { if (messages.result.isNotEmpty()) {
val models = mapper.map(messages.result, RoomViewModel( val models = mapper.map(messages.result, RoomUiModel(
roles = chatRoles, isBroadcast = chatIsBroadcast, isRoom = true)) roles = chatRoles, isBroadcast = chatIsBroadcast, isRoom = true))
messagesRepository.saveAll(messages.result) messagesRepository.saveAll(messages.result)
...@@ -451,7 +451,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -451,7 +451,7 @@ class ChatRoomPresenter @Inject constructor(
view.showReplyingAction( view.showReplyingAction(
username = getDisplayName(msg.sender), username = getDisplayName(msg.sender),
replyMarkdown = "[ ]($currentServer/$chatRoomType/$room?msg=$id) $mention ", replyMarkdown = "[ ]($currentServer/$chatRoomType/$room?msg=$id) $mention ",
quotedMessage = mapper.map(message, RoomViewModel(roles = chatRoles, quotedMessage = mapper.map(message, RoomUiModel(roles = chatRoles,
isBroadcast = chatIsBroadcast)).last().preview?.message ?: "" isBroadcast = chatIsBroadcast)).last().preview?.message ?: ""
) )
} }
...@@ -564,7 +564,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -564,7 +564,7 @@ class ChatRoomPresenter @Inject constructor(
// Take at most the 100 most recent messages distinguished by user. Can return less. // Take at most the 100 most recent messages distinguished by user. Can return less.
val recentMessages = messagesRepository.getRecentMessages(chatRoomId, 100) val recentMessages = messagesRepository.getRecentMessages(chatRoomId, 100)
.filterNot { filterSelfOut && it.sender?.username == self } .filterNot { filterSelfOut && it.sender?.username == self }
val activeUsers = mutableListOf<PeopleSuggestionViewModel>() val activeUsers = mutableListOf<PeopleSuggestionUiModel>()
recentMessages.forEach { recentMessages.forEach {
val sender = it.sender!! val sender = it.sender!!
val username = sender.username ?: "" val username = sender.username ?: ""
...@@ -573,7 +573,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -573,7 +573,7 @@ class ChatRoomPresenter @Inject constructor(
val found = members.firstOrNull { member -> member.username == username } val found = members.firstOrNull { member -> member.username == username }
val status = if (found != null) found.status else UserStatus.Offline() val status = if (found != null) found.status else UserStatus.Offline()
val searchList = mutableListOf(username, name) val searchList = mutableListOf(username, name)
activeUsers.add(PeopleSuggestionViewModel(avatarUrl, username, username, name, status, activeUsers.add(PeopleSuggestionUiModel(avatarUrl, username, username, name, status,
true, searchList)) true, searchList))
} }
// Filter out from members list the active users. // Filter out from members list the active users.
...@@ -588,7 +588,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -588,7 +588,7 @@ class ChatRoomPresenter @Inject constructor(
val name = it.name ?: "" val name = it.name ?: ""
val avatarUrl = currentServer.avatarUrl(username) val avatarUrl = currentServer.avatarUrl(username)
val searchList = mutableListOf(username, name) val searchList = mutableListOf(username, name)
PeopleSuggestionViewModel(avatarUrl, username, username, name, it.status, true, searchList) PeopleSuggestionUiModel(avatarUrl, username, username, name, it.status, true, searchList)
}) })
view.populatePeopleSuggestions(activeUsers) view.populatePeopleSuggestions(activeUsers)
...@@ -613,7 +613,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -613,7 +613,7 @@ class ChatRoomPresenter @Inject constructor(
val name = it.name ?: "" val name = it.name ?: ""
val searchList = mutableListOf(username, name) val searchList = mutableListOf(username, name)
it.emails?.forEach { email -> searchList.add(email.address) } it.emails?.forEach { email -> searchList.add(email.address) }
PeopleSuggestionViewModel(currentServer.avatarUrl(username), PeopleSuggestionUiModel(currentServer.avatarUrl(username),
username, username, name, it.status, false, searchList) username, username, name, it.status, false, searchList)
}.filterNot { filterSelfOut && self != null && self == it.text }) }.filterNot { filterSelfOut && self != null && self == it.text })
} }
...@@ -625,7 +625,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -625,7 +625,7 @@ class ChatRoomPresenter @Inject constructor(
val fullName = it.fullName ?: "" val fullName = it.fullName ?: ""
val name = it.name ?: "" val name = it.name ?: ""
val searchList = mutableListOf(fullName, name) val searchList = mutableListOf(fullName, name)
ChatRoomSuggestionViewModel(name, fullName, name, searchList) ChatRoomSuggestionUiModel(name, fullName, name, searchList)
}) })
} }
} }
...@@ -657,7 +657,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -657,7 +657,7 @@ class ChatRoomPresenter @Inject constructor(
.map { chatRoom -> .map { chatRoom ->
val name = chatRoom.name val name = chatRoom.name
val fullName = chatRoom.fullName ?: "" val fullName = chatRoom.fullName ?: ""
ChatRoomSuggestionViewModel( ChatRoomSuggestionUiModel(
text = name, text = name,
name = name, name = name,
fullName = fullName, fullName = fullName,
...@@ -736,7 +736,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -736,7 +736,7 @@ class ChatRoomPresenter @Inject constructor(
client.commands(0, 100).result client.commands(0, 100).result
} }
view.populateCommandSuggestions(commands.map { view.populateCommandSuggestions(commands.map {
CommandSuggestionViewModel(it.command, it.description ?: "", listOf(it.command)) CommandSuggestionUiModel(it.command, it.description ?: "", listOf(it.command))
}) })
} catch (ex: RocketChatException) { } catch (ex: RocketChatException) {
Timber.e(ex) Timber.e(ex)
...@@ -834,7 +834,7 @@ class ChatRoomPresenter @Inject constructor( ...@@ -834,7 +834,7 @@ class ChatRoomPresenter @Inject constructor(
private fun updateMessage(streamedMessage: Message) { private fun updateMessage(streamedMessage: Message) {
launchUI(strategy) { launchUI(strategy) {
val viewModelStreamedMessage = mapper.map(streamedMessage, RoomViewModel( val viewModelStreamedMessage = mapper.map(streamedMessage, RoomUiModel(
roles = chatRoles, isBroadcast = chatIsBroadcast)) roles = chatRoles, isBroadcast = chatIsBroadcast))
val roomMessages = messagesRepository.getByRoomId(streamedMessage.roomId) val roomMessages = messagesRepository.getByRoomId(streamedMessage.roomId)
......
package chat.rocket.android.chatroom.presentation package chat.rocket.android.chatroom.presentation
import android.net.Uri import android.net.Uri
import chat.rocket.android.chatroom.viewmodel.BaseViewModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
import chat.rocket.android.chatroom.viewmodel.suggestion.ChatRoomSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.ChatRoomSuggestionUiModel
import chat.rocket.android.chatroom.viewmodel.suggestion.CommandSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.CommandSuggestionUiModel
import chat.rocket.android.chatroom.viewmodel.suggestion.PeopleSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.PeopleSuggestionUiModel
import chat.rocket.android.core.behaviours.LoadingView import chat.rocket.android.core.behaviours.LoadingView
import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.core.behaviours.MessageView
import chat.rocket.core.internal.realtime.socket.model.State import chat.rocket.core.internal.realtime.socket.model.State
...@@ -17,7 +17,7 @@ interface ChatRoomView : LoadingView, MessageView { ...@@ -17,7 +17,7 @@ interface ChatRoomView : LoadingView, MessageView {
* *
* @param dataSet The data set to show. * @param dataSet The data set to show.
*/ */
fun showMessages(dataSet: List<BaseViewModel<*>>) fun showMessages(dataSet: List<BaseUiModel<*>>)
/** /**
* Send a message to a chat room. * Send a message to a chat room.
...@@ -60,7 +60,7 @@ interface ChatRoomView : LoadingView, MessageView { ...@@ -60,7 +60,7 @@ interface ChatRoomView : LoadingView, MessageView {
* *
* @param message The (recent) message sent to a chat room. * @param message The (recent) message sent to a chat room.
*/ */
fun showNewMessage(message: List<BaseViewModel<*>>) fun showNewMessage(message: List<BaseUiModel<*>>)
/** /**
* Dispatch to the recycler views adapter that we should remove a message. * Dispatch to the recycler views adapter that we should remove a message.
...@@ -74,7 +74,7 @@ interface ChatRoomView : LoadingView, MessageView { ...@@ -74,7 +74,7 @@ interface ChatRoomView : LoadingView, MessageView {
* *
* @param index The index of the changed message * @param index The index of the changed message
*/ */
fun dispatchUpdateMessage(index: Int, message: List<BaseViewModel<*>>) fun dispatchUpdateMessage(index: Int, message: List<BaseUiModel<*>>)
/** /**
* Show reply status above the message composer. * Show reply status above the message composer.
...@@ -117,9 +117,9 @@ interface ChatRoomView : LoadingView, MessageView { ...@@ -117,9 +117,9 @@ interface ChatRoomView : LoadingView, MessageView {
fun showConnectionState(state: State) fun showConnectionState(state: State)
fun populatePeopleSuggestions(members: List<PeopleSuggestionViewModel>) fun populatePeopleSuggestions(members: List<PeopleSuggestionUiModel>)
fun populateRoomSuggestions(chatRooms: List<ChatRoomSuggestionViewModel>) fun populateRoomSuggestions(chatRooms: List<ChatRoomSuggestionUiModel>)
/** /**
* This user has joined the chat callback. * This user has joined the chat callback.
* *
...@@ -134,7 +134,7 @@ interface ChatRoomView : LoadingView, MessageView { ...@@ -134,7 +134,7 @@ interface ChatRoomView : LoadingView, MessageView {
* *
* @param commands The list of available commands. * @param commands The list of available commands.
*/ */
fun populateCommandSuggestions(commands: List<CommandSuggestionViewModel>) fun populateCommandSuggestions(commands: List<CommandSuggestionUiModel>)
/** /**
* Communicate whether it's a broadcast channel and if current user can post to it. * Communicate whether it's a broadcast channel and if current user can post to it.
......
...@@ -21,15 +21,24 @@ import chat.rocket.android.R ...@@ -21,15 +21,24 @@ import chat.rocket.android.R
import chat.rocket.android.chatroom.adapter.* import chat.rocket.android.chatroom.adapter.*
import chat.rocket.android.chatroom.presentation.ChatRoomPresenter import chat.rocket.android.chatroom.presentation.ChatRoomPresenter
import chat.rocket.android.chatroom.presentation.ChatRoomView import chat.rocket.android.chatroom.presentation.ChatRoomView
import chat.rocket.android.chatroom.viewmodel.BaseViewModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
import chat.rocket.android.chatroom.viewmodel.MessageViewModel import chat.rocket.android.chatroom.uimodel.MessageUiModel
import chat.rocket.android.chatroom.viewmodel.suggestion.ChatRoomSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.ChatRoomSuggestionUiModel
import chat.rocket.android.chatroom.viewmodel.suggestion.CommandSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.CommandSuggestionUiModel
import chat.rocket.android.chatroom.viewmodel.suggestion.PeopleSuggestionViewModel import chat.rocket.android.chatroom.uimodel.suggestion.PeopleSuggestionUiModel
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.helper.KeyboardHelper import chat.rocket.android.helper.KeyboardHelper
import chat.rocket.android.helper.MessageParser import chat.rocket.android.helper.MessageParser
import chat.rocket.android.util.extensions.* import chat.rocket.android.util.extensions.asObservable
import chat.rocket.android.util.extensions.circularRevealOrUnreveal
import chat.rocket.android.util.extensions.fadeIn
import chat.rocket.android.util.extensions.fadeOut
import chat.rocket.android.util.extensions.hideKeyboard
import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.rotateBy
import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.extensions.textContent
import chat.rocket.android.util.extensions.ui
import chat.rocket.android.widget.emoji.* import chat.rocket.android.widget.emoji.*
import chat.rocket.common.model.RoomType import chat.rocket.common.model.RoomType
import chat.rocket.common.model.roomTypeOf import chat.rocket.common.model.roomTypeOf
...@@ -220,26 +229,26 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -220,26 +229,26 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
return true return true
} }
override fun showMessages(dataSet: List<BaseViewModel<*>>) { override fun showMessages(dataSet: List<BaseUiModel<*>>) {
ui { ui {
// track the message sent immediately after the current message // track the message sent immediately after the current message
var prevMessageViewModel: MessageViewModel? = null var prevMessageUiModel: MessageUiModel? = null
// Loop over received messages to determine first unread // Loop over received messages to determine first unread
for (i in dataSet.indices) { for (i in dataSet.indices) {
val msgModel = dataSet[i] val msgModel = dataSet[i]
if (msgModel is MessageViewModel) { if (msgModel is MessageUiModel) {
val msg = msgModel.rawData val msg = msgModel.rawData
if (msg.timestamp < chatRoomLastSeen) { if (msg.timestamp < chatRoomLastSeen) {
// This message was sent before the last seen of the room. Hence, it was seen. // This message was sent before the last seen of the room. Hence, it was seen.
// if there is a message after (below) this, mark it firstUnread. // if there is a message after (below) this, mark it firstUnread.
if (prevMessageViewModel != null) { if (prevMessageUiModel != null) {
prevMessageViewModel.isFirstUnread = true prevMessageUiModel.isFirstUnread = true
} }
break break
} }
prevMessageViewModel = msgModel prevMessageUiModel = msgModel
} }
} }
...@@ -395,7 +404,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -395,7 +404,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
showMessage(getString(R.string.msg_invalid_file)) showMessage(getString(R.string.msg_invalid_file))
} }
override fun showNewMessage(message: List<BaseViewModel<*>>) { override fun showNewMessage(message: List<BaseUiModel<*>>) {
ui { ui {
adapter.prependData(message) adapter.prependData(message)
recycler_view.scrollToPosition(0) recycler_view.scrollToPosition(0)
...@@ -428,7 +437,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -428,7 +437,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
} }
override fun dispatchUpdateMessage(index: Int, message: List<BaseViewModel<*>>) { override fun dispatchUpdateMessage(index: Int, message: List<BaseUiModel<*>>) {
ui { ui {
adapter.updateItem(message.last()) adapter.updateItem(message.last())
if (message.size > 1) { if (message.size > 1) {
...@@ -458,11 +467,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -458,11 +467,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
override fun showLoading() { override fun showLoading() {
ui { view_loading.setVisible(true) } ui { view_loading.isVisible = true }
} }
override fun hideLoading() { override fun hideLoading() {
ui { view_loading.setVisible(false) } ui { view_loading.isVisible = false }
} }
override fun showMessage(message: String) { override fun showMessage(message: String) {
...@@ -479,19 +488,19 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -479,19 +488,19 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
override fun populatePeopleSuggestions(members: List<PeopleSuggestionViewModel>) { override fun populatePeopleSuggestions(members: List<PeopleSuggestionUiModel>) {
ui { ui {
suggestions_view.addItems("@", members) suggestions_view.addItems("@", members)
} }
} }
override fun populateRoomSuggestions(chatRooms: List<ChatRoomSuggestionViewModel>) { override fun populateRoomSuggestions(chatRooms: List<ChatRoomSuggestionUiModel>) {
ui { ui {
suggestions_view.addItems("#", chatRooms) suggestions_view.addItems("#", chatRooms)
} }
} }
override fun populateCommandSuggestions(commands: List<CommandSuggestionViewModel>) { override fun populateCommandSuggestions(commands: List<CommandSuggestionUiModel>) {
ui { ui {
suggestions_view.addItems("/", commands) suggestions_view.addItems("/", commands)
} }
...@@ -603,8 +612,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -603,8 +612,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
override fun onJoined(userCanPost: Boolean) { override fun onJoined(userCanPost: Boolean) {
ui { ui {
input_container.setVisible(true) input_container.isVisible = true
button_join_chat.setVisible(false) button_join_chat.isVisible = false
isSubscribed = true isSubscribed = true
setupMessageComposer(userCanPost) setupMessageComposer(userCanPost)
} }
...@@ -639,16 +648,16 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -639,16 +648,16 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
private fun setupMessageComposer(canPost: Boolean) { private fun setupMessageComposer(canPost: Boolean) {
if (isChatRoomReadOnly && !canPost) { if (isChatRoomReadOnly && !canPost) {
text_room_is_read_only.setVisible(true) text_room_is_read_only.isVisible = true
input_container.setVisible(false) input_container.isVisible = false
} else if (!isSubscribed && roomTypeOf(chatRoomType) !is RoomType.DirectMessage) { } else if (!isSubscribed && roomTypeOf(chatRoomType) !is RoomType.DirectMessage) {
input_container.setVisible(false) input_container.isVisible = false
button_join_chat.setVisible(true) button_join_chat.isVisible = true
button_join_chat.setOnClickListener { presenter.joinChat(chatRoomId) } button_join_chat.setOnClickListener { presenter.joinChat(chatRoomId) }
} else { } else {
button_send.setVisible(false) button_send.isVisible = false
button_show_attachment_options.alpha = 1f button_show_attachment_options.alpha = 1f
button_show_attachment_options.setVisible(true) button_show_attachment_options.isVisible = true
subscribeComposeTextMessage() subscribeComposeTextMessage()
emojiKeyboardPopup = emojiKeyboardPopup =
...@@ -781,14 +790,14 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -781,14 +790,14 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
private fun setupComposeButtons(charSequence: CharSequence) { private fun setupComposeButtons(charSequence: CharSequence) {
if (charSequence.isNotEmpty() && playComposeMessageButtonsAnimation) { if (charSequence.isNotEmpty() && playComposeMessageButtonsAnimation) {
button_show_attachment_options.setVisible(false) button_show_attachment_options.isVisible = false
button_send.setVisible(true) button_send.isVisible = true
playComposeMessageButtonsAnimation = false playComposeMessageButtonsAnimation = false
} }
if (charSequence.isEmpty()) { if (charSequence.isEmpty()) {
button_send.setVisible(false) button_send.isVisible = false
button_show_attachment_options.setVisible(true) button_show_attachment_options.isVisible = true
playComposeMessageButtonsAnimation = true playComposeMessageButtonsAnimation = true
} }
} }
...@@ -802,7 +811,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -802,7 +811,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
private fun showAttachmentOptions() { private fun showAttachmentOptions() {
view_dim.setVisible(true) view_dim.isVisible = true
// Play anim. // Play anim.
button_show_attachment_options.rotateBy(45F) button_show_attachment_options.rotateBy(45F)
...@@ -814,7 +823,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -814,7 +823,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
button_show_attachment_options.rotateBy(-45F) button_show_attachment_options.rotateBy(-45F)
layout_message_attachment_options.circularRevealOrUnreveal(centerX, centerY, max, 0F) layout_message_attachment_options.circularRevealOrUnreveal(centerX, centerY, max, 0F)
view_dim.setVisible(false) view_dim.isVisible = false
} }
private fun setupToolbar(toolbarTitle: String) { private fun setupToolbar(toolbarTitle: String) {
......
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import chat.rocket.core.model.attachment.AudioAttachment import chat.rocket.core.model.attachment.AudioAttachment
data class AudioAttachmentViewModel( data class AudioAttachmentUiModel(
override val message: Message, override val message: Message,
override val rawData: AudioAttachment, override val rawData: AudioAttachment,
override val messageId: String, override val messageId: String,
override val attachmentUrl: String, override val attachmentUrl: String,
override val attachmentTitle: CharSequence, override val attachmentTitle: CharSequence,
override val id: Long, override val id: Long,
override var reactions: List<ReactionViewModel>, override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseViewModel<*>? = null, override var nextDownStreamMessage: BaseUiModel<*>? = null,
override var preview: Message? = null, override var preview: Message? = null,
override var isTemporary: Boolean = false override var isTemporary: Boolean = false
) : BaseFileAttachmentViewModel<AudioAttachment> { ) : BaseFileAttachmentUiModel<AudioAttachment> {
override val viewType: Int override val viewType: Int
get() = BaseViewModel.ViewType.AUDIO_ATTACHMENT.viewType get() = BaseUiModel.ViewType.AUDIO_ATTACHMENT.viewType
override val layoutId: Int override val layoutId: Int
get() = R.layout.message_attachment get() = R.layout.message_attachment
} }
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import chat.rocket.core.model.attachment.AuthorAttachment import chat.rocket.core.model.attachment.AuthorAttachment
data class AuthorAttachmentViewModel( data class AuthorAttachmentUiModel(
override val attachmentUrl: String, override val attachmentUrl: String,
val id: Long, val id: Long,
val name: CharSequence?, val name: CharSequence?,
...@@ -13,13 +13,13 @@ data class AuthorAttachmentViewModel( ...@@ -13,13 +13,13 @@ data class AuthorAttachmentViewModel(
override val message: Message, override val message: Message,
override val rawData: AuthorAttachment, override val rawData: AuthorAttachment,
override val messageId: String, override val messageId: String,
override var reactions: List<ReactionViewModel>, override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseViewModel<*>? = null, override var nextDownStreamMessage: BaseUiModel<*>? = null,
override var preview: Message? = null, override var preview: Message? = null,
override var isTemporary: Boolean = false override var isTemporary: Boolean = false
) : BaseAttachmentViewModel<AuthorAttachment> { ) : BaseAttachmentUiModel<AuthorAttachment> {
override val viewType: Int override val viewType: Int
get() = BaseViewModel.ViewType.AUTHOR_ATTACHMENT.viewType get() = BaseUiModel.ViewType.AUTHOR_ATTACHMENT.viewType
override val layoutId: Int override val layoutId: Int
get() = R.layout.item_author_attachment get() = R.layout.item_author_attachment
} }
\ No newline at end of file
package chat.rocket.android.chatroom.uimodel
interface BaseAttachmentUiModel<out T> : BaseUiModel<T> {
val attachmentUrl: String
}
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
interface BaseFileAttachmentViewModel<out T> : BaseAttachmentViewModel<T> { interface BaseFileAttachmentUiModel<out T> : BaseAttachmentUiModel<T> {
val attachmentTitle: CharSequence val attachmentTitle: CharSequence
val id: Long val id: Long
} }
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
interface BaseMessageViewModel<out T> : BaseViewModel<T> { interface BaseMessageUiModel<out T> : BaseUiModel<T> {
val avatar: String val avatar: String
val time: CharSequence val time: CharSequence
val senderName: CharSequence val senderName: CharSequence
......
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import java.security.InvalidParameterException import java.security.InvalidParameterException
interface BaseViewModel<out T> { interface BaseUiModel<out T> {
val message: Message val message: Message
val rawData: T val rawData: T
val messageId: String val messageId: String
val viewType: Int val viewType: Int
val layoutId: Int val layoutId: Int
var reactions: List<ReactionViewModel> var reactions: List<ReactionUiModel>
var nextDownStreamMessage: BaseViewModel<*>? var nextDownStreamMessage: BaseUiModel<*>?
var preview: Message? var preview: Message?
var isTemporary: Boolean var isTemporary: Boolean
...@@ -29,7 +29,7 @@ interface BaseViewModel<out T> { ...@@ -29,7 +29,7 @@ interface BaseViewModel<out T> {
} }
} }
internal fun Int.toViewType(): BaseViewModel.ViewType { internal fun Int.toViewType(): BaseUiModel.ViewType {
return BaseViewModel.ViewType.values().firstOrNull { it.viewType == this } return BaseUiModel.ViewType.values().firstOrNull { it.viewType == this }
?: throw InvalidParameterException("Invalid viewType: $this for BaseViewModel.ViewType") ?: throw InvalidParameterException("Invalid viewType: $this for BaseUiModel.ViewType")
} }
\ No newline at end of file
package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R
import chat.rocket.core.model.Message
import chat.rocket.core.model.attachment.ColorAttachment
data class ColorAttachmentUiModel(
override val attachmentUrl: String,
val id: Long,
val color: Int,
val text: CharSequence,
override val message: Message,
override val rawData: ColorAttachment,
override val messageId: String,
override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseUiModel<*>? = null,
override var preview: Message? = null,
override var isTemporary: Boolean = false
) : BaseAttachmentUiModel<ColorAttachment> {
override val viewType: Int
get() = BaseUiModel.ViewType.COLOR_ATTACHMENT.viewType
override val layoutId: Int
get() = R.layout.item_color_attachment
}
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import chat.rocket.core.model.attachment.GenericFileAttachment import chat.rocket.core.model.attachment.GenericFileAttachment
import chat.rocket.core.model.attachment.ImageAttachment
data class GenericFileAttachmentViewModel( data class GenericFileAttachmentUiModel(
override val message: Message, override val message: Message,
override val rawData: GenericFileAttachment, override val rawData: GenericFileAttachment,
override val messageId: String, override val messageId: String,
override val attachmentUrl: String, override val attachmentUrl: String,
override val attachmentTitle: CharSequence, override val attachmentTitle: CharSequence,
override val id: Long, override val id: Long,
override var reactions: List<ReactionViewModel>, override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseViewModel<*>? = null, override var nextDownStreamMessage: BaseUiModel<*>? = null,
override var preview: Message? = null, override var preview: Message? = null,
override var isTemporary: Boolean = false override var isTemporary: Boolean = false
) : BaseFileAttachmentViewModel<GenericFileAttachment> { ) : BaseFileAttachmentUiModel<GenericFileAttachment> {
override val viewType: Int override val viewType: Int
get() = BaseViewModel.ViewType.GENERIC_FILE_ATTACHMENT.viewType get() = BaseUiModel.ViewType.GENERIC_FILE_ATTACHMENT.viewType
override val layoutId: Int override val layoutId: Int
get() = R.layout.item_file_attachment get() = R.layout.item_file_attachment
} }
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import chat.rocket.core.model.attachment.ImageAttachment import chat.rocket.core.model.attachment.ImageAttachment
data class ImageAttachmentViewModel( data class ImageAttachmentUiModel(
override val message: Message, override val message: Message,
override val rawData: ImageAttachment, override val rawData: ImageAttachment,
override val messageId: String, override val messageId: String,
override val attachmentUrl: String, override val attachmentUrl: String,
override val attachmentTitle: CharSequence, override val attachmentTitle: CharSequence,
override val id: Long, override val id: Long,
override var reactions: List<ReactionViewModel>, override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseViewModel<*>? = null, override var nextDownStreamMessage: BaseUiModel<*>? = null,
override var preview: Message? = null, override var preview: Message? = null,
override var isTemporary: Boolean = false override var isTemporary: Boolean = false
) : BaseFileAttachmentViewModel<ImageAttachment> { ) : BaseFileAttachmentUiModel<ImageAttachment> {
override val viewType: Int override val viewType: Int
get() = BaseViewModel.ViewType.IMAGE_ATTACHMENT.viewType get() = BaseUiModel.ViewType.IMAGE_ATTACHMENT.viewType
override val layoutId: Int override val layoutId: Int
get() = R.layout.message_attachment get() = R.layout.message_attachment
} }
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
data class MessageAttachmentViewModel( data class MessageAttachmentUiModel(
override val message: Message, override val message: Message,
override val rawData: Message, override val rawData: Message,
override val messageId: String, override val messageId: String,
...@@ -11,14 +11,14 @@ data class MessageAttachmentViewModel( ...@@ -11,14 +11,14 @@ data class MessageAttachmentViewModel(
val time: CharSequence?, val time: CharSequence?,
val content: CharSequence, val content: CharSequence,
val isPinned: Boolean, val isPinned: Boolean,
override var reactions: List<ReactionViewModel>, override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseViewModel<*>? = null, override var nextDownStreamMessage: BaseUiModel<*>? = null,
var messageLink: String? = null, var messageLink: String? = null,
override var preview: Message? = null, override var preview: Message? = null,
override var isTemporary: Boolean = false override var isTemporary: Boolean = false
) : BaseViewModel<Message> { ) : BaseUiModel<Message> {
override val viewType: Int override val viewType: Int
get() = BaseViewModel.ViewType.MESSAGE_ATTACHMENT.viewType get() = BaseUiModel.ViewType.MESSAGE_ATTACHMENT.viewType
override val layoutId: Int override val layoutId: Int
get() = R.layout.item_message_attachment get() = R.layout.item_message_attachment
......
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.domain.MessageReply import chat.rocket.android.chatroom.domain.MessageReply
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
data class MessageReplyViewModel( data class MessageReplyUiModel(
override val rawData: MessageReply, override val rawData: MessageReply,
override val messageId: String, override val messageId: String,
override var reactions: List<ReactionViewModel>, override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseViewModel<*>?, override var nextDownStreamMessage: BaseUiModel<*>?,
override var preview: Message?, override var preview: Message?,
override var isTemporary: Boolean = false, override var isTemporary: Boolean = false,
override val message: Message override val message: Message
) : BaseViewModel<MessageReply> { ) : BaseUiModel<MessageReply> {
override val viewType: Int override val viewType: Int
get() = BaseViewModel.ViewType.MESSAGE_REPLY.viewType get() = BaseUiModel.ViewType.MESSAGE_REPLY.viewType
override val layoutId: Int override val layoutId: Int
get() = R.layout.item_message_reply get() = R.layout.item_message_reply
} }
\ No newline at end of file
package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R
import chat.rocket.core.model.Message
data class MessageUiModel(
override val message: Message,
override val rawData: Message,
override val messageId: String,
override val avatar: String,
override val time: CharSequence,
override val senderName: CharSequence,
override val content: CharSequence,
override val isPinned: Boolean,
override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseUiModel<*>? = null,
override var preview: Message? = null,
var isFirstUnread: Boolean,
override var isTemporary: Boolean = false
) : BaseMessageUiModel<Message> {
override val viewType: Int
get() = BaseUiModel.ViewType.MESSAGE.viewType
override val layoutId: Int
get() = R.layout.item_message
}
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
data class ReactionViewModel( data class ReactionUiModel(
val messageId: String, val messageId: String,
val shortname: String, val shortname: String,
val unicode: CharSequence, val unicode: CharSequence,
......
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.core.model.ChatRoomRole import chat.rocket.core.model.ChatRoomRole
data class RoomViewModel( data class RoomUiModel(
val roles: List<ChatRoomRole>, val roles: List<ChatRoomRole>,
val isBroadcast: Boolean = false, val isBroadcast: Boolean = false,
val isRoom: Boolean = false val isRoom: Boolean = false
......
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import DateTimeHelper import DateTimeHelper
import android.content.Context import android.content.Context
...@@ -30,7 +30,6 @@ import chat.rocket.android.widget.emoji.EmojiParser ...@@ -30,7 +30,6 @@ import chat.rocket.android.widget.emoji.EmojiParser
import chat.rocket.core.model.ChatRoom import chat.rocket.core.model.ChatRoom
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import chat.rocket.core.model.MessageType import chat.rocket.core.model.MessageType
import chat.rocket.core.model.Value
import chat.rocket.core.model.attachment.Attachment import chat.rocket.core.model.attachment.Attachment
import chat.rocket.core.model.attachment.AudioAttachment import chat.rocket.core.model.attachment.AudioAttachment
import chat.rocket.core.model.attachment.AuthorAttachment import chat.rocket.core.model.attachment.AuthorAttachment
...@@ -49,7 +48,7 @@ import java.security.InvalidParameterException ...@@ -49,7 +48,7 @@ import java.security.InvalidParameterException
import javax.inject.Inject import javax.inject.Inject
@PerFragment @PerFragment
class ViewModelMapper @Inject constructor( class UiModelMapper @Inject constructor(
private val context: Context, private val context: Context,
private val parser: MessageParser, private val parser: MessageParser,
private val roomsInteractor: ChatRoomsInteractor, private val roomsInteractor: ChatRoomsInteractor,
...@@ -69,23 +68,23 @@ class ViewModelMapper @Inject constructor( ...@@ -69,23 +68,23 @@ class ViewModelMapper @Inject constructor(
suspend fun map( suspend fun map(
message: Message, message: Message,
roomViewModel: RoomViewModel = RoomViewModel(roles = emptyList(), isBroadcast = true) roomUiModel: RoomUiModel = RoomUiModel(roles = emptyList(), isBroadcast = true)
): List<BaseViewModel<*>> { ): List<BaseUiModel<*>> {
return translate(message, roomViewModel) return translate(message, roomUiModel)
} }
suspend fun map( suspend fun map(
messages: List<Message>, messages: List<Message>,
roomViewModel: RoomViewModel = RoomViewModel(roles = emptyList(), isBroadcast = true), roomUiModel: RoomUiModel = RoomUiModel(roles = emptyList(), isBroadcast = true),
asNotReversed: Boolean = false asNotReversed: Boolean = false
): List<BaseViewModel<*>> = ): List<BaseUiModel<*>> =
withContext(CommonPool) { withContext(CommonPool) {
val list = ArrayList<BaseViewModel<*>>(messages.size) val list = ArrayList<BaseUiModel<*>>(messages.size)
messages.forEach { messages.forEach {
list.addAll( list.addAll(
if (asNotReversed) translateAsNotReversed(it, roomViewModel) if (asNotReversed) translateAsNotReversed(it, roomUiModel)
else translate(it, roomViewModel) else translate(it, roomUiModel)
) )
} }
return@withContext list return@withContext list
...@@ -93,10 +92,10 @@ class ViewModelMapper @Inject constructor( ...@@ -93,10 +92,10 @@ class ViewModelMapper @Inject constructor(
private suspend fun translate( private suspend fun translate(
message: Message, message: Message,
roomViewModel: RoomViewModel roomUiModel: RoomUiModel
): List<BaseViewModel<*>> = ): List<BaseUiModel<*>> =
withContext(CommonPool) { withContext(CommonPool) {
val list = ArrayList<BaseViewModel<*>>() val list = ArrayList<BaseUiModel<*>>()
message.urls?.forEach { message.urls?.forEach {
val url = mapUrl(message, it) val url = mapUrl(message, it)
...@@ -120,11 +119,11 @@ class ViewModelMapper @Inject constructor( ...@@ -120,11 +119,11 @@ class ViewModelMapper @Inject constructor(
list[i].nextDownStreamMessage = next list[i].nextDownStreamMessage = next
} }
if (isBroadcastReplyAvailable(roomViewModel, message)) { if (isBroadcastReplyAvailable(roomUiModel, message)) {
roomsInteractor.getById(currentServer, message.roomId)?.let { chatRoom -> roomsInteractor.getById(currentServer, message.roomId)?.let { chatRoom ->
val replyViewModel = mapMessageReply(message, chatRoom) val replyUiModel = mapMessageReply(message, chatRoom)
list.first().nextDownStreamMessage = replyViewModel list.first().nextDownStreamMessage = replyUiModel
list.add(0, replyViewModel) list.add(0, replyUiModel)
} }
} }
...@@ -133,10 +132,10 @@ class ViewModelMapper @Inject constructor( ...@@ -133,10 +132,10 @@ class ViewModelMapper @Inject constructor(
private suspend fun translateAsNotReversed( private suspend fun translateAsNotReversed(
message: Message, message: Message,
roomViewModel: RoomViewModel roomUiModel: RoomUiModel
): List<BaseViewModel<*>> = ): List<BaseUiModel<*>> =
withContext(CommonPool) { withContext(CommonPool) {
val list = ArrayList<BaseViewModel<*>>() val list = ArrayList<BaseUiModel<*>>()
mapMessage(message).let { mapMessage(message).let {
if (list.isNotEmpty()) { if (list.isNotEmpty()) {
...@@ -164,11 +163,11 @@ class ViewModelMapper @Inject constructor( ...@@ -164,11 +163,11 @@ class ViewModelMapper @Inject constructor(
list[i].nextDownStreamMessage = next list[i].nextDownStreamMessage = next
} }
if (isBroadcastReplyAvailable(roomViewModel, message)) { if (isBroadcastReplyAvailable(roomUiModel, message)) {
roomsInteractor.getById(currentServer, message.roomId)?.let { chatRoom -> roomsInteractor.getById(currentServer, message.roomId)?.let { chatRoom ->
val replyViewModel = mapMessageReply(message, chatRoom) val replyUiModel = mapMessageReply(message, chatRoom)
list.first().nextDownStreamMessage = replyViewModel list.first().nextDownStreamMessage = replyUiModel
list.add(0, replyViewModel) list.add(0, replyUiModel)
} }
} }
...@@ -181,19 +180,19 @@ class ViewModelMapper @Inject constructor( ...@@ -181,19 +180,19 @@ class ViewModelMapper @Inject constructor(
return@withContext list return@withContext list
} }
private fun isBroadcastReplyAvailable(roomViewModel: RoomViewModel, message: Message): Boolean { private fun isBroadcastReplyAvailable(roomUiModel: RoomUiModel, message: Message): Boolean {
val senderUsername = message.sender?.username val senderUsername = message.sender?.username
return roomViewModel.isRoom && roomViewModel.isBroadcast && return roomUiModel.isRoom && roomUiModel.isBroadcast &&
!message.isSystemMessage() && !message.isSystemMessage() &&
senderUsername != currentUsername senderUsername != currentUsername
} }
private fun mapMessageReply(message: Message, chatRoom: ChatRoom): MessageReplyViewModel { private fun mapMessageReply(message: Message, chatRoom: ChatRoom): MessageReplyUiModel {
val name = message.sender?.name val name = message.sender?.name
val roomName = val roomName =
if (settings.useRealName() && name != null) name else message.sender?.username ?: "" if (settings.useRealName() && name != null) name else message.sender?.username ?: ""
val permalink = messageHelper.createPermalink(message, chatRoom) val permalink = messageHelper.createPermalink(message, chatRoom)
return MessageReplyViewModel( return MessageReplyUiModel(
messageId = message.id, messageId = message.id,
isTemporary = false, isTemporary = false,
reactions = emptyList(), reactions = emptyList(),
...@@ -204,7 +203,7 @@ class ViewModelMapper @Inject constructor( ...@@ -204,7 +203,7 @@ class ViewModelMapper @Inject constructor(
) )
} }
private fun mapUrl(message: Message, url: Url): BaseViewModel<*>? { private fun mapUrl(message: Message, url: Url): BaseUiModel<*>? {
if (url.ignoreParse || url.meta == null) return null if (url.ignoreParse || url.meta == null) return null
val hostname = url.parsedUrl?.hostname ?: "" val hostname = url.parsedUrl?.hostname ?: ""
...@@ -212,11 +211,11 @@ class ViewModelMapper @Inject constructor( ...@@ -212,11 +211,11 @@ class ViewModelMapper @Inject constructor(
val title = url.meta?.title val title = url.meta?.title
val description = url.meta?.description val description = url.meta?.description
return UrlPreviewViewModel(message, url, message.id, title, hostname, description, thumb, return UrlPreviewUiModel(message, url, message.id, title, hostname, description, thumb,
getReactions(message), preview = message.copy(message = url.url)) getReactions(message), preview = message.copy(message = url.url))
} }
private fun mapAttachment(message: Message, attachment: Attachment): BaseViewModel<*>? { private fun mapAttachment(message: Message, attachment: Attachment): BaseUiModel<*>? {
return when (attachment) { return when (attachment) {
is FileAttachment -> mapFileAttachment(message, attachment) is FileAttachment -> mapFileAttachment(message, attachment)
is MessageAttachment -> mapMessageAttachment(message, attachment) is MessageAttachment -> mapMessageAttachment(message, attachment)
...@@ -226,19 +225,19 @@ class ViewModelMapper @Inject constructor( ...@@ -226,19 +225,19 @@ class ViewModelMapper @Inject constructor(
} }
} }
private fun mapColorAttachment(message: Message, attachment: ColorAttachment): BaseViewModel<*>? { private fun mapColorAttachment(message: Message, attachment: ColorAttachment): BaseUiModel<*>? {
return with(attachment) { return with(attachment) {
val content = stripMessageQuotes(message) val content = stripMessageQuotes(message)
val id = attachmentId(message, attachment) val id = attachmentId(message, attachment)
ColorAttachmentViewModel(attachmentUrl = url, id = id, color = color.color, ColorAttachmentUiModel(attachmentUrl = url, id = id, color = color.color,
text = text, message = message, rawData = attachment, text = text, message = message, rawData = attachment,
messageId = message.id, reactions = getReactions(message), messageId = message.id, reactions = getReactions(message),
preview = message.copy(message = content.message)) preview = message.copy(message = content.message))
} }
} }
private fun mapAuthorAttachment(message: Message, attachment: AuthorAttachment): AuthorAttachmentViewModel { private fun mapAuthorAttachment(message: Message, attachment: AuthorAttachment): AuthorAttachmentUiModel {
return with(attachment) { return with(attachment) {
val content = stripMessageQuotes(message) val content = stripMessageQuotes(message)
...@@ -259,14 +258,14 @@ class ViewModelMapper @Inject constructor( ...@@ -259,14 +258,14 @@ class ViewModelMapper @Inject constructor(
} }
val id = attachmentId(message, attachment) val id = attachmentId(message, attachment)
AuthorAttachmentViewModel(attachmentUrl = url, id = id, name = authorName, AuthorAttachmentUiModel(attachmentUrl = url, id = id, name = authorName,
icon = authorIcon, fields = fieldsText, message = message, rawData = attachment, icon = authorIcon, fields = fieldsText, message = message, rawData = attachment,
messageId = message.id, reactions = getReactions(message), messageId = message.id, reactions = getReactions(message),
preview = message.copy(message = content.message)) preview = message.copy(message = content.message))
} }
} }
private fun mapMessageAttachment(message: Message, attachment: MessageAttachment): MessageAttachmentViewModel { private fun mapMessageAttachment(message: Message, attachment: MessageAttachment): MessageAttachmentUiModel {
val attachmentAuthor = attachment.author val attachmentAuthor = attachment.author
val time = attachment.timestamp?.let { getTime(it) } val time = attachment.timestamp?.let { getTime(it) }
val attachmentText = when (attachment.attachments.orEmpty().firstOrNull()) { val attachmentText = when (attachment.attachments.orEmpty().firstOrNull()) {
...@@ -277,27 +276,27 @@ class ViewModelMapper @Inject constructor( ...@@ -277,27 +276,27 @@ class ViewModelMapper @Inject constructor(
else -> attachment.text ?: "" else -> attachment.text ?: ""
} }
val content = stripMessageQuotes(message) val content = stripMessageQuotes(message)
return MessageAttachmentViewModel(message = content, rawData = message, return MessageAttachmentUiModel(message = content, rawData = message,
messageId = message.id, time = time, senderName = attachmentAuthor, messageId = message.id, time = time, senderName = attachmentAuthor,
content = attachmentText, isPinned = message.pinned, reactions = getReactions(message), content = attachmentText, isPinned = message.pinned, reactions = getReactions(message),
preview = message.copy(message = content.message)) preview = message.copy(message = content.message))
} }
private fun mapFileAttachment(message: Message, attachment: FileAttachment): BaseViewModel<*>? { private fun mapFileAttachment(message: Message, attachment: FileAttachment): BaseUiModel<*>? {
val attachmentUrl = attachmentUrl(attachment) val attachmentUrl = attachmentUrl(attachment)
val attachmentTitle = attachmentTitle(attachment) val attachmentTitle = attachmentTitle(attachment)
val id = attachmentId(message, attachment) val id = attachmentId(message, attachment)
return when (attachment) { return when (attachment) {
is ImageAttachment -> ImageAttachmentViewModel(message, attachment, message.id, is ImageAttachment -> ImageAttachmentUiModel(message, attachment, message.id,
attachmentUrl, attachmentTitle, id, getReactions(message), attachmentUrl, attachmentTitle, id, getReactions(message),
preview = message.copy(message = context.getString(R.string.msg_preview_photo))) preview = message.copy(message = context.getString(R.string.msg_preview_photo)))
is VideoAttachment -> VideoAttachmentViewModel(message, attachment, message.id, is VideoAttachment -> VideoAttachmentUiModel(message, attachment, message.id,
attachmentUrl, attachmentTitle, id, getReactions(message), attachmentUrl, attachmentTitle, id, getReactions(message),
preview = message.copy(message = context.getString(R.string.msg_preview_video))) preview = message.copy(message = context.getString(R.string.msg_preview_video)))
is AudioAttachment -> AudioAttachmentViewModel(message, attachment, message.id, is AudioAttachment -> AudioAttachmentUiModel(message, attachment, message.id,
attachmentUrl, attachmentTitle, id, getReactions(message), attachmentUrl, attachmentTitle, id, getReactions(message),
preview = message.copy(message = context.getString(R.string.msg_preview_audio))) preview = message.copy(message = context.getString(R.string.msg_preview_audio)))
is GenericFileAttachment -> GenericFileAttachmentViewModel(message, attachment, is GenericFileAttachment -> GenericFileAttachmentUiModel(message, attachment,
message.id, attachmentUrl, attachmentTitle, id, getReactions(message), message.id, attachmentUrl, attachmentTitle, id, getReactions(message),
preview = message.copy(message = context.getString(R.string.msg_preview_file))) preview = message.copy(message = context.getString(R.string.msg_preview_file)))
else -> null else -> null
...@@ -339,7 +338,7 @@ class ViewModelMapper @Inject constructor( ...@@ -339,7 +338,7 @@ class ViewModelMapper @Inject constructor(
} }
} }
private suspend fun mapMessage(message: Message): MessageViewModel = withContext(CommonPool) { private suspend fun mapMessage(message: Message): MessageUiModel = withContext(CommonPool) {
val sender = getSenderName(message) val sender = getSenderName(message)
val time = getTime(message.timestamp) val time = getTime(message.timestamp)
val avatar = getUserAvatar(message) val avatar = getUserAvatar(message)
...@@ -347,7 +346,7 @@ class ViewModelMapper @Inject constructor( ...@@ -347,7 +346,7 @@ class ViewModelMapper @Inject constructor(
val isTemp = message.isTemporary ?: false val isTemp = message.isTemporary ?: false
val content = getContent(stripMessageQuotes(message)) val content = getContent(stripMessageQuotes(message))
MessageViewModel(message = stripMessageQuotes(message), rawData = message, MessageUiModel(message = stripMessageQuotes(message), rawData = message,
messageId = message.id, avatar = avatar!!, time = time, senderName = sender, messageId = message.id, avatar = avatar!!, time = time, senderName = sender,
content = content, isPinned = message.pinned, reactions = getReactions(message), content = content, isPinned = message.pinned, reactions = getReactions(message),
isFirstUnread = false, preview = preview, isTemporary = isTemp) isFirstUnread = false, preview = preview, isTemporary = isTemp)
...@@ -360,14 +359,14 @@ class ViewModelMapper @Inject constructor( ...@@ -360,14 +359,14 @@ class ViewModelMapper @Inject constructor(
} }
} }
private fun getReactions(message: Message): List<ReactionViewModel> { private fun getReactions(message: Message): List<ReactionUiModel> {
val reactions = message.reactions?.let { val reactions = message.reactions?.let {
val list = mutableListOf<ReactionViewModel>() val list = mutableListOf<ReactionUiModel>()
it.getShortNames().forEach { shortname -> it.getShortNames().forEach { shortname ->
val usernames = it.getUsernames(shortname) ?: emptyList() val usernames = it.getUsernames(shortname) ?: emptyList()
val count = usernames.size val count = usernames.size
list.add( list.add(
ReactionViewModel(messageId = message.id, ReactionUiModel(messageId = message.id,
shortname = shortname, shortname = shortname,
unicode = EmojiParser.parse(shortname), unicode = EmojiParser.parse(shortname),
count = count, count = count,
......
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import chat.rocket.core.model.url.Url import chat.rocket.core.model.url.Url
data class UrlPreviewViewModel( data class UrlPreviewUiModel(
override val message: Message, override val message: Message,
override val rawData: Url, override val rawData: Url,
override val messageId: String, override val messageId: String,
...@@ -12,13 +12,13 @@ data class UrlPreviewViewModel( ...@@ -12,13 +12,13 @@ data class UrlPreviewViewModel(
val hostname: String, val hostname: String,
val description: CharSequence?, val description: CharSequence?,
val thumbUrl: String?, val thumbUrl: String?,
override var reactions: List<ReactionViewModel>, override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseViewModel<*>? = null, override var nextDownStreamMessage: BaseUiModel<*>? = null,
override var preview: Message? = null, override var preview: Message? = null,
override var isTemporary: Boolean = false override var isTemporary: Boolean = false
) : BaseViewModel<Url> { ) : BaseUiModel<Url> {
override val viewType: Int override val viewType: Int
get() = BaseViewModel.ViewType.URL_PREVIEW.viewType get() = BaseUiModel.ViewType.URL_PREVIEW.viewType
override val layoutId: Int override val layoutId: Int
get() = R.layout.message_url_preview get() = R.layout.message_url_preview
} }
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel package chat.rocket.android.chatroom.uimodel
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import chat.rocket.core.model.attachment.VideoAttachment import chat.rocket.core.model.attachment.VideoAttachment
data class VideoAttachmentViewModel( data class VideoAttachmentUiModel(
override val message: Message, override val message: Message,
override val rawData: VideoAttachment, override val rawData: VideoAttachment,
override val messageId: String, override val messageId: String,
override val attachmentUrl: String, override val attachmentUrl: String,
override val attachmentTitle: CharSequence, override val attachmentTitle: CharSequence,
override val id: Long, override val id: Long,
override var reactions: List<ReactionViewModel>, override var reactions: List<ReactionUiModel>,
override var nextDownStreamMessage: BaseViewModel<*>? = null, override var nextDownStreamMessage: BaseUiModel<*>? = null,
override var preview: Message? = null, override var preview: Message? = null,
override var isTemporary: Boolean = false override var isTemporary: Boolean = false
) : BaseFileAttachmentViewModel<VideoAttachment> { ) : BaseFileAttachmentUiModel<VideoAttachment> {
override val viewType: Int override val viewType: Int
get() = BaseViewModel.ViewType.VIDEO_ATTACHMENT.viewType get() = BaseUiModel.ViewType.VIDEO_ATTACHMENT.viewType
override val layoutId: Int override val layoutId: Int
get() = R.layout.message_attachment get() = R.layout.message_attachment
} }
\ No newline at end of file
package chat.rocket.android.chatroom.uimodel.suggestion
import chat.rocket.android.widget.autocompletion.model.SuggestionModel
class ChatRoomSuggestionUiModel(text: String,
val fullName: String,
val name: String,
searchList: List<String>) : SuggestionModel(text, searchList, false) {
}
\ No newline at end of file
package chat.rocket.android.chatroom.uimodel.suggestion
import chat.rocket.android.widget.autocompletion.model.SuggestionModel
class CommandSuggestionUiModel(text: String,
val description: String,
searchList: List<String>) : SuggestionModel(text, searchList)
\ No newline at end of file
package chat.rocket.android.chatroom.uimodel.suggestion
import chat.rocket.android.widget.autocompletion.model.SuggestionModel
import chat.rocket.common.model.UserStatus
class PeopleSuggestionUiModel(val imageUri: String?,
text: String,
val username: String,
val name: String,
val status: UserStatus?,
pinned: Boolean = false,
searchList: List<String>) : SuggestionModel(text, searchList, pinned) {
override fun toString(): String {
return "PeopleSuggestionUiModel(imageUri='$imageUri', username='$username', name='$name', status=$status, pinned=$pinned)"
}
}
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel
interface BaseAttachmentViewModel<out T> : BaseViewModel<T> {
val attachmentUrl: String
}
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel
import chat.rocket.android.R
import chat.rocket.core.model.Message
import chat.rocket.core.model.attachment.ColorAttachment
data class ColorAttachmentViewModel(
override val attachmentUrl: String,
val id: Long,
val color: Int,
val text: CharSequence,
override val message: Message,
override val rawData: ColorAttachment,
override val messageId: String,
override var reactions: List<ReactionViewModel>,
override var nextDownStreamMessage: BaseViewModel<*>? = null,
override var preview: Message? = null,
override var isTemporary: Boolean = false
) : BaseAttachmentViewModel<ColorAttachment> {
override val viewType: Int
get() = BaseViewModel.ViewType.COLOR_ATTACHMENT.viewType
override val layoutId: Int
get() = R.layout.item_color_attachment
}
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel
import chat.rocket.android.R
import chat.rocket.core.model.Message
data class MessageViewModel(
override val message: Message,
override val rawData: Message,
override val messageId: String,
override val avatar: String,
override val time: CharSequence,
override val senderName: CharSequence,
override val content: CharSequence,
override val isPinned: Boolean,
override var reactions: List<ReactionViewModel>,
override var nextDownStreamMessage: BaseViewModel<*>? = null,
override var preview: Message? = null,
var isFirstUnread: Boolean,
override var isTemporary: Boolean = false
) : BaseMessageViewModel<Message> {
override val viewType: Int
get() = BaseViewModel.ViewType.MESSAGE.viewType
override val layoutId: Int
get() = R.layout.item_message
}
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel.suggestion
import chat.rocket.android.widget.autocompletion.model.SuggestionModel
class ChatRoomSuggestionViewModel(text: String,
val fullName: String,
val name: String,
searchList: List<String>) : SuggestionModel(text, searchList, false) {
}
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel.suggestion
import chat.rocket.android.widget.autocompletion.model.SuggestionModel
class CommandSuggestionViewModel(text: String,
val description: String,
searchList: List<String>) : SuggestionModel(text, searchList)
\ No newline at end of file
package chat.rocket.android.chatroom.viewmodel.suggestion
import chat.rocket.android.widget.autocompletion.model.SuggestionModel
import chat.rocket.common.model.UserStatus
class PeopleSuggestionViewModel(val imageUri: String?,
text: String,
val username: String,
val name: String,
val status: UserStatus?,
pinned: Boolean = false,
searchList: List<String>) : SuggestionModel(text, searchList, pinned) {
override fun toString(): String {
return "PeopleSuggestionViewModel(imageUri='$imageUri', username='$username', name='$name', status=$status, pinned=$pinned)"
}
}
\ No newline at end of file
package chat.rocket.android.chatrooms.adapter package chat.rocket.android.chatrooms.adapter
import chat.rocket.android.chatrooms.adapter.model.Room import chat.rocket.android.chatrooms.adapter.model.RoomUiModel
data class RoomItemHolder(override val data: Room) : ItemHolder<Room> data class RoomItemHolder(override val data: RoomUiModel) : ItemHolder<RoomUiModel>
\ No newline at end of file \ No newline at end of file
...@@ -6,7 +6,7 @@ import androidx.core.content.ContextCompat ...@@ -6,7 +6,7 @@ import androidx.core.content.ContextCompat
import androidx.core.text.bold import androidx.core.text.bold
import androidx.core.text.color import androidx.core.text.color
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatrooms.adapter.model.Room import chat.rocket.android.chatrooms.adapter.model.RoomUiModel
import chat.rocket.android.db.model.ChatRoom import chat.rocket.android.db.model.ChatRoom
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.infrastructure.checkIfMyself import chat.rocket.android.infrastructure.checkIfMyself
...@@ -20,11 +20,12 @@ import chat.rocket.common.model.RoomType ...@@ -20,11 +20,12 @@ import chat.rocket.common.model.RoomType
import chat.rocket.common.model.roomTypeOf import chat.rocket.common.model.roomTypeOf
import chat.rocket.common.model.userStatusOf import chat.rocket.common.model.userStatusOf
class RoomMapper(private val context: Application, class RoomUiModelMapper(
private val settings: PublicSettings, private val context: Application,
private val localRepository: LocalRepository, private val settings: PublicSettings,
private val serverUrl: String) { private val localRepository: LocalRepository,
private val serverUrl: String
) {
private val nameUnreadColor = ContextCompat.getColor(context, R.color.colorPrimaryText) private val nameUnreadColor = ContextCompat.getColor(context, R.color.colorPrimaryText)
private val nameColor = ContextCompat.getColor(context, R.color.colorSecondaryText) private val nameColor = ContextCompat.getColor(context, R.color.colorSecondaryText)
private val dateUnreadColor = ContextCompat.getColor(context, R.color.colorAccent) private val dateUnreadColor = ContextCompat.getColor(context, R.color.colorAccent)
...@@ -46,7 +47,7 @@ class RoomMapper(private val context: Application, ...@@ -46,7 +47,7 @@ class RoomMapper(private val context: Application,
return list return list
} }
fun map(chatRoom: ChatRoom): Room { fun map(chatRoom: ChatRoom): RoomUiModel {
return with(chatRoom.chatRoom) { return with(chatRoom.chatRoom) {
val isUnread = alert || unread > 0 val isUnread = alert || unread > 0
val type = roomTypeOf(type) val type = roomTypeOf(type)
...@@ -62,7 +63,7 @@ class RoomMapper(private val context: Application, ...@@ -62,7 +63,7 @@ class RoomMapper(private val context: Application,
val lastMessage = mapLastMessage(chatRoom.lastMessageUserName, val lastMessage = mapLastMessage(chatRoom.lastMessageUserName,
chatRoom.lastMessageUserFullName, lastMessageText, isUnread) chatRoom.lastMessageUserFullName, lastMessageText, isUnread)
Room( RoomUiModel(
id = id, id = id,
name = roomName, name = roomName,
type = type, type = type,
......
...@@ -3,7 +3,7 @@ package chat.rocket.android.chatrooms.adapter.model ...@@ -3,7 +3,7 @@ package chat.rocket.android.chatrooms.adapter.model
import chat.rocket.common.model.RoomType import chat.rocket.common.model.RoomType
import chat.rocket.common.model.UserStatus import chat.rocket.common.model.UserStatus
data class Room( data class RoomUiModel(
val id: String, val id: String,
val type: RoomType, val type: RoomType,
val name: CharSequence, val name: CharSequence,
......
...@@ -2,7 +2,7 @@ package chat.rocket.android.chatrooms.di ...@@ -2,7 +2,7 @@ package chat.rocket.android.chatrooms.di
import android.app.Application import android.app.Application
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import chat.rocket.android.chatrooms.adapter.RoomMapper import chat.rocket.android.chatrooms.adapter.RoomUiModelMapper
import chat.rocket.android.chatrooms.domain.FetchChatRoomsInteractor import chat.rocket.android.chatrooms.domain.FetchChatRoomsInteractor
import chat.rocket.android.chatrooms.presentation.ChatRoomsView import chat.rocket.android.chatrooms.presentation.ChatRoomsView
import chat.rocket.android.chatrooms.ui.ChatRoomsFragment import chat.rocket.android.chatrooms.ui.ChatRoomsFragment
...@@ -87,7 +87,7 @@ class ChatRoomsFragmentModule { ...@@ -87,7 +87,7 @@ class ChatRoomsFragmentModule {
fun provideRoomMapper(context: Application, fun provideRoomMapper(context: Application,
repository: SettingsRepository, repository: SettingsRepository,
localRepository: LocalRepository, localRepository: LocalRepository,
@Named("currentServer") serverUrl: String): RoomMapper { @Named("currentServer") serverUrl: String): RoomUiModelMapper {
return RoomMapper(context, repository.get(serverUrl), localRepository, serverUrl) return RoomUiModelMapper(context, repository.get(serverUrl), localRepository, serverUrl)
} }
} }
\ No newline at end of file
...@@ -5,12 +5,11 @@ import androidx.lifecycle.MutableLiveData ...@@ -5,12 +5,11 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Transformations import androidx.lifecycle.Transformations
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import chat.rocket.android.chatrooms.adapter.ItemHolder import chat.rocket.android.chatrooms.adapter.ItemHolder
import chat.rocket.android.chatrooms.adapter.RoomMapper import chat.rocket.android.chatrooms.adapter.RoomUiModelMapper
import chat.rocket.android.chatrooms.domain.FetchChatRoomsInteractor import chat.rocket.android.chatrooms.domain.FetchChatRoomsInteractor
import chat.rocket.android.chatrooms.infrastructure.ChatRoomsRepository import chat.rocket.android.chatrooms.infrastructure.ChatRoomsRepository
import chat.rocket.android.chatrooms.infrastructure.isGrouped import chat.rocket.android.chatrooms.infrastructure.isGrouped
import chat.rocket.android.server.infraestructure.ConnectionManager import chat.rocket.android.server.infraestructure.ConnectionManager
import chat.rocket.android.util.livedata.TransformedLiveData
import chat.rocket.android.util.livedata.transform import chat.rocket.android.util.livedata.transform
import chat.rocket.core.internal.realtime.socket.model.State import chat.rocket.core.internal.realtime.socket.model.State
import kotlinx.coroutines.experimental.launch import kotlinx.coroutines.experimental.launch
...@@ -24,7 +23,7 @@ class ChatRoomsViewModel( ...@@ -24,7 +23,7 @@ class ChatRoomsViewModel(
private val connectionManager: ConnectionManager, private val connectionManager: ConnectionManager,
private val interactor: FetchChatRoomsInteractor, private val interactor: FetchChatRoomsInteractor,
private val repository: ChatRoomsRepository, private val repository: ChatRoomsRepository,
private val mapper: RoomMapper private val mapper: RoomUiModelMapper
) : ViewModel() { ) : ViewModel() {
private val ordering: MutableLiveData<ChatRoomsRepository.Order> = MutableLiveData() private val ordering: MutableLiveData<ChatRoomsRepository.Order> = MutableLiveData()
private val runContext = newSingleThreadContext("chat-rooms-view-model") private val runContext = newSingleThreadContext("chat-rooms-view-model")
......
...@@ -2,7 +2,7 @@ package chat.rocket.android.chatrooms.viewmodel ...@@ -2,7 +2,7 @@ package chat.rocket.android.chatrooms.viewmodel
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import chat.rocket.android.chatrooms.adapter.RoomMapper import chat.rocket.android.chatrooms.adapter.RoomUiModelMapper
import chat.rocket.android.chatrooms.domain.FetchChatRoomsInteractor import chat.rocket.android.chatrooms.domain.FetchChatRoomsInteractor
import chat.rocket.android.chatrooms.infrastructure.ChatRoomsRepository import chat.rocket.android.chatrooms.infrastructure.ChatRoomsRepository
import chat.rocket.android.server.infraestructure.ConnectionManager import chat.rocket.android.server.infraestructure.ConnectionManager
...@@ -12,7 +12,7 @@ class ChatRoomsViewModelFactory @Inject constructor( ...@@ -12,7 +12,7 @@ class ChatRoomsViewModelFactory @Inject constructor(
private val connectionManager: ConnectionManager, private val connectionManager: ConnectionManager,
private val interactor: FetchChatRoomsInteractor, private val interactor: FetchChatRoomsInteractor,
private val repository: ChatRoomsRepository, private val repository: ChatRoomsRepository,
private val mapper: RoomMapper private val mapper: RoomUiModelMapper
) : ViewModelProvider.NewInstanceFactory() { ) : ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
......
package chat.rocket.android.favoritemessages.presentation package chat.rocket.android.favoritemessages.presentation
import chat.rocket.android.chatroom.viewmodel.ViewModelMapper import chat.rocket.android.chatroom.uimodel.UiModelMapper
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.server.domain.ChatRoomsInteractor import chat.rocket.android.server.domain.ChatRoomsInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
...@@ -16,7 +16,7 @@ class FavoriteMessagesPresenter @Inject constructor( ...@@ -16,7 +16,7 @@ class FavoriteMessagesPresenter @Inject constructor(
private val view: FavoriteMessagesView, private val view: FavoriteMessagesView,
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val roomsInteractor: ChatRoomsInteractor, private val roomsInteractor: ChatRoomsInteractor,
private val mapper: ViewModelMapper, private val mapper: UiModelMapper,
val serverInteractor: GetCurrentServerInteractor, val serverInteractor: GetCurrentServerInteractor,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) { ) {
......
package chat.rocket.android.favoritemessages.presentation package chat.rocket.android.favoritemessages.presentation
import chat.rocket.android.chatroom.viewmodel.BaseViewModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
import chat.rocket.android.core.behaviours.LoadingView import chat.rocket.android.core.behaviours.LoadingView
import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.core.behaviours.MessageView
...@@ -11,5 +11,5 @@ interface FavoriteMessagesView : MessageView, LoadingView { ...@@ -11,5 +11,5 @@ interface FavoriteMessagesView : MessageView, LoadingView {
* *
* @param favoriteMessages The list of favorite messages to show. * @param favoriteMessages The list of favorite messages to show.
*/ */
fun showFavoriteMessages(favoriteMessages: List<BaseViewModel<*>>) fun showFavoriteMessages(favoriteMessages: List<BaseUiModel<*>>)
} }
\ No newline at end of file
...@@ -12,7 +12,7 @@ import androidx.recyclerview.widget.RecyclerView ...@@ -12,7 +12,7 @@ import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.adapter.ChatRoomAdapter import chat.rocket.android.chatroom.adapter.ChatRoomAdapter
import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.chatroom.viewmodel.BaseViewModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
import chat.rocket.android.favoritemessages.presentation.FavoriteMessagesPresenter import chat.rocket.android.favoritemessages.presentation.FavoriteMessagesPresenter
import chat.rocket.android.favoritemessages.presentation.FavoriteMessagesView import chat.rocket.android.favoritemessages.presentation.FavoriteMessagesView
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
...@@ -63,7 +63,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView { ...@@ -63,7 +63,7 @@ class FavoriteMessagesFragment : Fragment(), FavoriteMessagesView {
presenter.loadFavoriteMessages(chatRoomId) presenter.loadFavoriteMessages(chatRoomId)
} }
override fun showFavoriteMessages(favoriteMessages: List<BaseViewModel<*>>) { override fun showFavoriteMessages(favoriteMessages: List<BaseUiModel<*>>) {
ui { ui {
if (recycler_view.adapter == null) { if (recycler_view.adapter == null) {
adapter = ChatRoomAdapter(enableActions = false) adapter = ChatRoomAdapter(enableActions = false)
......
...@@ -5,13 +5,13 @@ import android.view.ViewGroup ...@@ -5,13 +5,13 @@ import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.files.viewmodel.FileViewModel import chat.rocket.android.files.uimodel.FileUiModel
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import kotlinx.android.synthetic.main.item_generic_attachment.view.* import kotlinx.android.synthetic.main.item_generic_attachment.view.*
class FilesAdapter(private val listener: (FileViewModel) -> Unit) : class FilesAdapter(private val listener: (FileUiModel) -> Unit) :
RecyclerView.Adapter<FilesAdapter.ViewHolder>() { RecyclerView.Adapter<FilesAdapter.ViewHolder>() {
private var dataSet: List<FileViewModel> = ArrayList() private var dataSet: List<FileUiModel> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FilesAdapter.ViewHolder = override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FilesAdapter.ViewHolder =
ViewHolder(parent.inflate(R.layout.item_generic_attachment)) ViewHolder(parent.inflate(R.layout.item_generic_attachment))
...@@ -21,12 +21,12 @@ class FilesAdapter(private val listener: (FileViewModel) -> Unit) : ...@@ -21,12 +21,12 @@ class FilesAdapter(private val listener: (FileViewModel) -> Unit) :
override fun getItemCount(): Int = dataSet.size override fun getItemCount(): Int = dataSet.size
fun prependData(dataSet: List<FileViewModel>) { fun prependData(dataSet: List<FileUiModel>) {
this.dataSet = dataSet this.dataSet = dataSet
notifyItemRangeInserted(0, dataSet.size) notifyItemRangeInserted(0, dataSet.size)
} }
fun appendData(dataSet: List<FileViewModel>) { fun appendData(dataSet: List<FileUiModel>) {
val previousDataSetSize = this.dataSet.size val previousDataSetSize = this.dataSet.size
this.dataSet += dataSet this.dataSet += dataSet
notifyItemRangeInserted(previousDataSetSize, dataSet.size) notifyItemRangeInserted(previousDataSetSize, dataSet.size)
...@@ -34,15 +34,15 @@ class FilesAdapter(private val listener: (FileViewModel) -> Unit) : ...@@ -34,15 +34,15 @@ class FilesAdapter(private val listener: (FileViewModel) -> Unit) :
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(fileViewModel: FileViewModel, listener: (FileViewModel) -> Unit) { fun bind(fileUiModel: FileUiModel, listener: (FileUiModel) -> Unit) {
with(itemView) { with(itemView) {
when { when {
fileViewModel.isImage -> { fileUiModel.isImage -> {
image_file_thumbnail.setImageURI(fileViewModel.url) image_file_thumbnail.setImageURI(fileUiModel.url)
image_file_media_thumbnail.isVisible = false image_file_media_thumbnail.isVisible = false
image_file_thumbnail.isVisible = true image_file_thumbnail.isVisible = true
} }
fileViewModel.isMedia -> { fileUiModel.isMedia -> {
image_file_media_thumbnail.setImageDrawable( image_file_media_thumbnail.setImageDrawable(
context.resources.getDrawable( context.resources.getDrawable(
R.drawable.ic_play_arrow_black_24dp, null R.drawable.ic_play_arrow_black_24dp, null
...@@ -61,10 +61,10 @@ class FilesAdapter(private val listener: (FileViewModel) -> Unit) : ...@@ -61,10 +61,10 @@ class FilesAdapter(private val listener: (FileViewModel) -> Unit) :
image_file_media_thumbnail.isVisible = true image_file_media_thumbnail.isVisible = true
} }
} }
text_file_name.text = fileViewModel.name text_file_name.text = fileUiModel.name
text_uploader.text = fileViewModel.uploader text_uploader.text = fileUiModel.uploader
text_upload_date.text = fileViewModel.uploadDate text_upload_date.text = fileUiModel.uploadDate
setOnClickListener { listener(fileViewModel) } setOnClickListener { listener(fileUiModel) }
} }
} }
} }
......
...@@ -2,8 +2,8 @@ package chat.rocket.android.files.presentation ...@@ -2,8 +2,8 @@ package chat.rocket.android.files.presentation
import androidx.core.net.toUri import androidx.core.net.toUri
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.files.viewmodel.FileViewModel import chat.rocket.android.files.uimodel.FileUiModel
import chat.rocket.android.files.viewmodel.FileViewModelMapper import chat.rocket.android.files.uimodel.FileUiModelMapper
import chat.rocket.android.server.domain.ChatRoomsInteractor import chat.rocket.android.server.domain.ChatRoomsInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
...@@ -15,12 +15,12 @@ import timber.log.Timber ...@@ -15,12 +15,12 @@ import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
class FilesPresenter @Inject constructor( class FilesPresenter @Inject constructor(
private val view: FilesView, private val view: FilesView,
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val roomsInteractor: ChatRoomsInteractor, private val roomsInteractor: ChatRoomsInteractor,
private val mapper: FileViewModelMapper, private val mapper: FileUiModelMapper,
val serverInteractor: GetCurrentServerInteractor, val serverInteractor: GetCurrentServerInteractor,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) { ) {
private val serverUrl = serverInteractor.get()!! private val serverUrl = serverInteractor.get()!!
private val client = factory.create(serverUrl) private val client = factory.create(serverUrl)
...@@ -37,8 +37,8 @@ class FilesPresenter @Inject constructor( ...@@ -37,8 +37,8 @@ class FilesPresenter @Inject constructor(
view.showLoading() view.showLoading()
roomsInteractor.getById(serverUrl, roomId)?.let { roomsInteractor.getById(serverUrl, roomId)?.let {
val files = client.getFiles(roomId, it.type, offset) val files = client.getFiles(roomId, it.type, offset)
val filesViewModel = mapper.mapToViewModelList(files.result) val filesUiModel = mapper.mapToUiModelList(files.result)
view.showFiles(filesViewModel, files.total) view.showFiles(filesUiModel, files.total)
offset += 1 * 30 offset += 1 * 30
}.ifNull { }.ifNull {
Timber.e("Couldn't find a room with id: $roomId at current server.") Timber.e("Couldn't find a room with id: $roomId at current server.")
...@@ -56,15 +56,15 @@ class FilesPresenter @Inject constructor( ...@@ -56,15 +56,15 @@ class FilesPresenter @Inject constructor(
} }
} }
fun openFile(fileViewModel: FileViewModel) { fun openFile(fileUiModel: FileUiModel) {
when { when {
fileViewModel.isImage -> fileViewModel.url?.let { fileUiModel.isImage -> fileUiModel.url?.let {
view.openImage(it, fileViewModel.name ?: "") view.openImage(it, fileUiModel.name ?: "")
} }
fileViewModel.isMedia -> fileViewModel.url?.let { fileUiModel.isMedia -> fileUiModel.url?.let {
view.playMedia(it) view.playMedia(it)
} }
else -> fileViewModel.url?.let { else -> fileUiModel.url?.let {
view.openDocument(it.toUri()) view.openDocument(it.toUri())
} }
} }
......
...@@ -3,7 +3,7 @@ package chat.rocket.android.files.presentation ...@@ -3,7 +3,7 @@ package chat.rocket.android.files.presentation
import android.net.Uri import android.net.Uri
import chat.rocket.android.core.behaviours.LoadingView import chat.rocket.android.core.behaviours.LoadingView
import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.core.behaviours.MessageView
import chat.rocket.android.files.viewmodel.FileViewModel import chat.rocket.android.files.uimodel.FileUiModel
interface FilesView : MessageView, LoadingView { interface FilesView : MessageView, LoadingView {
...@@ -13,7 +13,7 @@ interface FilesView : MessageView, LoadingView { ...@@ -13,7 +13,7 @@ interface FilesView : MessageView, LoadingView {
* @param dataSet The data set to show. * @param dataSet The data set to show.
* @param total The total number of files. * @param total The total number of files.
*/ */
fun showFiles(dataSet: List<FileViewModel>, total: Long) fun showFiles(dataSet: List<FileUiModel>, total: Long)
/** /**
* Plays a media file (audio/video). * Plays a media file (audio/video).
......
...@@ -15,7 +15,7 @@ import chat.rocket.android.chatroom.ui.ChatRoomActivity ...@@ -15,7 +15,7 @@ import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.files.adapter.FilesAdapter import chat.rocket.android.files.adapter.FilesAdapter
import chat.rocket.android.files.presentation.FilesPresenter import chat.rocket.android.files.presentation.FilesPresenter
import chat.rocket.android.files.presentation.FilesView import chat.rocket.android.files.presentation.FilesView
import chat.rocket.android.files.viewmodel.FileViewModel import chat.rocket.android.files.uimodel.FileUiModel
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.helper.ImageHelper import chat.rocket.android.helper.ImageHelper
import chat.rocket.android.player.PlayerActivity import chat.rocket.android.player.PlayerActivity
...@@ -41,7 +41,7 @@ class FilesFragment : Fragment(), FilesView { ...@@ -41,7 +41,7 @@ class FilesFragment : Fragment(), FilesView {
@Inject @Inject
lateinit var presenter: FilesPresenter lateinit var presenter: FilesPresenter
private val adapter: FilesAdapter = private val adapter: FilesAdapter =
FilesAdapter { fileViewModel -> presenter.openFile(fileViewModel) } FilesAdapter { fileUiModel -> presenter.openFile(fileUiModel) }
private val linearLayoutManager = LinearLayoutManager(context) private val linearLayoutManager = LinearLayoutManager(context)
private lateinit var chatRoomId: String private lateinit var chatRoomId: String
...@@ -69,7 +69,7 @@ class FilesFragment : Fragment(), FilesView { ...@@ -69,7 +69,7 @@ class FilesFragment : Fragment(), FilesView {
presenter.loadFiles(chatRoomId) presenter.loadFiles(chatRoomId)
} }
override fun showFiles(dataSet: List<FileViewModel>, total: Long) { override fun showFiles(dataSet: List<FileUiModel>, total: Long) {
setupToolbar(total) setupToolbar(total)
if (adapter.itemCount == 0) { if (adapter.itemCount == 0) {
adapter.prependData(dataSet) adapter.prependData(dataSet)
......
package chat.rocket.android.files.viewmodel package chat.rocket.android.files.uimodel
import DateTimeHelper import DateTimeHelper
import chat.rocket.android.server.domain.TokenRepository import chat.rocket.android.server.domain.TokenRepository
...@@ -7,7 +7,7 @@ import chat.rocket.android.util.extensions.fileUrl ...@@ -7,7 +7,7 @@ import chat.rocket.android.util.extensions.fileUrl
import chat.rocket.core.model.Value import chat.rocket.core.model.Value
import chat.rocket.core.model.attachment.GenericAttachment import chat.rocket.core.model.attachment.GenericAttachment
class FileViewModel( class FileUiModel(
private val genericAttachment: GenericAttachment, private val genericAttachment: GenericAttachment,
private val settings: Map<String, Value<Any>>, private val settings: Map<String, Value<Any>>,
private val tokenRepository: TokenRepository, private val tokenRepository: TokenRepository,
......
package chat.rocket.android.files.viewmodel package chat.rocket.android.files.uimodel
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.GetSettingsInteractor
...@@ -8,7 +8,7 @@ import chat.rocket.core.model.Value ...@@ -8,7 +8,7 @@ import chat.rocket.core.model.Value
import chat.rocket.core.model.attachment.GenericAttachment import chat.rocket.core.model.attachment.GenericAttachment
import javax.inject.Inject import javax.inject.Inject
class FileViewModelMapper @Inject constructor( class FileUiModelMapper @Inject constructor(
serverInteractor: GetCurrentServerInteractor, serverInteractor: GetCurrentServerInteractor,
getSettingsInteractor: GetSettingsInteractor, getSettingsInteractor: GetSettingsInteractor,
private val tokenRepository: TokenRepository private val tokenRepository: TokenRepository
...@@ -17,7 +17,7 @@ class FileViewModelMapper @Inject constructor( ...@@ -17,7 +17,7 @@ class FileViewModelMapper @Inject constructor(
getSettingsInteractor.get(serverInteractor.get()!!) getSettingsInteractor.get(serverInteractor.get()!!)
private val baseUrl = settings.baseUrl() private val baseUrl = settings.baseUrl()
fun mapToViewModelList(fileList: List<GenericAttachment>): List<FileViewModel> { fun mapToUiModelList(fileList: List<GenericAttachment>): List<FileUiModel> {
return fileList.map { FileViewModel(it, settings, tokenRepository, baseUrl) } return fileList.map { FileUiModel(it, settings, tokenRepository, baseUrl) }
} }
} }
\ No newline at end of file
...@@ -2,8 +2,8 @@ package chat.rocket.android.main.presentation ...@@ -2,8 +2,8 @@ package chat.rocket.android.main.presentation
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.infrastructure.LocalRepository import chat.rocket.android.infrastructure.LocalRepository
import chat.rocket.android.main.viewmodel.NavHeaderViewModel import chat.rocket.android.main.uimodel.NavHeaderUiModel
import chat.rocket.android.main.viewmodel.NavHeaderViewModelMapper import chat.rocket.android.main.uimodel.NavHeaderUiModelMapper
import chat.rocket.android.server.domain.* import chat.rocket.android.server.domain.*
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.server.infraestructure.ConnectionManagerFactory import chat.rocket.android.server.infraestructure.ConnectionManagerFactory
...@@ -28,19 +28,19 @@ import timber.log.Timber ...@@ -28,19 +28,19 @@ import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
class MainPresenter @Inject constructor( class MainPresenter @Inject constructor(
private val view: MainView, private val view: MainView,
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val navigator: MainNavigator, private val navigator: MainNavigator,
private val tokenRepository: TokenRepository, private val tokenRepository: TokenRepository,
private val serverInteractor: GetCurrentServerInteractor, private val serverInteractor: GetCurrentServerInteractor,
private val localRepository: LocalRepository, private val localRepository: LocalRepository,
private val navHeaderMapper: NavHeaderViewModelMapper, private val navHeaderMapper: NavHeaderUiModelMapper,
private val saveAccountInteractor: SaveAccountInteractor, private val saveAccountInteractor: SaveAccountInteractor,
private val getAccountsInteractor: GetAccountsInteractor, private val getAccountsInteractor: GetAccountsInteractor,
private val removeAccountInteractor: RemoveAccountInteractor, private val removeAccountInteractor: RemoveAccountInteractor,
private val factory: RocketChatClientFactory, private val factory: RocketChatClientFactory,
getSettingsInteractor: GetSettingsInteractor, getSettingsInteractor: GetSettingsInteractor,
managerFactory: ConnectionManagerFactory managerFactory: ConnectionManagerFactory
) : CheckServerPresenter(strategy, factory, view = view) { ) : CheckServerPresenter(strategy, factory, view = view) {
private val currentServer = serverInteractor.get()!! private val currentServer = serverInteractor.get()!!
private val manager = managerFactory.create(currentServer) private val manager = managerFactory.create(currentServer)
...@@ -62,7 +62,7 @@ class MainPresenter @Inject constructor( ...@@ -62,7 +62,7 @@ class MainPresenter @Inject constructor(
val me = retryIO("me") { val me = retryIO("me") {
client.me() client.me()
} }
val model = navHeaderMapper.mapToViewModel(me) val model = navHeaderMapper.mapToUiModel(me)
saveAccount(model) saveAccount(model)
view.setupNavHeader(model, getAccountsInteractor.get()) view.setupNavHeader(model, getAccountsInteractor.get())
} catch (ex: Exception) { } catch (ex: Exception) {
...@@ -155,16 +155,16 @@ class MainPresenter @Inject constructor( ...@@ -155,16 +155,16 @@ class MainPresenter @Inject constructor(
} }
} }
private suspend fun saveAccount(viewModel: NavHeaderViewModel) { private suspend fun saveAccount(uiModel: NavHeaderUiModel) {
val icon = settings.favicon()?.let { val icon = settings.favicon()?.let {
currentServer.serverLogoUrl(it) currentServer.serverLogoUrl(it)
} }
val account = Account( val account = Account(
currentServer, currentServer,
icon, icon,
viewModel.serverLogo, uiModel.serverLogo,
viewModel.userDisplayName!!, uiModel.userDisplayName!!,
viewModel.userAvatar uiModel.userAvatar
) )
saveAccountInteractor.save(account) saveAccountInteractor.save(account)
} }
...@@ -191,7 +191,7 @@ class MainPresenter @Inject constructor( ...@@ -191,7 +191,7 @@ class MainPresenter @Inject constructor(
} }
private suspend fun updateMyself(myself: Myself) { private suspend fun updateMyself(myself: Myself) {
val model = navHeaderMapper.mapToViewModel(myself) val model = navHeaderMapper.mapToUiModel(myself)
view.setupNavHeader(model, getAccountsInteractor.get()) view.setupNavHeader(model, getAccountsInteractor.get())
} }
} }
\ No newline at end of file
...@@ -2,7 +2,7 @@ package chat.rocket.android.main.presentation ...@@ -2,7 +2,7 @@ package chat.rocket.android.main.presentation
import chat.rocket.android.authentication.server.presentation.VersionCheckView import chat.rocket.android.authentication.server.presentation.VersionCheckView
import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.core.behaviours.MessageView
import chat.rocket.android.main.viewmodel.NavHeaderViewModel import chat.rocket.android.main.uimodel.NavHeaderUiModel
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import chat.rocket.common.model.UserStatus import chat.rocket.common.model.UserStatus
...@@ -18,10 +18,10 @@ interface MainView : MessageView, VersionCheckView { ...@@ -18,10 +18,10 @@ interface MainView : MessageView, VersionCheckView {
/** /**
* Setups the navigation header. * Setups the navigation header.
* *
* @param viewModel The [NavHeaderViewModel]. * @param uiModel The [NavHeaderUiModel].
* @param accounts The list of accounts. * @param accounts The list of accounts.
*/ */
fun setupNavHeader(viewModel: NavHeaderViewModel, accounts: List<Account>) fun setupNavHeader(uiModel: NavHeaderUiModel, accounts: List<Account>)
fun closeServerSelection() fun closeServerSelection()
......
...@@ -16,7 +16,7 @@ import chat.rocket.android.main.adapter.AccountsAdapter ...@@ -16,7 +16,7 @@ import chat.rocket.android.main.adapter.AccountsAdapter
import chat.rocket.android.main.adapter.Selector import chat.rocket.android.main.adapter.Selector
import chat.rocket.android.main.presentation.MainPresenter import chat.rocket.android.main.presentation.MainPresenter
import chat.rocket.android.main.presentation.MainView import chat.rocket.android.main.presentation.MainView
import chat.rocket.android.main.viewmodel.NavHeaderViewModel import chat.rocket.android.main.uimodel.NavHeaderUiModel
import chat.rocket.android.server.domain.model.Account import chat.rocket.android.server.domain.model.Account
import chat.rocket.android.server.ui.INTENT_CHAT_ROOM_ID import chat.rocket.android.server.ui.INTENT_CHAT_ROOM_ID
import chat.rocket.android.util.extensions.fadeIn import chat.rocket.android.util.extensions.fadeIn
...@@ -26,7 +26,6 @@ import chat.rocket.android.util.extensions.showToast ...@@ -26,7 +26,6 @@ import chat.rocket.android.util.extensions.showToast
import chat.rocket.common.model.UserStatus import chat.rocket.common.model.UserStatus
import com.google.firebase.iid.FirebaseInstanceId import com.google.firebase.iid.FirebaseInstanceId
import com.google.firebase.messaging.FirebaseMessaging import com.google.firebase.messaging.FirebaseMessaging
import com.google.android.gms.common.api.GoogleApiClient
import dagger.android.AndroidInjection import dagger.android.AndroidInjection
import dagger.android.AndroidInjector import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector import dagger.android.DispatchingAndroidInjector
...@@ -117,10 +116,10 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector, ...@@ -117,10 +116,10 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector,
} }
} }
override fun setupNavHeader(viewModel: NavHeaderViewModel, accounts: List<Account>) { override fun setupNavHeader(uiModel: NavHeaderUiModel, accounts: List<Account>) {
Timber.d("Setting up nav header: $viewModel") Timber.d("Setting up nav header: $uiModel")
with(headerLayout) { with(headerLayout) {
with(viewModel) { with(uiModel) {
if (userStatus != null) { if (userStatus != null) {
image_user_status.setImageDrawable( image_user_status.setImageDrawable(
DrawableHelper.getUserStatusDrawable(userStatus, context) DrawableHelper.getUserStatusDrawable(userStatus, context)
...@@ -135,7 +134,7 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector, ...@@ -135,7 +134,7 @@ class MainActivity : AppCompatActivity(), MainView, HasActivityInjector,
if (serverLogo != null) { if (serverLogo != null) {
server_logo.setImageURI(serverLogo) server_logo.setImageURI(serverLogo)
} }
text_server_url.text = viewModel.serverUrl text_server_url.text = uiModel.serverUrl
} }
setupAccountsList(headerLayout, accounts) setupAccountsList(headerLayout, accounts)
} }
......
package chat.rocket.android.main.viewmodel package chat.rocket.android.main.uimodel
import chat.rocket.common.model.UserStatus import chat.rocket.common.model.UserStatus
data class NavHeaderViewModel( data class NavHeaderUiModel(
val userDisplayName: String?, val userDisplayName: String?,
val userStatus: UserStatus?, val userStatus: UserStatus?,
val userAvatar: String?, val userAvatar: String?,
......
package chat.rocket.android.main.viewmodel package chat.rocket.android.main.uimodel
import chat.rocket.android.server.domain.* import chat.rocket.android.server.domain.*
import chat.rocket.android.util.extensions.avatarUrl import chat.rocket.android.util.extensions.avatarUrl
...@@ -6,21 +6,21 @@ import chat.rocket.android.util.extensions.serverLogoUrl ...@@ -6,21 +6,21 @@ import chat.rocket.android.util.extensions.serverLogoUrl
import chat.rocket.core.model.Myself import chat.rocket.core.model.Myself
import javax.inject.Inject import javax.inject.Inject
class NavHeaderViewModelMapper @Inject constructor( class NavHeaderUiModelMapper @Inject constructor(
serverInteractor: GetCurrentServerInteractor, serverInteractor: GetCurrentServerInteractor,
getSettingsInteractor: GetSettingsInteractor getSettingsInteractor: GetSettingsInteractor
) { ) {
private val currentServer = serverInteractor.get()!! private val currentServer = serverInteractor.get()!!
private var settings: PublicSettings = getSettingsInteractor.get(currentServer) private var settings: PublicSettings = getSettingsInteractor.get(currentServer)
fun mapToViewModel(me: Myself): NavHeaderViewModel { fun mapToUiModel(me: Myself): NavHeaderUiModel {
val displayName = mapDisplayName(me) val displayName = mapDisplayName(me)
val status = me.status val status = me.status
val avatar = me.username?.let { currentServer.avatarUrl(it) } val avatar = me.username?.let { currentServer.avatarUrl(it) }
val image = settings.wideTile() ?: settings.faviconLarge() val image = settings.wideTile() ?: settings.faviconLarge()
val logo = image?.let { currentServer.serverLogoUrl(it) } val logo = image?.let { currentServer.serverLogoUrl(it) }
return NavHeaderViewModel(displayName, status, avatar, currentServer, logo) return NavHeaderUiModel(displayName, status, avatar, currentServer, logo)
} }
private fun mapDisplayName(me: Myself): String? { private fun mapDisplayName(me: Myself): String? {
......
...@@ -4,14 +4,14 @@ import androidx.recyclerview.widget.RecyclerView ...@@ -4,14 +4,14 @@ import androidx.recyclerview.widget.RecyclerView
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.members.viewmodel.MemberViewModel import chat.rocket.android.members.uimodel.MemberUiModel
import chat.rocket.android.util.extensions.content import chat.rocket.android.util.extensions.content
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import kotlinx.android.synthetic.main.avatar.view.* import kotlinx.android.synthetic.main.avatar.view.*
import kotlinx.android.synthetic.main.item_member.view.* import kotlinx.android.synthetic.main.item_member.view.*
class MembersAdapter(private val listener: (MemberViewModel) -> Unit) : RecyclerView.Adapter<MembersAdapter.ViewHolder>() { class MembersAdapter(private val listener: (MemberUiModel) -> Unit) : RecyclerView.Adapter<MembersAdapter.ViewHolder>() {
private var dataSet: List<MemberViewModel> = ArrayList() private var dataSet: List<MemberUiModel> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MembersAdapter.ViewHolder = ViewHolder(parent.inflate(R.layout.item_member)) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MembersAdapter.ViewHolder = ViewHolder(parent.inflate(R.layout.item_member))
...@@ -19,12 +19,12 @@ class MembersAdapter(private val listener: (MemberViewModel) -> Unit) : Recycler ...@@ -19,12 +19,12 @@ class MembersAdapter(private val listener: (MemberViewModel) -> Unit) : Recycler
override fun getItemCount(): Int = dataSet.size override fun getItemCount(): Int = dataSet.size
fun prependData(dataSet: List<MemberViewModel>) { fun prependData(dataSet: List<MemberUiModel>) {
this.dataSet = dataSet this.dataSet = dataSet
notifyItemRangeInserted(0, dataSet.size) notifyItemRangeInserted(0, dataSet.size)
} }
fun appendData(dataSet: List<MemberViewModel>) { fun appendData(dataSet: List<MemberUiModel>) {
val previousDataSetSize = this.dataSet.size val previousDataSetSize = this.dataSet.size
this.dataSet += dataSet this.dataSet += dataSet
notifyItemRangeInserted(previousDataSetSize, dataSet.size) notifyItemRangeInserted(previousDataSetSize, dataSet.size)
...@@ -32,11 +32,11 @@ class MembersAdapter(private val listener: (MemberViewModel) -> Unit) : Recycler ...@@ -32,11 +32,11 @@ class MembersAdapter(private val listener: (MemberViewModel) -> Unit) : Recycler
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(memberViewModel: MemberViewModel, listener: (MemberViewModel) -> Unit) = with(itemView) { fun bind(memberUiModel: MemberUiModel, listener: (MemberUiModel) -> Unit) = with(itemView) {
image_avatar.setImageURI(memberViewModel.avatarUri) image_avatar.setImageURI(memberUiModel.avatarUri)
text_member.content = memberViewModel.displayName text_member.content = memberUiModel.displayName
setOnClickListener { listener(memberViewModel) } setOnClickListener { listener(memberUiModel) }
} }
} }
} }
\ No newline at end of file
package chat.rocket.android.members.presentation package chat.rocket.android.members.presentation
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.members.viewmodel.MemberViewModel import chat.rocket.android.members.uimodel.MemberUiModel
import chat.rocket.android.members.viewmodel.MemberViewModelMapper import chat.rocket.android.members.uimodel.MemberUiModelMapper
import chat.rocket.android.server.domain.ChatRoomsInteractor import chat.rocket.android.server.domain.ChatRoomsInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.infraestructure.RocketChatClientFactory import chat.rocket.android.server.infraestructure.RocketChatClientFactory
...@@ -19,7 +19,7 @@ class MembersPresenter @Inject constructor( ...@@ -19,7 +19,7 @@ class MembersPresenter @Inject constructor(
private val navigator: MembersNavigator, private val navigator: MembersNavigator,
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val roomsInteractor: ChatRoomsInteractor, private val roomsInteractor: ChatRoomsInteractor,
private val mapper: MemberViewModelMapper, private val mapper: MemberUiModelMapper,
val serverInteractor: GetCurrentServerInteractor, val serverInteractor: GetCurrentServerInteractor,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) { ) {
...@@ -33,8 +33,8 @@ class MembersPresenter @Inject constructor( ...@@ -33,8 +33,8 @@ class MembersPresenter @Inject constructor(
view.showLoading() view.showLoading()
roomsInteractor.getById(serverUrl, roomId)?.let { roomsInteractor.getById(serverUrl, roomId)?.let {
val members = client.getMembers(it.id, it.type, offset, 60) val members = client.getMembers(it.id, it.type, offset, 60)
val memberViewModels = mapper.mapToViewModelList(members.result) val memberUiModels = mapper.mapToUiModelList(members.result)
view.showMembers(memberViewModels, members.total) view.showMembers(memberUiModels, members.total)
offset += 1 * 60L offset += 1 * 60L
}.ifNull { }.ifNull {
Timber.e("Couldn't find a room with id: $roomId at current server") Timber.e("Couldn't find a room with id: $roomId at current server")
...@@ -51,12 +51,12 @@ class MembersPresenter @Inject constructor( ...@@ -51,12 +51,12 @@ class MembersPresenter @Inject constructor(
} }
} }
fun toMemberDetails(memberViewModel: MemberViewModel) { fun toMemberDetails(memberUiModel: MemberUiModel) {
val avatarUri = memberViewModel.avatarUri.toString() val avatarUri = memberUiModel.avatarUri.toString()
val realName = memberViewModel.realName.toString() val realName = memberUiModel.realName.toString()
val username = "@${memberViewModel.username}" val username = "@${memberUiModel.username}"
val email = memberViewModel.email ?: "" val email = memberUiModel.email ?: ""
val utcOffset = memberViewModel.utcOffset.toString() val utcOffset = memberUiModel.utcOffset.toString()
navigator.toMemberDetails(avatarUri, realName, username, email, utcOffset) navigator.toMemberDetails(avatarUri, realName, username, email, utcOffset)
} }
......
...@@ -2,7 +2,7 @@ package chat.rocket.android.members.presentation ...@@ -2,7 +2,7 @@ package chat.rocket.android.members.presentation
import chat.rocket.android.core.behaviours.LoadingView import chat.rocket.android.core.behaviours.LoadingView
import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.core.behaviours.MessageView
import chat.rocket.android.members.viewmodel.MemberViewModel import chat.rocket.android.members.uimodel.MemberUiModel
interface MembersView: LoadingView, MessageView { interface MembersView: LoadingView, MessageView {
...@@ -12,5 +12,5 @@ interface MembersView: LoadingView, MessageView { ...@@ -12,5 +12,5 @@ interface MembersView: LoadingView, MessageView {
* @param dataSet The data set to show. * @param dataSet The data set to show.
* @param total The total number of members. * @param total The total number of members.
*/ */
fun showMembers(dataSet: List<MemberViewModel>, total: Long) fun showMembers(dataSet: List<MemberUiModel>, total: Long)
} }
\ No newline at end of file
...@@ -2,7 +2,6 @@ package chat.rocket.android.members.ui ...@@ -2,7 +2,6 @@ package chat.rocket.android.members.ui
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater import android.view.LayoutInflater
...@@ -14,7 +13,7 @@ import chat.rocket.android.helper.EndlessRecyclerViewScrollListener ...@@ -14,7 +13,7 @@ import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.members.adapter.MembersAdapter import chat.rocket.android.members.adapter.MembersAdapter
import chat.rocket.android.members.presentation.MembersPresenter import chat.rocket.android.members.presentation.MembersPresenter
import chat.rocket.android.members.presentation.MembersView import chat.rocket.android.members.presentation.MembersView
import chat.rocket.android.members.viewmodel.MemberViewModel import chat.rocket.android.members.uimodel.MemberUiModel
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.setVisible import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.util.extensions.showToast import chat.rocket.android.util.extensions.showToast
...@@ -38,7 +37,7 @@ class MembersFragment : Fragment(), MembersView { ...@@ -38,7 +37,7 @@ class MembersFragment : Fragment(), MembersView {
@Inject @Inject
lateinit var presenter: MembersPresenter lateinit var presenter: MembersPresenter
private val adapter: MembersAdapter = private val adapter: MembersAdapter =
MembersAdapter { memberViewModel -> presenter.toMemberDetails(memberViewModel) } MembersAdapter { memberUiModel -> presenter.toMemberDetails(memberUiModel) }
private val linearLayoutManager = LinearLayoutManager(context) private val linearLayoutManager = LinearLayoutManager(context)
private lateinit var chatRoomId: String private lateinit var chatRoomId: String
...@@ -66,7 +65,7 @@ class MembersFragment : Fragment(), MembersView { ...@@ -66,7 +65,7 @@ class MembersFragment : Fragment(), MembersView {
presenter.loadChatRoomsMembers(chatRoomId) presenter.loadChatRoomsMembers(chatRoomId)
} }
override fun showMembers(dataSet: List<MemberViewModel>, total: Long) { override fun showMembers(dataSet: List<MemberUiModel>, total: Long) {
ui { ui {
setupToolbar(total) setupToolbar(total)
if (adapter.itemCount == 0) { if (adapter.itemCount == 0) {
......
package chat.rocket.android.members.viewmodel package chat.rocket.android.members.uimodel
import chat.rocket.android.server.domain.useRealName import chat.rocket.android.server.domain.useRealName
import chat.rocket.android.util.extensions.avatarUrl import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.common.model.User import chat.rocket.common.model.User
import chat.rocket.core.model.Value import chat.rocket.core.model.Value
class MemberViewModel(private val member: User, private val settings: Map<String, Value<Any>>, private val baseUrl: String?) { class MemberUiModel(private val member: User, private val settings: Map<String, Value<Any>>, private val baseUrl: String?) {
val avatarUri: String? val avatarUri: String?
val displayName: String val displayName: String
val realName: String? val realName: String?
......
package chat.rocket.android.members.viewmodel package chat.rocket.android.members.uimodel
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
import chat.rocket.android.server.domain.GetSettingsInteractor import chat.rocket.android.server.domain.GetSettingsInteractor
...@@ -7,11 +7,11 @@ import chat.rocket.common.model.User ...@@ -7,11 +7,11 @@ import chat.rocket.common.model.User
import chat.rocket.core.model.Value import chat.rocket.core.model.Value
import javax.inject.Inject import javax.inject.Inject
class MemberViewModelMapper @Inject constructor(serverInteractor: GetCurrentServerInteractor, getSettingsInteractor: GetSettingsInteractor) { class MemberUiModelMapper @Inject constructor(serverInteractor: GetCurrentServerInteractor, getSettingsInteractor: GetSettingsInteractor) {
private var settings: Map<String, Value<Any>> = getSettingsInteractor.get(serverInteractor.get()!!) private var settings: Map<String, Value<Any>> = getSettingsInteractor.get(serverInteractor.get()!!)
private val baseUrl = settings.baseUrl() private val baseUrl = settings.baseUrl()
fun mapToViewModelList(memberList: List<User>): List<MemberViewModel> { fun mapToUiModelList(memberList: List<User>): List<MemberUiModel> {
return memberList.map { MemberViewModel(it, settings, baseUrl) } return memberList.map { MemberUiModel(it, settings, baseUrl) }
} }
} }
\ No newline at end of file
package chat.rocket.android.pinnedmessages.presentation package chat.rocket.android.pinnedmessages.presentation
import chat.rocket.android.chatroom.viewmodel.ViewModelMapper import chat.rocket.android.chatroom.uimodel.UiModelMapper
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.server.domain.ChatRoomsInteractor import chat.rocket.android.server.domain.ChatRoomsInteractor
import chat.rocket.android.server.domain.GetCurrentServerInteractor import chat.rocket.android.server.domain.GetCurrentServerInteractor
...@@ -9,7 +9,6 @@ import chat.rocket.android.util.extensions.launchUI ...@@ -9,7 +9,6 @@ import chat.rocket.android.util.extensions.launchUI
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.common.util.ifNull import chat.rocket.common.util.ifNull
import chat.rocket.core.internal.rest.getPinnedMessages import chat.rocket.core.internal.rest.getPinnedMessages
import chat.rocket.core.model.isSystemMessage
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
...@@ -17,7 +16,7 @@ class PinnedMessagesPresenter @Inject constructor( ...@@ -17,7 +16,7 @@ class PinnedMessagesPresenter @Inject constructor(
private val view: PinnedMessagesView, private val view: PinnedMessagesView,
private val strategy: CancelStrategy, private val strategy: CancelStrategy,
private val roomsInteractor: ChatRoomsInteractor, private val roomsInteractor: ChatRoomsInteractor,
private val mapper: ViewModelMapper, private val mapper: UiModelMapper,
val serverInteractor: GetCurrentServerInteractor, val serverInteractor: GetCurrentServerInteractor,
val factory: RocketChatClientFactory val factory: RocketChatClientFactory
) { ) {
......
package chat.rocket.android.pinnedmessages.presentation package chat.rocket.android.pinnedmessages.presentation
import chat.rocket.android.chatroom.viewmodel.BaseViewModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
import chat.rocket.android.core.behaviours.LoadingView import chat.rocket.android.core.behaviours.LoadingView
import chat.rocket.android.core.behaviours.MessageView import chat.rocket.android.core.behaviours.MessageView
...@@ -11,5 +11,5 @@ interface PinnedMessagesView : MessageView, LoadingView { ...@@ -11,5 +11,5 @@ interface PinnedMessagesView : MessageView, LoadingView {
* *
* @param pinnedMessages The list of pinned messages. * @param pinnedMessages The list of pinned messages.
*/ */
fun showPinnedMessages(pinnedMessages: List<BaseViewModel<*>>) fun showPinnedMessages(pinnedMessages: List<BaseUiModel<*>>)
} }
\ No newline at end of file
...@@ -12,7 +12,7 @@ import androidx.core.view.isVisible ...@@ -12,7 +12,7 @@ import androidx.core.view.isVisible
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.chatroom.adapter.ChatRoomAdapter import chat.rocket.android.chatroom.adapter.ChatRoomAdapter
import chat.rocket.android.chatroom.ui.ChatRoomActivity import chat.rocket.android.chatroom.ui.ChatRoomActivity
import chat.rocket.android.chatroom.viewmodel.BaseViewModel import chat.rocket.android.chatroom.uimodel.BaseUiModel
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.pinnedmessages.presentation.PinnedMessagesPresenter import chat.rocket.android.pinnedmessages.presentation.PinnedMessagesPresenter
import chat.rocket.android.pinnedmessages.presentation.PinnedMessagesView import chat.rocket.android.pinnedmessages.presentation.PinnedMessagesView
...@@ -65,7 +65,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView { ...@@ -65,7 +65,7 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
presenter.loadPinnedMessages(chatRoomId) presenter.loadPinnedMessages(chatRoomId)
} }
override fun showPinnedMessages(pinnedMessages: List<BaseViewModel<*>>) { override fun showPinnedMessages(pinnedMessages: List<BaseUiModel<*>>) {
ui { ui {
if (recycler_view_pinned.adapter == null) { if (recycler_view_pinned.adapter == null) {
adapter = ChatRoomAdapter(enableActions = false) adapter = ChatRoomAdapter(enableActions = false)
......
package chat.rocket.android.util
interface DataToDomain<Data, Domain> {
fun translate(data: Data): Domain
}
package chat.rocket.android.util
interface DomainToViewModel<Domain, ViewModel> {
fun translate(domain: Domain): ViewModel
}
...@@ -10,7 +10,7 @@ buildscript { ...@@ -10,7 +10,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.2.0-alpha17' classpath 'com.android.tools.build:gradle:3.2.0-alpha18'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}" classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}"
classpath 'com.google.gms:google-services:3.2.0' classpath 'com.google.gms:google-services:3.2.0'
......
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