ChatRoomsAdapter.kt 6.54 KB
Newer Older
1 2
package chat.rocket.android.chatrooms.ui

3
import DateTimeHelper
4
import DrawableHelper
5
import android.content.Context
6
import android.graphics.drawable.Drawable
7
import android.support.v4.content.ContextCompat
8 9 10 11 12
import android.support.v7.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import chat.rocket.android.R
13
import chat.rocket.android.helper.UrlHelper
14 15
import chat.rocket.android.server.domain.PublicSettings
import chat.rocket.android.server.domain.useRealName
16
import chat.rocket.android.util.extensions.content
17 18 19
import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.setVisible
import chat.rocket.android.util.extensions.textContent
Lucio Maciel's avatar
Lucio Maciel committed
20
import chat.rocket.common.model.RoomType
21 22
import chat.rocket.core.model.ChatRoom
import com.facebook.drawee.view.SimpleDraweeView
23
import kotlinx.android.synthetic.main.avatar.view.*
24
import kotlinx.android.synthetic.main.item_chat.view.*
25
import kotlinx.android.synthetic.main.unread_messages_badge.view.*
26

27
class ChatRoomsAdapter(private val context: Context,
28
                       private val settings: PublicSettings,
29
                       private val listener: (ChatRoom) -> Unit) : RecyclerView.Adapter<ChatRoomsAdapter.ViewHolder>() {
30
    var dataSet: MutableList<ChatRoom> = ArrayList()
31

32
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = ViewHolder(parent.inflate(R.layout.item_chat))
33

34
    override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(dataSet[position])
35

36 37
    override fun getItemCount(): Int = dataSet.size

38 39 40 41
    fun updateRooms(newRooms: List<ChatRoom>)  {
        dataSet.clear()
        dataSet.addAll(newRooms)
    }
42

43 44 45
    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        fun bind(chatRoom: ChatRoom) = with(itemView) {
46
            bindAvatar(chatRoom, image_avatar)
47 48 49 50
            bindName(chatRoom, text_chat_name)
            bindLastMessageDateTime(chatRoom, text_last_message_date_time)
            bindLastMessage(chatRoom, text_last_message)
            bindUnreadMessages(chatRoom, text_total_unread_messages)
51

52
            if (chatRoom.alert || chatRoom.unread > 0) {
53
                text_chat_name.setTextColor(ContextCompat.getColor(context,
Lucio Maciel's avatar
Lucio Maciel committed
54
                        R.color.colorPrimaryText))
55 56 57 58 59 60
                text_last_message_date_time.setTextColor(ContextCompat.getColor(context,
                        R.color.colorAccent))
                text_last_message.setTextColor(ContextCompat.getColor(context,
                        android.R.color.primary_text_light))
            } else {
                text_chat_name.setTextColor(ContextCompat.getColor(context,
Lucio Maciel's avatar
Lucio Maciel committed
61
                        R.color.colorSecondaryText))
62 63 64 65
                text_last_message_date_time.setTextColor(ContextCompat.getColor(context,
                        R.color.colorSecondaryText))
                text_last_message.setTextColor(ContextCompat.getColor(context,
                        R.color.colorSecondaryText))
66 67
            }

68
            setOnClickListener { listener(chatRoom) }
69
        }
70

71
        private fun bindAvatar(chatRoom: ChatRoom, drawee: SimpleDraweeView) {
Lucio Maciel's avatar
Lucio Maciel committed
72
            val avatarId = if (chatRoom.type is RoomType.DirectMessage) chatRoom.name else "@${chatRoom.name}"
73
            drawee.setImageURI(UrlHelper.getAvatarUrl(chatRoom.client.url, avatarId))
74 75 76
        }

        private fun bindName(chatRoom: ChatRoom, textView: TextView) {
77 78
            textView.textContent = chatRoom.name

Lucio Maciel's avatar
Lucio Maciel committed
79
            var drawable = when (chatRoom.type) {
80
                is RoomType.Channel -> {
Lucio Maciel's avatar
Lucio Maciel committed
81
                    DrawableHelper.getDrawableFromId(R.drawable.ic_room_channel, context)
82 83
                }
                is RoomType.PrivateGroup -> {
Lucio Maciel's avatar
Lucio Maciel committed
84
                    DrawableHelper.getDrawableFromId(R.drawable.ic_room_lock, context)
85 86
                }
                is RoomType.DirectMessage -> {
Lucio Maciel's avatar
Lucio Maciel committed
87
                    DrawableHelper.getDrawableFromId(R.drawable.ic_room_dm, context)
88
                }
Lucio Maciel's avatar
Lucio Maciel committed
89
                else -> null
90
            }
91 92

            drawable?.let {
93 94
                val wrappedDrawable = DrawableHelper.wrapDrawable(it)
                val mutableDrawable = wrappedDrawable.mutate()
Lucio Maciel's avatar
Lucio Maciel committed
95 96 97 98 99
                val color = when (chatRoom.alert || chatRoom.unread > 0) {
                    true -> R.color.colorPrimaryText
                    false -> R.color.colorSecondaryText
                }
                DrawableHelper.tintDrawable(mutableDrawable, context, color)
100
                DrawableHelper.compoundDrawable(textView, mutableDrawable)
101
            }
102 103 104 105 106 107
        }

        private fun bindLastMessageDateTime(chatRoom: ChatRoom, textView: TextView) {
            val lastMessage = chatRoom.lastMessage
            if (lastMessage != null) {
                val localDateTime = DateTimeHelper.getLocalDateTime(lastMessage.timestamp)
108
                textView.content = DateTimeHelper.getDate(localDateTime, context)
109
            } else {
110
                textView.content = ""
111 112 113
            }
        }

114 115 116 117 118 119 120 121
        private fun bindLastMessage(chatRoom: ChatRoom, textView: TextView) {
            val lastMessage = chatRoom.lastMessage
            val lastMessageSender = lastMessage?.sender
            if (lastMessage != null && lastMessageSender != null) {
                val message = lastMessage.message
                val senderUsername = lastMessageSender.username
                when (senderUsername) {
                    chatRoom.name -> {
122
                        textView.content = message
123
                    }
124
                // TODO Change to MySelf
125 126 127 128
                //                chatRoom.user?.username -> {
                //                    holder.lastMessage.textContent = context.getString(R.string.msg_you) + ": $message"
                //                }
                    else -> {
129
                        textView.content = "@$senderUsername: $message"
130
                    }
131
                }
132 133
            } else {
                textView.content = ""
134 135 136
            }
        }

137 138 139 140 141
        private fun bindUnreadMessages(chatRoom: ChatRoom, textView: TextView) {
            val totalUnreadMessage = chatRoom.unread
            when {
                totalUnreadMessage in 1..99 -> {
                    textView.textContent = totalUnreadMessage.toString()
142
                    textView.setVisible(true)
143 144 145
                }
                totalUnreadMessage > 99 -> {
                    textView.textContent = context.getString(R.string.msg_more_than_ninety_nine_unread_messages)
146
                    textView.setVisible(true)
147
                }
148
                else -> textView.setVisible(false)
149 150
            }
        }
151 152
    }
}