Loading presentation/src/main/java/com/moez/QKSMS/common/MenuItemAdapter.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading presentation/src/main/java/com/moez/QKSMS/feature/backup/BackupAdapter.kt +4 −5 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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 presentation/src/main/java/com/moez/QKSMS/feature/blocking/messages/BlockedMessagesAdapter.kt +10 −10 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading presentation/src/main/java/com/moez/QKSMS/feature/compose/AttachmentAdapter.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 } } } Loading presentation/src/main/java/com/moez/QKSMS/feature/compose/MessagesAdapter.kt +31 −26 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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() Loading @@ -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) } Loading @@ -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 Loading @@ -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)) Loading @@ -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 Loading
presentation/src/main/java/com/moez/QKSMS/common/MenuItemAdapter.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading
presentation/src/main/java/com/moez/QKSMS/feature/backup/BackupAdapter.kt +4 −5 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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
presentation/src/main/java/com/moez/QKSMS/feature/blocking/messages/BlockedMessagesAdapter.kt +10 −10 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading
presentation/src/main/java/com/moez/QKSMS/feature/compose/AttachmentAdapter.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 } } } Loading
presentation/src/main/java/com/moez/QKSMS/feature/compose/MessagesAdapter.kt +31 −26 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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() Loading @@ -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) } Loading @@ -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 Loading @@ -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)) Loading @@ -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