diff --git a/presentation/src/main/java/com/moez/QKSMS/common/widget/QkTextView.kt b/presentation/src/main/java/com/moez/QKSMS/common/widget/QkTextView.kt index 36c90900..b8aa9256 100644 --- a/presentation/src/main/java/com/moez/QKSMS/common/widget/QkTextView.kt +++ b/presentation/src/main/java/com/moez/QKSMS/common/widget/QkTextView.kt @@ -30,6 +30,20 @@ open class QkTextView @JvmOverloads constructor(context: Context, attrs: Attribu @Inject lateinit var textViewStyler: TextViewStyler + /** + * Collapse a multiline list of strings into a single line + * + * Ex. + * + * Toronto, New York, Los Angeles, + * Seattle, Portland + * + * Will be converted to + * + * Toronto, New York, Los Angeles, +2 + */ + var collapseEnabled: Boolean = false + init { if (!isInEditMode) { appComponent.inject(this) @@ -39,6 +53,22 @@ open class QkTextView @JvmOverloads constructor(context: Context, attrs: Attribu } } + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + super.onLayout(changed, left, top, right, bottom) + + if (collapseEnabled) { + layout + ?.takeIf { layout -> layout.lineCount > 0 } + ?.let { layout -> layout.getEllipsisCount(layout.lineCount - 1) } + ?.takeIf { ellipsisCount -> ellipsisCount > 0 } + ?.let { ellipsisCount -> + val lastComma = text.dropLast(ellipsisCount).lastIndexOf(',') + val remainingNames = text.drop(lastComma).count { c -> c == ',' } + text = "${text.take(lastComma)}, +$remainingNames" + } + } + } + override fun setTextColor(color: Int) { super.setTextColor(color) setLinkTextColor(color) diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/conversations/ConversationsAdapter.kt b/presentation/src/main/java/com/moez/QKSMS/feature/conversations/ConversationsAdapter.kt index 5413f231..e864cfa9 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/conversations/ConversationsAdapter.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/conversations/ConversationsAdapter.kt @@ -84,6 +84,21 @@ class ConversationsAdapter @Inject constructor( view.isActivated = isSelected(conversation.id) view.avatars.contacts = conversation.recipients + view.title.collapseEnabled = conversation.recipients.size > 1 + + val conversationTitle = conversation.getTitle() + view.title.text = conversationTitle + if (conversation.recipients.size > 1) { + view.title.layout + ?.takeIf { layout -> layout.lineCount > 0 } + ?.let { layout -> layout.getEllipsisCount(layout.lineCount - 1) } + ?.takeIf { ellipsisCount -> ellipsisCount > 0 } + ?.let { ellipsisCount -> + val lastComma = conversationTitle.dropLast(ellipsisCount).lastIndexOf(',') + val remainingNames = conversationTitle.drop(lastComma).count { c -> c == ',' } + view.title.text = "${conversationTitle.take(lastComma)}, +$remainingNames" + } + } view.title.text = conversation.getTitle() view.date.text = dateFormatter.getConversationTimestamp(conversation.date) view.snippet.text = when (conversation.me) { diff --git a/presentation/src/main/res/layout/conversation_list_item.xml b/presentation/src/main/res/layout/conversation_list_item.xml index fbf423c8..1826f85e 100644 --- a/presentation/src/main/res/layout/conversation_list_item.xml +++ b/presentation/src/main/res/layout/conversation_list_item.xml @@ -1,5 +1,4 @@ - -