Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1080e540 authored by Moez Bhatti's avatar Moez Bhatti
Browse files

Correctly use ContainerView with ViewHolder

parent eb9cd592
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import com.moez.QKSMS.common.util.extensions.setVisible
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.subjects.PublishSubject
import io.reactivex.subjects.Subject
import kotlinx.android.synthetic.main.menu_list_item.*
import kotlinx.android.synthetic.main.menu_list_item.view.*
import javax.inject.Inject

@@ -83,11 +84,10 @@ class MenuItemAdapter @Inject constructor(private val context: Context, private

    override fun onBindViewHolder(holder: QkViewHolder, position: Int) {
        val menuItem = getItem(position)
        val view = holder.containerView

        view.title.text = menuItem.title
        view.check.isActivated = (menuItem.actionId == selectedItem)
        view.check.setVisible(selectedItem != null)
        holder.title.text = menuItem.title
        holder.check.isActivated = (menuItem.actionId == selectedItem)
        holder.check.setVisible(selectedItem != null)
    }

    override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
+4 −5
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ import com.moez.QKSMS.common.util.DateFormatter
import com.moez.QKSMS.model.BackupFile
import io.reactivex.subjects.PublishSubject
import io.reactivex.subjects.Subject
import kotlinx.android.synthetic.main.backup_list_item.view.*
import kotlinx.android.synthetic.main.backup_list_item.*
import javax.inject.Inject

class BackupAdapter @Inject constructor(
@@ -50,13 +50,12 @@ class BackupAdapter @Inject constructor(

    override fun onBindViewHolder(holder: QkViewHolder, position: Int) {
        val backup = getItem(position)
        val view = holder.containerView

        val count = backup.messages

        view.title.text = dateFormatter.getDetailedTimestamp(backup.date)
        view.messages.text = context.resources.getQuantityString(R.plurals.backup_message_count, count, count)
        view.size.text = Formatter.formatFileSize(context, backup.size)
        holder.title.text = dateFormatter.getDetailedTimestamp(backup.date)
        holder.messages.text = context.resources.getQuantityString(R.plurals.backup_message_count, count, count)
        holder.size.text = Formatter.formatFileSize(context, backup.size)
    }

}
 No newline at end of file
+10 −10
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.moez.QKSMS.common.util.extensions.resolveThemeColor
import com.moez.QKSMS.model.Conversation
import com.moez.QKSMS.util.Preferences
import io.reactivex.subjects.PublishSubject
import kotlinx.android.synthetic.main.blocked_list_item.*
import kotlinx.android.synthetic.main.blocked_list_item.view.*
import javax.inject.Inject

@@ -69,24 +70,23 @@ class BlockedMessagesAdapter @Inject constructor(

    override fun onBindViewHolder(holder: QkViewHolder, position: Int) {
        val conversation = getItem(position) ?: return
        val view = holder.containerView

        view.isActivated = isSelected(conversation.id)
        holder.containerView.isActivated = isSelected(conversation.id)

        view.avatars.recipients = conversation.recipients
        view.title.collapseEnabled = conversation.recipients.size > 1
        view.title.text = conversation.getTitle()
        view.date.text = dateFormatter.getConversationTimestamp(conversation.date)
        holder.avatars.recipients = conversation.recipients
        holder.title.collapseEnabled = conversation.recipients.size > 1
        holder.title.text = conversation.getTitle()
        holder.date.text = dateFormatter.getConversationTimestamp(conversation.date)

        view.blocker.text = when (conversation.blockingClient) {
        holder.blocker.text = when (conversation.blockingClient) {
            Preferences.BLOCKING_MANAGER_CC -> context.getString(R.string.blocking_manager_call_control_title)
            Preferences.BLOCKING_MANAGER_SIA -> context.getString(R.string.blocking_manager_sia_title)
            else -> null
        }

        view.reason.text = conversation.blockReason
        view.blocker.isVisible = view.blocker.text.isNotEmpty()
        view.reason.isVisible = view.blocker.text.isNotEmpty()
        holder.reason.text = conversation.blockReason
        holder.blocker.isVisible = holder.blocker.text.isNotEmpty()
        holder.reason.isVisible = holder.blocker.text.isNotEmpty()
    }

    override fun getItemViewType(position: Int): Int {
+4 −4
Original line number Diff line number Diff line
@@ -33,7 +33,8 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import io.reactivex.subjects.PublishSubject
import io.reactivex.subjects.Subject
import kotlinx.android.synthetic.main.attachment_contact_list_item.view.*
import kotlinx.android.synthetic.main.attachment_contact_list_item.*
import kotlinx.android.synthetic.main.attachment_image_list_item.*
import kotlinx.android.synthetic.main.attachment_image_list_item.view.*
import javax.inject.Inject

@@ -69,18 +70,17 @@ class AttachmentAdapter @Inject constructor(

    override fun onBindViewHolder(holder: QkViewHolder, position: Int) {
        val attachment = getItem(position)
        val view = holder.containerView

        when (attachment) {
            is Attachment.Image -> Glide.with(context)
                    .load(attachment.getUri())
                    .into(view.thumbnail)
                    .into(holder.thumbnail)

            is Attachment.Contact -> Observable.just(attachment.vCard)
                    .mapNotNull { vCard -> Ezvcard.parse(vCard).first() }
                    .subscribeOn(Schedulers.computation())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe { vcard -> view.name?.text = vcard.formattedName.value }
                    .subscribe { vcard -> holder.name?.text = vcard.formattedName.value }
        }
    }

+31 −26
Original line number Diff line number Diff line
@@ -59,7 +59,15 @@ import com.moez.QKSMS.util.Preferences
import io.reactivex.subjects.PublishSubject
import io.reactivex.subjects.Subject
import io.realm.RealmResults
import kotlinx.android.synthetic.main.message_list_item_in.*
import kotlinx.android.synthetic.main.message_list_item_in.attachments
import kotlinx.android.synthetic.main.message_list_item_in.body
import kotlinx.android.synthetic.main.message_list_item_in.sim
import kotlinx.android.synthetic.main.message_list_item_in.simIndex
import kotlinx.android.synthetic.main.message_list_item_in.status
import kotlinx.android.synthetic.main.message_list_item_in.timestamp
import kotlinx.android.synthetic.main.message_list_item_in.view.*
import kotlinx.android.synthetic.main.message_list_item_out.*
import java.util.*
import java.util.concurrent.TimeUnit
import javax.inject.Inject
@@ -175,11 +183,10 @@ class MessagesAdapter @Inject constructor(
        }
    }

    override fun onBindViewHolder(viewHolder: QkViewHolder, position: Int) {
    override fun onBindViewHolder(holder: QkViewHolder, position: Int) {
        val message = getItem(position) ?: return
        val previous = if (position == 0) null else getItem(position - 1)
        val next = if (position == itemCount - 1) null else getItem(position + 1)
        val view = viewHolder.containerView

        val theme = when (message.isOutgoingMessage()) {
            true -> colors.theme()
@@ -187,10 +194,10 @@ class MessagesAdapter @Inject constructor(
        }

        // Update the selected state
        view.isActivated = isSelected(message.id) || highlight == message.id
        holder.containerView.isActivated = isSelected(message.id) || highlight == message.id

        // Bind the cancel view
        view.findViewById<ProgressBar>(R.id.cancel)?.let { cancel ->
        holder.cancel?.let { cancel ->
            val isCancellable = message.isSending() && message.date > System.currentTimeMillis()
            cancel.setVisible(isCancellable)
            cancel.clicks().subscribe { cancelSending.onNext(message.id) }
@@ -212,31 +219,31 @@ class MessagesAdapter @Inject constructor(
        }

        // Bind the message status
        bindStatus(viewHolder, message, next)
        bindStatus(holder, message, next)

        // Bind the timestamp
        val timeSincePrevious = TimeUnit.MILLISECONDS.toMinutes(message.date - (previous?.date ?: 0))
        val simIndex = subs.takeIf { it.size > 1 }?.indexOfFirst { it.subscriptionId == message.subId } ?: -1

        view.timestamp.text = dateFormatter.getMessageTimestamp(message.date)
        view.simIndex.text = "${simIndex + 1}"
        holder.timestamp.text = dateFormatter.getMessageTimestamp(message.date)
        holder.simIndex.text = "${simIndex + 1}"

        view.timestamp.setVisible(timeSincePrevious >= BubbleUtils.TIMESTAMP_THRESHOLD
        holder.timestamp.setVisible(timeSincePrevious >= BubbleUtils.TIMESTAMP_THRESHOLD
                || message.subId != previous?.subId && simIndex != -1)
        view.sim.setVisible(message.subId != previous?.subId && simIndex != -1)
        view.simIndex.setVisible(message.subId != previous?.subId && simIndex != -1)
        holder.sim.setVisible(message.subId != previous?.subId && simIndex != -1)
        holder.simIndex.setVisible(message.subId != previous?.subId && simIndex != -1)

        // Bind the grouping
        val media = message.parts.filter { !it.isSmil() && !it.isText() }
        view.setPadding(bottom = if (canGroup(message, next)) 0 else 16.dpToPx(context))
        holder.containerView.setPadding(bottom = if (canGroup(message, next)) 0 else 16.dpToPx(context))

        // Bind the avatar and bubble colour
        if (!message.isMe()) {
            view.avatar.setRecipient(contactCache[message.address])
            view.avatar.setVisible(!canGroup(message, next), View.INVISIBLE)
            holder.avatar.setRecipient(contactCache[message.address])
            holder.avatar.setVisible(!canGroup(message, next), View.INVISIBLE)

            view.body.setTextColor(theme.textPrimary)
            view.body.setBackgroundTint(theme.theme)
            holder.body.setTextColor(theme.textPrimary)
            holder.body.setBackgroundTint(theme.theme)
        }

        // Bind the body text
@@ -262,31 +269,29 @@ class MessagesAdapter @Inject constructor(
            }
        }
        val emojiOnly = messageText.isNotBlank() && messageText.matches(EMOJI_REGEX)
        textViewStyler.setTextSize(view.body, when (emojiOnly) {
        textViewStyler.setTextSize(holder.body, when (emojiOnly) {
            true -> TextViewStyler.SIZE_EMOJI
            false -> TextViewStyler.SIZE_PRIMARY
        })

        view.body.text = messageText
        view.body.setVisible(message.isSms() || messageText.isNotBlank())
        view.body.setBackgroundResource(getBubble(
        holder.body.text = messageText
        holder.body.setVisible(message.isSms() || messageText.isNotBlank())
        holder.body.setBackgroundResource(getBubble(
                emojiOnly = emojiOnly,
                canGroupWithPrevious = canGroup(message, previous) || media.isNotEmpty(),
                canGroupWithNext = canGroup(message, next),
                isMe = message.isMe()))

        // Bind the attachments
        val partsAdapter = view.attachments.adapter as PartsAdapter
        val partsAdapter = holder.attachments.adapter as PartsAdapter
        partsAdapter.theme = theme
        partsAdapter.setData(message, previous, next, view)
        partsAdapter.setData(message, previous, next, holder)
    }

    private fun bindStatus(viewHolder: QkViewHolder, message: Message, next: Message?) {
        val view = viewHolder.containerView

    private fun bindStatus(holder: QkViewHolder, message: Message, next: Message?) {
        val age = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis() - message.date)

        view.status.text = when {
        holder.status.text = when {
            message.isSending() -> context.getString(R.string.message_status_sending)
            message.isDelivered() -> context.getString(R.string.message_status_delivered,
                    dateFormatter.getTimestamp(message.dateSent))
@@ -300,7 +305,7 @@ class MessagesAdapter @Inject constructor(
            else -> dateFormatter.getTimestamp(message.date)
        }

        view.status.setVisible(when {
        holder.status.setVisible(when {
            expanded[message.id] == true -> true
            message.isSending() -> true
            message.isFailedMessage() -> true
Loading